- server程序
接受客户端信息,并发送回应
#!/usr/bin/perl -w
# socket_server.pl
use strict;
use IO::Socket;
use IO::Select;
# hash to install IP Port
my ($ser_addr, $ser_port)=("127.0.0.1", "12345");
our($buffer, $len);
my $socket = IO::Socket::INET->new(
LocalAddr => "$ser_addr", #本机IP地址
LocalPort => "$ser_port", #定义本机的Port,然后进行bind
Type => SOCK_STREAM, #套接字类型
Proto => "tcp", #协议名
Listen => 200, #定义listen的最大数
Blocking => 0, #非阻塞
) or die "Can not create socket [email protected]";
my $sel = IO::Select->new($socket);
while (my @ready = $sel->can_read) {
foreach my $fh (@ready) {
if ($fh == $socket) {
my $new = $socket->accept();
$sel->add($new);
}
else {
$len = $fh->recv($buffer,1024,0); #接收客户端消息
print "$buffer \n";
$fh->send("Server OK!\n",0); #发送服务端消息
$fh->autoflush(1);
$sel->remove($fh);
$fh->close();
}
}
}
$socket->close() or warn "Close Socket [email protected]";
2.client
连接客户端,发送一个消息,并接受服务器端应答消息
#!/usr/bin/perl -w
# Socket_client.pl
use strict;
use IO::Socket; ##IO::Socket::INET模块是IO::Socket模块的子模块,不用重新use。
use IO::Select; ##该模块和Linux下select()函数实现的功能一致,另扩展更过的功能。可以perldoc查看。
for (my $i=0; $i<20000; $i++){
&send_rev_data;
}
sub send_rev_data{
my ($ser_addr, $ser_port) = ("127.0.0.1", "12345");
##IO::Socket::INET->new()用于初始化一个socket连接,其中集成了socket、inet_aton、connect、bind、listen等功能。就不需要单独转换IP地址为网络地址结构了,直接使用IP地址就ok了。
##具体参数下面单独介绍。
my $socket = IO::Socket::INET->new(
PeerAddr => "$ser_addr",
PeerPort => "$ser_port",
Type => SOCK_STREAM,
Proto => "tcp",
) or die "Can not create socket [email protected]";
$socket->send("Client Ok!\n",0); ##发送消息至服务器端。
$socket->autoflush(1);
my $sel = IO::Select->new($socket); ##建立select对象
while (my @ready = $sel->can_read) { ##等待服务端返回的消息
foreach my $fh (@ready) {
if ($fh == $socket) {
while (<$fh>) {
print $_;
}
$sel->remove($fh);
close $fh;
}
}
}
#$socket->close() or die "Close Socket [email protected]";
}