Perl服务器客户端问题(缓冲区未刷新)

时间:2012-08-21 11:53:24

标签: perl

我的下面是用perl编写的客户端和服务器。问题是客户端从未正确发送和接收来自服务器的消息。 要求是向服务器发送消息并从服务器获取响应并根据该决定做出决定。我用STDOUT和STDIN写了一个服务器客户端测试类,那些工作正常。我想是因为我在每次发送命令后按ENTER键。

客户端

#!/usr/bin/perl

my $rhostname='192.168.0.181';
my $hostname="support";
my $port='7071';
my $script_log_dir="/var/sdplog/support";

use IO::Socket; 
use strict;

$| = 1;  
my $host_ip='0.0.0.0';
my $host_port='7088';
my $sock = new IO::Socket::INET ( 
    PeerAddr => $rhostname, 
    PeerPort => $port,
    Proto => 'tcp', 
   ); 
   die "Could not create socket: $!\n" unless $sock; 
   $sock->autoflush(1);

   my $query = "START:192.168.0.20:3:1:1:".$host_ip.":".$host_port;

   my $count=0;

   print "sending $query\n";
   print $sock "$query";

   my $data = <$sock>;
   print $data;
   close($sock);

服务器 - 代码

while ($q != -999){
    $logger->debug('waiting for socket....');
    my $new_sock = $sock->accept();
#       sleep(5);
    $i++;   
    $logger->debug($i.' accept');
    while(<$new_sock>) {

    #       print $_;
            $logger->debug("received command - ".$_);
            my $ip_status = 2;

            @input_command = split(':', $_);

            $command = @input_command[0];
            $server_ip = @input_command[1];
            $retry_count= @input_command[2];
            $wait_time = @input_command[3];
            $next_ping_wait = @input_command[4];
            $client_ip = @input_command[5];
            $client_port = @input_command[6];

            @ping_array=($server_ip,$retry_count,$wait_time,$next_ping_wait);
            $logger->debug("received request ".@input_command);
            $logger->debug($command);
            if ($command eq "START"){
                    $logger->debug($command." received. checking server status");
                    $ip_status = network->ping_ip(@ping_array);
                    $logger->debug("ping status - ".$ip_status);
#                       $logger->debug($client_ip.$client_port);
    #               send_message($client_ip,$client_port,$ip_status); # do some 
                    sleep(2);
                    print $new_sock "$ip_status\n";

            }else{

                    $logger->debug($command." received");          }
            }
}

close($sock);
exit 0;

服务器处于侦听状态。当我运行下面的客户端是输出。

>perl client.pl 
sending START:192.168.0.20:3:1:1:0.0.0.0:7088

在服务器上

2012/08/21 18:49:04 DEBUG> server.pl:89 main:: - waiting for socket....
2012/08/21 18:49:08 DEBUG> server.pl:93 main:: - 1 accept

但这就是全部。一旦我点击CTRL + C客户端终止和服务器上的其余日志按预期打印。似乎没有刷新从服务器读取。

2012/08/21 18:56:05 DEBUG> server.pl:97 main:: - received command -   START:192.168.0.20:3:1:1:0.0.0.0:7088
2012/08/21 18:56:05 DEBUG> server.pl:113 main:: - received request 7
2012/08/21 18:56:05 DEBUG> server.pl:114 main:: - START
2012/08/21 18:56:05 DEBUG> server.pl:116 main:: - START received. checking server  status
2012/08/21 18:56:05 DEBUG> network.pm:31 network::ping_ip - 192.168.0.20 is alive
2012/08/21 18:56:05 DEBUG> server.pl:118 main:: - ping status - 1
2012/08/21 18:56:07 DEBUG> server.pl:89 main:: - waiting for socket....

但无法找到解决方案。请放弃一些亮点,因为我现在被困在这里几个小时。

1 个答案:

答案 0 :(得分:2)

您的服务器正在等待EOF或换行符号,但在客户端中不会发送它。 终止客户端时,服务器接收EOF,服务器停止从$new_sock读取,所有其他代码按预期工作。

您应该在$query

中向client添加换行符号
-print $sock "$query";
+print $sock $query."\n";

chomp用于server

中收到的数据
while(<$new_sock>) {
+    chomp;