如何保持套接字连接打开以来来回发送消息

时间:2015-10-05 00:43:29

标签: perl sockets network-programming

我正在写一些东西来将工作转发给其他机器(类似于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();

1 个答案:

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

您可能想为每个新套接字踢一个工作线程。将线程句柄同样存储在哈希映射中。