【问题标题】:How to keep a socket connection open to send messages back and forth如何保持套接字连接打开以来回发送消息
【发布时间】: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


    【解决方案1】:

    服务器需要将套接字保存在哈希映射中,如下所示:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2015-03-25
      • 2012-11-04
      相关资源
      最近更新 更多