2015-10-05 53 views
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(); 

回答

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; 
} 

你可能想踢一个工作线程为每个新的socket。将线程句柄同样存储在哈希映射中。

相关问题