在perl套接字编程中,如何从客户端发送数据并从服务器接收数据
我正在使用Socket模块在Perl中执行Socket编程,现在我想从客户端发送一个数据并从服务器端接收它。我将如何做到这一点。请帮忙 下面给出了我使用的代码 服务器在perl套接字编程中,如何从客户端发送数据并从服务器接收数据,perl,sockets,Perl,Sockets,我正在使用Socket模块在Perl中执行Socket编程,现在我想从客户端发送一个数据并从服务器端接收它。我将如何做到这一点。请帮忙 下面给出了我使用的代码 服务器 #!/usr/bin/perl -w # Filename : server.pl use strict; use IO::Socket; use Socket; use Sys::Hostname; use constant BUFSIZE => 1024; # use port 7890 as default my
#!/usr/bin/perl -w
# Filename : server.pl
use strict;
use IO::Socket;
use Socket;
use Sys::Hostname;
use constant BUFSIZE => 1024;
# use port 7890 as default
my $port = shift || 7890;
my $proto = getprotobyname('tcp');
my $server = "localhost"; # Host IP running the server
# create a socket, make it reusable
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)
or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1)
or die "Can't set socket option to SO_REUSEADDR $!\n";
# bind to a port, then listen
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't bind to port $port! \n";
listen(SOCKET, 5) or die "listen: $!";
print "SERVER started on port $port\n";
# accepting a connection
my $client_addr;
my $val = 100;
while ($client_addr = accept(NEW_SOCKET, SOCKET)) {
# send them a message, close connection
my $name = gethostbyaddr($client_addr, AF_INET );
print NEW_SOCKET "Smile from the server";
print NEW_SOCKET $val;
print "Connection recieved from $name\n";
close NEW_SOCKET;
}
客户
#!/usr/bin/perl -w
# Filename : client.pl
use strict;
use IO::Socket;
use Socket;
use Sys::Hostname;
use constant BUFSIZE => 1024;
# initialize host and port
my $host = shift || 'localhost';
my $port = shift || 7890;
my $server = "localhost"; # Host IP running the server
# create the socket, connect to the port
socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2])
or die "Can't create a socket $!\n";
connect( SOCKET, pack_sockaddr_in($port, inet_aton($server)))
or die "Can't connect to port $port! \n";
my $line;
my $req = 1000;
while ($line = <SOCKET>) {
print "$line\n";
}
close SOCKET or die "close: $!";
#/usr/bin/perl-w
#文件名:client.pl
严格使用;
使用IO::Socket;
使用插座;
使用Sys::Hostname;
使用常量BUFSIZE=>1024;
#初始化主机和端口
my$host=shift | |“localhost”;
我的$port=shift | | 7890;
我的$server=“localhost”#运行服务器的主机IP
#创建套接字,连接到端口
套接字(套接字、PF_INET、SOCK_流,(getprotobyname('tcp'))[2])
或“无法创建套接字$!\n”;
连接(SOCKET,pack_sockaddr_in($port,inet_aton($server)))
或“无法连接到端口$port!\n”;
我的美元线;
我的$req=1000;
而($line=){
打印“$line\n”;
}
关闭插座或模具“关闭:$!”;
以下是一个基本示例。下面的代码增加了您所拥有的功能,但请注意,模块或核心使其比您使用的较低级别调用更容易
对代码的唯一更改(下面显示的除外)是从SOCKET
到词法my$SOCKET
,并且在while
条件中移动现有声明
每个服务器-客户机系统都需要一个协议,一个消息交换方式的安排。在这里,一旦客户端连接,服务器就会发送一条消息,然后它们交换单个打印
server.pl
# ... code from the question, with $socket instead of SOCKET
use IO::Handle; # for autoflush
while (my $client_addr = accept(my $new_socket, $socket))
{
$new_socket->autoflush;
my $name = gethostbyaddr($client_addr, AF_INET );
print "Connection received from $name\n";
print $new_socket "Hello from the server\n";
while (my $recd = <$new_socket>) {
chomp $recd;
print "Got from client: $recd\n";
print $new_socket "Response from server to |$recd|\n";
}
close $new_socket;
}
这与预期的一样。客户端在收到三条消息后退出,服务器保持等待状态。如果您确实希望只写一次,请使用简单的打印和读取替换while
循环
交易所可以更加复杂,见最后链接的perlipc中的例子
几点意见
- 使用上面提到的模块使这变得更容易
- 法拉盛过程中的任何故障都可能导致死锁,其中一方写了信,等待阅读,而另一方没有收到信息,仍在管道中等待阅读
- 检查一切。为了简洁起见,所有检查都省略了
比使用警告
开关更好。见-w
这只是为了回答如何实现它们之间的通信的问题。一个很好的学习资源是,它也有一个。相关模块的文档也提供了大量信息。提示:通过使用
socket(my$socket,…)
而不是socket(socket,…)
,避免全局变量。提示:使事情简单得多。您当前从客户端的socket读取数据,然后写入服务器的socket。您还可以在客户机中写入套接字,并从服务器中的套接字读取。插座是双向的。
# ... same as in question, except for $socket instead of SOCKET
use IO::Handle;
$socket->autoflush;
my $cnt = 0;
while (my $line = <$socket>) {
chomp $line;
print "Got from server: $line\n";
last if ++$cnt > 3; # made up condition to quit
print $socket "Hello from client ($cnt)\n";
}
close $socket or die "close: $!";