服务器无法用perl回复客户端
我正在使用Perl通过套接字编程实现客户机-服务器通信 我正在将一些数据从客户端发送到服务器,但除非使用Ctrl-C终止客户端,否则我无法在服务器上看到任何内容 此外,从服务器返回的任何内容都不会到达客户端 这是我第一次尝试做客户机-服务器编程,但我不知道该做什么 我正在使用这个模块 这是我的密码 服务器服务器无法用perl回复客户端,perl,sockets,Perl,Sockets,我正在使用Perl通过套接字编程实现客户机-服务器通信 我正在将一些数据从客户端发送到服务器,但除非使用Ctrl-C终止客户端,否则我无法在服务器上看到任何内容 此外,从服务器返回的任何内容都不会到达客户端 这是我第一次尝试做客户机-服务器编程,但我不知道该做什么 我正在使用这个模块 这是我的密码 服务器 use IO::Socket::INET; my ($socket, $client_socket); my ($peeraddress, $peerport); $| = 1; $so
use IO::Socket::INET;
my ($socket, $client_socket);
my ($peeraddress, $peerport);
$| = 1;
$socket = new IO::Socket::INET (
LocalHost => '127.0.0.1',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "Error in socket creation: $!\n";
while (1) {
$client_socket = $socket->accept();
$data = <$client_socket>;
print "Received from socket is $data\n";
print "Sending to socket\n";
$client_socket->send("hello");
}
$socket->close();
我冒昧地猜测是这样的:
$data = <$client_socket>;
$client_socket->send("hello");
print $socket "mailshow 018DB3FCE4";
$socket->recv($data,1024);
服务器:
以及:
my$data=;
打印“从套接字接收的是$data\n”;
打印“发送到套接字\n”;
打印{$client\u socket}“hello\n”;
冒险猜测是这样的:
$data = <$client_socket>;
$client_socket->send("hello");
print $socket "mailshow 018DB3FCE4";
$socket->recv($data,1024);
服务器:
以及:
my$data=;
打印“从套接字接收的是$data\n”;
打印“发送到套接字\n”;
打印{$client\u socket}“hello\n”;
请始终使用严格的
和使用警告
并在变量第一次使用时使用my
声明变量。您还应该避免使用间接对象表示法,因此newio::Socket::INET(…)
应该是IO::Socket::INET->new(…)
。“我们建议您避免使用这种语法,有几个原因”请始终使用strict
和使用warnings
,并在变量第一次使用时使用my
声明变量。您还应该避免使用间接对象表示法,因此newio::Socket::INET(…)
应该是IO::Socket::INET->new(…)
。“我们建议您避免使用这种语法,有几个原因”感谢您的帮助:)我将听取您对良好实践的意见,并将遵循这些意见。另外,使用send/recv仅解决我的问题再次感谢$|=1
将在当前输出上设置自动刷新-这里是STDOUT
。最好说出你对STDOUT->autoflush
和$socket->autoflush
的意思。这就需要IO::Handle
,从v5.14I开始,我就使用$|=1
,并且我是这样读的socket->read($data,1024)代码>在客户端上。问题是我无法在STDOUT
上获取最后几个字节,我认为这是因为我正在将其读入1024字节的
缓冲区,而且缓冲区未满,客户端等待。但我没有更多的东西要从服务器端发送,所以如何获取最后的几个字节。感谢您的帮助:)我将接受您对良好实践的评论,并将遵循它们。另外,使用send/recv仅解决我的问题再次感谢$|=1
将在当前输出上设置自动刷新-这里是STDOUT
。最好说出你对STDOUT->autoflush
和$socket->autoflush
的意思。这就需要IO::Handle
,从v5.14I开始,我就使用$|=1
,并且我是这样读的socket->read($data,1024)代码>在客户端上。问题是我无法在STDOUT
上获取最后几个字节,我认为这是因为我正在将其读入1024字节的
缓冲区,而且缓冲区未满,客户端等待。但我并没有更多的东西要从服务器端发送,所以如何获取最后的几个字节。
use strict;
use warnings;
use IO::Socket::INET;
$| = 1;
my $socket = new IO::Socket::INET(
PeerHost => '127.0.0.1',
PeerPort => '5000',
Proto => 'tcp',
) or die "Error in socket creation : $!\n";
print {$socket} "mailshow 018DB3FCE4\n";
my $data;
$socket->recv( $data, 1024 );
print "Client received: ",$data,"\n";
sleep(5);
$socket->close();
use strict;
use warnings;
use IO::Socket::INET;
$| = 1;
my $socket = new IO::Socket::INET(
LocalHost => '127.0.0.1',
LocalPort => '5000',
Proto => 'tcp',
Listen => 5,
Reuse => 1
) or die "Error in socket creation: $!\n";
while (1) {
my $client_socket = $socket->accept();
my $data = <$client_socket>;
print "Received from socket is $data\n";
print "Sending to socket\n";
$client_socket->send("hello");
}
$socket->close();
print {$socket} "mailshow 018DB3FCE4\n";
my $data = <$socket>;
print "Client received: ",$data,"\n";
my $data = <$client_socket>;
print "Received from socket is $data\n";
print "Sending to socket\n";
print {$client_socket} "hello\n";