0
我写的东西中继工作到其他机器(类似的Gearman)我这样做,以了解socket编程,但我得到真的很困惑如何保持一个套接字连接开放将消息发送来回
期望中的工作流程: [客户] - > [服务器] - > [worker1],[worker2]等
我打算送作业(URL)的数千所以我想创建一个新的socket每一个请求过度使用,我想保持服务器和客户端以及服务器和工作者之间的活跃连接。
这是我实现,但我知道有一种更好的方式来做到这一点,我到处都找过网找的例子,但最后还是决定张贴在这里的问题
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();