【发布时间】:2015-10-06 18:43:21
【问题描述】:
我正在写一些东西来将工作中继到其他机器(类似于 gearman)我这样做是为了学习套接字编程,但我真的很困惑
所需的工作流程: [客户端] -> [服务器] -> [worker1]、[worker2] 等
我计划发送数千个作业(url),所以我认为创建一个新的套接字每个请求都太过分了,我想在服务器和客户端以及服务器和工作人员之间保持活跃的连接。
这是我的实现,但我知道有更好的方法可以做到这一点,我在网上寻找示例但最终决定在这里发布问题
use IO::Socket::INET;
use feature qw(say);
use strict;
my $socket = new IO::Socket::INET (
LocalHost => '0.0.0.0', LocalPort => '7779',
Proto => 'tcp', blocking => 1, Reuse => 1, Listen => 5
) or die $!;
while(1)
{
if(my $client_socket = $socket->accept() ){
say "Client connected: " .$client_socket->peerhost . ":" . $client_socket->peerport;
my $last_msg_time = time;
while(1){ #I WILL MOVE THIS LOOP TO A CHILD PROCESS OR A THREAD
my $data; $client_socket->recv($data,1024);
if($data eq "*DISCONNECT" || time - $last_msg_time > 10){
say "Timeout";
last;
}
if($data){
my $last_msg_time = time;
say "Received: $data";
$client_socket->send("OK!");
}
}
}
}
$socket->close;
客户:
use IO::Socket::INET;
use feature qw(say);
my $socket = new IO::Socket::INET (
PeerHost => '127.0.0.1',PeerPort => '7779',
Proto => 'tcp', blocking => 1
) or die "Cannot connect to the server $!\n";
$socket->send("hello world");
my $response; $socket->recv($response, 1024);
say "received response: $response";
$socket->send("hi again");
$socket->send("*DISCONNECT");
#shutdown($socket, 1);
$socket->close();
【问题讨论】:
标签: perl sockets network-programming