perl套接字的工作

时间:2014-03-29 13:29:54

标签: perl sockets

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

SERVER:

#!/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。

3 个答案:

答案 0 :(得分:2)

如果您使用从另一端读取邮件,发件人必须以“\ n”结束邮件。 或者,您可以使用recv(...),以便在换行符之前不会缓冲消息。

答案 1 :(得分:1)

确保您的客户端发送整行。您正在阅读

<$clientsocket>

您的服务器等待&#34; \ n&#34;来自客户。

答案 2 :(得分:0)

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

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

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

我建议您仔细阅读perldoc perlipc的相关部分,但请记住它使用过时的最佳做法,因此请勿直接复制任何内容。