我在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等其他平台。
答案 0 :(得分:2)
我强烈建议您使用Net::Server CPAN模块来构建服务器。
Net::Server
尝试成为通用服务器。它包括作为inetd进程运行的能力,单个连接服务器,分叉服务器,维护恒定数量的preforked子进程的preforking服务器,或者作为托管预先服务器服务器,它根据服务器负载维护子进程数