Perl聊天服务器客户端挂断
我试图用perl编写一个聊天服务器程序,其中客户端输入一些文本,服务器用输入的ASCII值的总和进行响应。然而,有一个问题。服务器正在正确处理数据,但客户端未接收到数据。代码如下:Perl聊天服务器客户端挂断,perl,Perl,我试图用perl编写一个聊天服务器程序,其中客户端输入一些文本,服务器用输入的ASCII值的总和进行响应。然而,有一个问题。服务器正在正确处理数据,但客户端未接收到数据。代码如下: #!usr/bin/perl #client.pl use strict; use warnings; use IO::Socket; $| = 1; print "Client Program\n"; my $lp = 12000; my $client_socket = new IO::Socket::IN
#!usr/bin/perl
#client.pl
use strict;
use warnings;
use IO::Socket;
$| = 1;
print "Client Program\n";
my $lp = 12000;
my $client_socket = new IO::Socket::INET (
PeerAddr => '127.0.0.1',
PeerPort => $lp,
Proto => 'tcp'
) or die "Cannot create the socket: $!\n";
print "Server connected at port $lp \n";
print "Enter the text to sent to the server: \n";
my $user_input = <>;
chomp $user_input;
print $client_socket;
$client_socket->send($user_input);
my $server_output;
$client_socket->recv($server_output, 1024);
print "ASCII Sum received: scalar(<$client_socket>)";
$client_socket->close();
#!usr/bin/perl
#client.pl
严格使用;
使用警告;
使用IO::Socket;
$| = 1;
打印“客户端程序”\n;
我的$lp=12000;
my$client\u socket=新IO::socket::INET(
PeerAddr=>'127.0.0.1',
PeerPort=>$lp,
Proto=>“tcp”
)或“无法创建套接字:$!\n”;
打印“服务器已连接到端口$lp\n”;
打印“输入要发送到服务器的文本:\n”;
我的$user_输入=;
chomp$user\u输入;
打印$client\u套接字;
$client\u socket->send($user\u input);
我的$server\u输出;
$client\u socket->recv($server\u output,1024);
打印“收到的ASCII和:标量()”;
$client_socket->close();
客户端只是在发送数据后挂断(我可以这么说,因为我看到了服务器程序中接收到的文本。但是,直到我终止客户端,服务器处理才会显示)。我不明白这里出了什么问题。我也可以发布服务器程序,但似乎没有什么问题
以下是服务器程序:
#!/usr/bin/perl
#server.pl
use strict;
use warnings;
use IO::Socket;
$| = 1;
print "Server Program\n";
my $lp = 12000;
my $server_socket = new IO::Socket::INET (
LocalHost => '127.0.0.1',
LocalPort => $lp,
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1) or die "Cannot create the socket: $!\n";
my $sum_ASCII = 0;
print "Server started at port $lp \n";
print "Press Ctrl+C to stop the server\n";
print "Waiting for client to connect.. \n";
# or die sprintf "ERROR:(%d)(%s)(%d)(+%s)", $!,$!,$^E,$^E
while (my $new_client = $server_socket->accept()) {
my $addr = $new_client->peerhost();
my $port = $new_client->peerport();
print "Connected to client at $addr at port $port ";
while(<$new_client>) {
print "Following is the text entered by client: \n";
print "$_ \n";
my $len = length($_);
print "The length of the string is: $len\n";
my @char_array = split(//);
#print "@char_array";
print "Initially sum is $sum_ASCII\n";
for (my $i = 0; $i< $len; $i++)
{
print "Adding ASCII of '$char_array[$i]'.. ";
$sum_ASCII = $sum_ASCII + ord($char_array[$i]);
print "\t Sum = $sum_ASCII\n";
}
print "\n\nTotal sum of ASCII values of the all the sent characters is: $sum_ASCII\n"
}
print "Sending the sum to the client.. \n";
my $np = 98765;
my $client_socket = new IO::Socket::INET (
PeerAddr => '127.0.0.1',
PeerPort => $np,
Proto => 'tcp'
) or die "Cannot create the socket: $!\n";
print "Client connected at port $np \n";
$client_socket->send($sum_ASCII);
$client_socket->close();
print "\nClient now disconnecting..\n";
close $new_client;
print "\nWaiting for new client to connect.. \n";
#/usr/bin/perl
#server.pl
严格使用;
使用警告;
使用IO::Socket;
$| = 1;
打印“服务器程序”\n;
我的$lp=12000;
my$server\u socket=新IO::socket::INET(
LocalHost=>'127.0.0.1',
LocalPort=>$lp,
Proto=>“tcp”,
Listen=>SOMAXCONN,
重用=>1)或“无法创建套接字:$!\n”;
我的$sum_ASCII=0;
打印“服务器已在端口$lp启动\n”;
打印“按Ctrl+C停止服务器\n”;
打印“正在等待客户端连接..\n”;
#或冲模“错误:(%d)(%s)(%d)(++%s)”,$!,$$^E、 $^E
而(我的$new_client=$server_socket->accept()){
我的$addr=$new_client->peerhost();
my$port=$new_client->peerport();
打印“在端口$port的$addr处连接到客户端”;
while(){
打印“以下是客户端输入的文本:\n”;
打印“$\u\n”;
my$len=长度($\ux);
打印“字符串的长度为:$len\n”;
我的@char_数组=拆分(/);
#打印“@char_数组”;
打印“初始总和为$sum\u ASCII\n”;
对于(我的$i=0;$i<$len;$i++)
{
打印“添加“$char\u数组[$i]”的ASCII码…”;
$sum_ASCII=$sum_ASCII+ord($char_数组[$i]);
打印“\t Sum=$Sum\u ASCII\n”;
}
打印“\n\n所有发送字符的ASCII值总和为:$sum\u ASCII\n”
}
打印“将金额发送到客户端..\n”;
我的$np=98765;
my$client\u socket=新IO::socket::INET(
PeerAddr=>'127.0.0.1',
PeerPort=>np美元,
Proto=>“tcp”
)或“无法创建套接字:$!\n”;
打印“在端口$np连接的客户端\n”;
$client\u socket->send($sum\u ASCII);
$client_socket->close();
打印“\n客户端正在断开连接..\n”;
关闭$new_客户端;
打印“\n等待新客户端连接..\n”;
}
#我的$np=12345
#my$client\u socket=新IO::socket::INET(
#LocalAddr=>“127.0.0.1”,
#PeerPort=>np美元,
#Proto=>“tcp”
#)或“无法创建套接字:$!\n”;
#打印“在端口$np连接的客户端\n”;
#$client\u socket->send($sum\u ASCII);
#$client_socket->close();
#打印“输入要发送到服务器的文本:\n”;
#我的$user_输入=;
#chomp$user\u输入;
#打印$client\u套接字;
#$new\u client->send($sum\u ASCII);
$server_socket->close();
我不知道Perl中的套接字工作方式。
但是查看您的代码,我可以提出一些更改
更改您的:
print "ASCII Sum received: scalar(<$client_socket>)";
打印“接收到的ASCII和:标量()”;
致:
打印“收到的ASCII和:”。标量();
希望这可以打印您的日志。如果服务器与中的相同,那么您的服务器将等待一条从未发送过的换行 跳过
chomp$user\u输入在客户端中编写>或使用
my $data;
my $retval = $new_client->recv($data, 1024);
print "Following is the text entered by client: $data\n";
$new_client->send($data);
在您的服务器中
有关返回值的说明,请参见
在客户端中,必须将输出更改为
my $server_output;
$client_socket->recv($server_output, 1024);
print "ASCII Sum received: $server_output\n";
在引号中添加“”,然后运行代码。我的意思是像打印“收到的ASCII和:”;尝试添加条件以检查$client\u socket->recv($server\u output,1024);定义与否。我的意思是,它是未定义的还是有一些值。如果没有任何效果,最后尝试使用Perl的调试器调试Perl代码。勾选“否”,这也没用。实际上,在引号外写入标量是一个错误。此外,我尝试将print语句更改为:print“ASCII Sum received:$server_output”;它没有给出任何错误,但在recv语句之前停止。recv语句可能有问题。您是否尝试过像这样运行perl脚本:perl-d my_script.pl?是的,服务器是相同的,我尝试过,但似乎也不起作用。我做了一些改变,使它工作(部分)。我创建了一个用于监听的新套接字。这会有所帮助,但代码仍然不会打印ASCII值。我所做的更改是:my$client\u socket\u new=new IO::socket::INET(
PeerAddr=>'127.0.0.1',
PeerPort=>$lp,
Proto=>'tcp',
监听=>SOMAXCONN
)或die“无法创建套接字:$!\n”
打印“\n从服务器接收到的文本服务器:\n”代码>my$retVal=$client\u socket\u new->recv($serverOutput,1024)代码>打印“收到的ASCII和为$retVal\n”代码>在修改答案的帮助下,打印“收到ASCII和:”。就这样。我的意思是我没有得到任何“$server\u output”@cool\u sops的值。你也更改了server.pl吗?因为通过这两种修改,我得到了一个从客户机到服务器再到服务器的完整往返过程。我尝试过这样做。但是,我发送的是$sum_ASCII,而不是您提到的$data。我仍然得到与“收到的ASCII总和”相同的结果:@“Olaf Dietsche”我们可以通过此聊天吗?发布您当前使用的服务器程序将允许其他人复制问题(或不复制)
my $data;
my $retval = $new_client->recv($data, 1024);
print "Following is the text entered by client: $data\n";
$new_client->send($data);
my $server_output;
$client_socket->recv($server_output, 1024);
print "ASCII Sum received: $server_output\n";