Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl聊天服务器客户端挂断_Perl - Fatal编程技术网

Perl聊天服务器客户端挂断

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

我试图用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::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";