多客户全双工Perl插座

时间:2014-09-22 07:29:46

标签: perl sockets serversocket

我在perl中编写了一个多客户端套接字脚本。我可以使用fork与多个客户端建立连接。但在建立新连接后,我只能发送和接收一次。我无法在客户端套接字上进一步读取或写入,以进行扩展对话。

目的:

客户端连接后,它会将其ID发送到服务器。在接收到ID之后,服务器将使用其ID获取客户端文件并将其逐页发送给客户端。由于客户端只能接受有限字节的数据,因此我们无法在单个套接字发送中发送它。所以我需要发送一个1024字节的数据。客户必须承认并再次发送下一页。像这样,我必须为每个客户端同时长时间连接套接字,直到他们都收到整个文件。

代码示例:

use strict;
use warnings;
use IO::Socket::INET;

# flush after every write
$| = 1;
my $data;
my ( $server_socket, $client_socket );
my ( $peer_address,  $peer_port );

$server_socket = new IO::Socket::INET(
    LocalHost => '192.168.0.7',
    LocalPort => '1008',
    Proto     => 'tcp',
    Listen    => 5,
    Reuse     => 1
) or die "ERROR in Socket Creation : $!\n";

print "SERVER Waiting for client connection on port 1008";
#$SIG{CHLD}=sub {wait()}; # Signal waiting for the Child process created
while ( $client_socket = $server_socket->accept() ) {
    my $pid = fork();    # Creating child as soon client creates a connection
    if ( $pid == 0 )     # Checking the child process
    {
        my $peer_address = $client_socket->peerhost();
        my $peer_port    = $client_socket->peerport();
        print "Accepted New Client Connection From : $peer_address, $peer_port\n";
        $client_socket->recv( $data, 1024 );
        print $data;
        $client_socket->send("FileLine1");

        #Get the acknowledgement
        $client_socket->recv( $data, 1024 );

        $client_socket->send("FileLine2");

        #Get the end acknowledgement
        $client_socket->recv( $data, 1024 );
        exit(0);    # Exiting child process
    }
}

我的问题是:我们可以依靠perl来做吗?或者我们是否需要去Java等其他平台。

1 个答案:

答案 0 :(得分:2)

我强烈建议您使用Net::Server CPAN模块来构建服务器。

Net::Server尝试成为通用服务器。它包括作为inetd进程运行的能力,单个连接服务器,分叉服务器,维护恒定数量的preforked子进程的preforking服务器,或者作为托管预先服务器服务器,它根据服务器负载维护子进程数

相关问题