【问题标题】:Working of perl socketsperl 套接字的工作
【发布时间】:2014-03-29 13:29:54
【问题描述】:

我是 Perl 套接字编程的初学者。截至目前,服务器发送一个字符串,客户端在我的程序中用另一个字符串响应。稍后,如果服务器发送另一个字符串,客户端将无法接收它。要在服务器和客户端之间多次传输数据,我应该包含任何功能吗?

服务器:

#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;

my $socket;
my $clientsocket;
my $serverdata;
my $clientdata;

$socket = new IO::Socket::INET (
    LocalHost => '127.0.0.1',
    LocalPort => 2500,
    Proto     => 'tcp',
    Listen    => 1,
    Reuse     => 1
) or die "Oops: $! \n";

print "Waiting for the Client.\n";
$clientsocket = $socket->accept();
print   "Connected from : ", $clientsocket->peerhost();
print   ", Port : ", $clientsocket->peerport(), "\n";

# Write some data to the client  
$serverdata = "This is the Server speaking \n";
print $clientsocket "$serverdata \n";

# read the data from the client
$clientdata = <$clientsocket>;
print "$clientdata";
$serverdata = "Server Again writing \n";
print $clientsocket "$serverdata";

$socket->close();

客户:

#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket::INET;
use Tk;

my $socket;
my $serverdata;
$socket = new IO::Socket::INET (
    PeerHost => '127.0.0.1',
    PeerPort => '2500',
    Proto    => 'tcp',
) or die "$!\n";

print "Connected to the Server.\n";

# read the message sent by server.
$serverdata = <$socket>;
print "Message from Server : $serverdata \n";

# Send some message to server.
my $name = "Client here!";
print $socket "$name";

# Read message sent by server.
$serverdata = <$socket>;
print "$serverdata";

$socket->close();

在客户端第二次打印 $serverdata 没有发生。

【问题讨论】:

  • 您的问题没有包含足够的信息来给出任何明智的答案
  • 请向我们展示您目前拥有的服务器和客户端。

标签: perl sockets


【解决方案1】:

如果您使用从另一端读取消息,发送者必须以“\n”结束消息。 或者,您可以使用 recv(...) 这样消息不会被缓冲,直到换行符为止。

【讨论】:

    【解决方案2】:

    只要确保您的客户发送一整行即可。因为你正在阅读

    <$clientsocket>
    

    您的服务器正在等待来自客户端的“\n”。

    【讨论】:

      【解决方案3】:

      您的服务器开始侦听某个端口。它一直等到客户端连接,accepts 连接。它通过客户端连接读取和写入一些数据。接着?然后它只是关闭套接字并退出程序。

      这不是您想要的:您希望服务器开始等待下一个连接。这意味着某种循环:每次客户端连接时,我们都会进行通信:

      while (my $client = $socket->accept) {
          # do something with the $client
      }
      

      我建议您阅读perldoc perlipc 的相关部分,但请记住它使用了过时的最佳实践,因此不要直接复制任何内容。

      【讨论】:

      • 如果服务器将关闭套接字并退出,那么服务器如何读取从客户端到服务器的第二条消息?我修改了上面的代码,以便客户端在它关闭之前发送第二条消息。而且,服务器似乎没有任何问题地接收它。我还没用过while循环!
      • @user2691811 很简单:在下一个客户端到达之前不要关闭套接字。中心点是accept 应该发生在一个循环中,而不仅仅是一次
      • 我猜,我的问题是服务器发送多条消息。客户端能够很好地发送多条消息。我不明白服务器关闭其套接字的想法。如果是这样,它如何能够从客户端接收数据?
      • 是的,问题出在纯粹服务器端。如果您查看您的代码,您会看到服务器accepts 是一个客户端,进行了一些通信,然后执行$socket-&gt;close() - 的侦听套接字,而不是$clientsocket。之后,另一个客户端正在尝试连接,但服务器没有监听! (我希望客户端超时)。服务器需要一个循环,以便它可以一个接一个地处理一个客户端。
      • @user2691811 我认为我的回答描述了一个问题,但不是您要问的问题——Ingo 的回答指出了一个更直接的问题:客户应该print $socket "$stuff\n" ← 注意最后的换行符。 &lt;$clientsocket&gt; 想要读取一整行,直到文件结尾或行结尾——但套接字保持打开状态并且从未发送任何换行符。另外,客户应该做$socket-&gt;autoflush(1)
      猜你喜欢
      • 1970-01-01
      • 2014-11-16
      • 2013-02-19
      • 2011-08-11
      • 2010-10-16
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多