0

クライアントがテキストを入力し、サーバーが入力のASC​​II値の合計で応答する、perlでチャットサーバープログラムを作成しようとしています。ただし、1つの問題があります。サーバーはデータを正しく処理していますが、クライアントはデータを受信して​​いません。コードは次のとおりです。

#!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
#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";

}

#my $np = 12345
#my $client_socket = new IO::Socket::INET (
#LocalAddr => '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 "Enter the text to sent to the server: \n";
#my $user_input = <>;
#chomp $user_input;
#print $client_socket;
#$new_client->send($sum_ASCII);

$server_socket->close();
4

2 に答える 2

0

サーバーがperlチャットサーバーのエラーと同じである場合、サーバーは改行を待機しますが、改行は送信されません。

クライアントをスキップchomp $user_input;するか、次のデータを読み取ります

my $data;
my $retval = $new_client->recv($data, 1024);
print "Following is the text entered by client: $data\n";
$new_client->send($data);

代わりにサーバーで。

recv戻り値の説明については、を参照してください。

クライアントでは、出力を次のように変更する必要があります

my $server_output;
$client_socket->recv($server_output, 1024);
print "ASCII Sum received: $server_output\n";
于 2013-01-10T08:49:40.693 に答える
0

Perlでのソケットの動作についてはわかりません。しかし、あなたのコードを見ると、いくつかの変更を提案することができます。

変更する:

 print "ASCII Sum received: scalar(<$client_socket>)";

に:

   print "ASCII Sum received: " . scalar(<$client_socket>);   

これでログが印刷されることを願っています。

于 2013-01-10T07:58:26.330 に答える