我正在写一些东西来将工作转发给其他机器(类似于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();
答案 0 :(得分:0)
服务器需要将套接字保留在哈希映射中,如下所示:
if (my $client_socket = $socket->accept()) {
$client_sockets{$client_socket->peerhost . ":" . $client_socket->peerport} = $client_socket;
}
并遍历所有条目以检查新数据或断开请求:
foreach my $key (keys %client_sockets) {
my ($host, $port) = split/:/,$key;
my $socket = $client_sockets{$key};
#handle socket
delete $client_sockets{$key} if $disconnected;
}
您可能想为每个新套接字踢一个工作线程。将线程句柄同样存储在哈希映射中。