Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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_Sockets - Fatal编程技术网

perl套接字的工作原理

perl套接字的工作原理,perl,sockets,Perl,Sockets,我是Perl套接字编程的初学者。到目前为止,服务器发送一个字符串,客户端在我的程序中用另一个字符串响应。稍后,如果服务器发送另一个字符串,则客户端无法接收该字符串。要在服务器和客户端之间多次传输数据,我是否应该包含任何函数 服务器: #!/usr/bin/perl use strict; use warnings; use IO::Socket::INET; my $socket; my $clientsocket; my $serverdata; my $clientdata; $sock

我是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
严格使用;
使用警告;
使用IO::Socket::INET;
我的$socket;
我的$clientsocket;
我的$serverdata;
我的$clientdata;
$socket=新IO::socket::INET(
LocalHost=>'127.0.0.1',
LocalPort=>2500,
Proto=>“tcp”,
听着=>1,
重用=>1
)或者死“Oops:$!\n”;
打印“正在等待客户端。\n”;
$clientsocket=$socket->accept();
打印“连接自:”,$clientsocket->peerhost();
打印“,端口:”,$clientsocket->peerport(),“\n”;
#向客户端写入一些数据
$serverdata=“这是正在讲话的服务器\n”;
打印$clientsocket“$serverdata\n”;
#从客户端读取数据
$clientdata=;
打印“$clientdata”;
$serverdata=“服务器再次写入\n”;
打印$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();
#/usr/bin/perl
严格使用;
使用警告;
使用IO::Socket::INET;
使用传统知识;
我的$socket;
我的$serverdata;
$socket=新IO::socket::INET(
PeerHost=>'127.0.0.1',
PeerPort=>2500',
Proto=>“tcp”,
)或者死“$!\n”;
打印“已连接到服务器。\n”;
#阅读服务器发送的消息。
$serverdata=;
打印“来自服务器的消息:$serverdata\n”;
#向服务器发送一些消息。
我的$name=“客户在这里!”;
打印$socket“$name”;
#读取服务器发送的消息。
$serverdata=;
打印“$serverdata”;
$socket->close();

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

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

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

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

我建议您通读的相关章节,但请记住它使用的是过时的最佳实践,因此不要直接复制任何内容。

只要确保您的客户发送一整行内容即可。因为你在和我一起读书

<$clientsocket>


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

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

您的问题不包含足够的信息,无法给出任何合理的答案。请向我们展示您目前拥有的服务器和客户端。如果服务器要关闭套接字并退出,服务器如何能够读取从客户端到服务器的第二条消息?我修改了上面的代码,以便客户端在关闭前发送第二条消息。而且,服务器似乎没有任何问题地接收到它。我还没有使用while循环@user2691811非常简单:在下一个客户端到达之前不要关闭套接字。中心点是,
accept
应该在一个循环中发生,而不是只发生一次。我想,我的问题是服务器发送多条消息。客户端能够很好地发送多条消息。我不想让服务器关闭它的套接字。如果是这样,它如何从客户端接收数据?是的,问题纯粹是服务器端的。如果查看代码,您将看到服务器
接受客户机,进行一点通信,然后执行侦听套接字的
$socket->close()
–而不是
$clientsocket
。之后,另一个客户端正在尝试连接,但服务器没有侦听!(我希望客户超时)。服务器需要一个循环,这样它就可以依次处理一个客户机。@user2691811我想我的回答描述了一个问题,但不是你要问的问题–Ingo的回答指出了一个更直接的问题:客户机应该
打印$socket“$stuff\n”
← 注意末尾的换行符。
希望读取整行数据,直到文件结束或行结束–但是套接字保持打开状态,并且从未发送换行。此外,客户端应该执行
$socket->autoflush(1)