[Perl]测试程序时用Perl真是太方便了

news/2024/6/18 22:32:41

测试自己的业务数据远程传送服务,需要一个能模拟对方Socket的服务,
这时候就显出Perl的便利了。一分钟搞定。
代码如下,其实也是从CPAN那里拿来的:
####################################################################
#
# 工程项目: 模拟Socket服务器
#
# 模块任务: 来自intenel,这个脚本提供一个TCP echo 服务,版本是2
#
# 程序名称:  TcpEchoServerForLDB.pl
#
# 程序说明: 
#            监听固定Socket端口,如果收到数据,就给对方返回一个字符串“ok回车”,
#    这样来模拟接收数据的Socket服务。
#
# 使用说明:TcpEchoServerForLDB.pl [port]
#           [port]指要监听的端口号
####################################################################

#!/usr/bin/perl
# Figure 5.4: The reverse echo server, using IO::Socket

##================================================================##
system("cls");
warn("/n");
warn("TCP ECHO Simple Server Version 2.0/n");
warn("没有版权 Linktone 2005-2006。不保留所有权利。/n");
warn("/n");
warn("用法: TcpEchoServerForLDB.pl [port]/n");
warn("[注意]如果没有传递端口参数,默认监听4330端口/n");
warn("[注意]发送的数据请以回车换行结尾!/n");
##================================================================##

##================================================================##
## 引用的库声明 2
use strict;
use IO::Socket qw(:DEFAULT :crlf);
##================================================================##

##================================================================##
use constant MY_ECHO_PORT => 4330;
$/ = CRLF;
my ($bytes_out,$bytes_in) = (0,0);

my $quit = 0;
$SIG{INT} = sub { $quit++ };

my $port = shift || MY_ECHO_PORT;

my $sock = IO::Socket::INET->new( Listen => 20,
LocalPort => $port,
Timeout => 60*60,
Reuse => 1)
or die "Can't create listening socket: $!/n";

warn "服务守候在端口$port.../n";
while (!$quit)
{
 next unless my $session = $sock->accept;

 my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
 my $port = $session->peerport;
 warn "她来了:[$peer,$port]/n";

 # 要回送的字符串
 my $msg_Output = "ok回车";

 while (<$session>)
 {
  $bytes_in += length($_);
  chomp;
  my $msg_out = (scalar reverse $_) . CRLF;
  warn("Message From [$peer,$port]:$msg_out");
  print $session $msg_Output;
  ##warn("Send Message To [$peer,$port]:$msg_Output");
  $bytes_out += length($msg_Output);
 }
 warn "她走了[$peer,$port]!/n";
 close $session;
}
##================================================================##

print STDERR "bytes_sent = $bytes_out, bytes_received = $bytes_in/n";
warn("bytes_sent = $bytes_out, bytes_received = $bytes_in/n");
close $sock;




测试自己的业务数据远程传送服务,需要一个能模拟对方Socket的服务,
这时候就显出Perl的便利了。一分钟搞定。
代码如下,其实也是从CPAN那里拿来的:
####################################################################
#
# 工程项目: 模拟Socket服务器
#
# 模块任务: 来自intenel,这个脚本提供一个TCP echo 服务,版本是2
#
# 程序名称:  TcpEchoServerForLDB.pl
#
# 程序说明: 
#            监听固定Socket端口,如果收到数据,就给对方返回一个字符串“ok回车”,
#    这样来模拟接收数据的Socket服务。
#
# 使用说明:TcpEchoServerForLDB.pl [port]
#           [port]指要监听的端口号
####################################################################

#!/usr/bin/perl
# Figure 5.4: The reverse echo server, using IO::Socket

##================================================================##
system("cls");
warn("/n");
warn("TCP ECHO Simple Server Version 2.0/n");
warn("没有版权 Linktone 2005-2006。不保留所有权利。/n");
warn("/n");
warn("用法: TcpEchoServerForLDB.pl [port]/n");
warn("[注意]如果没有传递端口参数,默认监听4330端口/n");
warn("[注意]发送的数据请以回车换行结尾!/n");
##================================================================##

##================================================================##
## 引用的库声明 2
use strict;
use IO::Socket qw(:DEFAULT :crlf);
##================================================================##

##================================================================##
use constant MY_ECHO_PORT => 4330;
$/ = CRLF;
my ($bytes_out,$bytes_in) = (0,0);

my $quit = 0;
$SIG{INT} = sub { $quit++ };

my $port = shift || MY_ECHO_PORT;

my $sock = IO::Socket::INET->new( Listen => 20,
LocalPort => $port,
Timeout => 60*60,
Reuse => 1)
or die "Can't create listening socket: $!/n";

warn "服务守候在端口$port.../n";
while (!$quit)
{
 next unless my $session = $sock->accept;

 my $peer = gethostbyaddr($session->peeraddr,AF_INET) || $session->peerhost;
 my $port = $session->peerport;
 warn "她来了:[$peer,$port]/n";

 # 要回送的字符串
 my $msg_Output = "ok回车";

 while (<$session>)
 {
  $bytes_in += length($_);
  chomp;
  my $msg_out = (scalar reverse $_) . CRLF;
  warn("Message From [$peer,$port]:$msg_out");
  print $session $msg_Output;
  ##warn("Send Message To [$peer,$port]:$msg_Output");
  $bytes_out += length($msg_Output);
 }
 warn "她走了[$peer,$port]!/n";
 close $session;
}
##================================================================##

print STDERR "bytes_sent = $bytes_out, bytes_received = $bytes_in/n";
warn("bytes_sent = $bytes_out, bytes_received = $bytes_in/n");
close $sock;





http://www.niftyadmin.cn/n/3649127.html

相关文章

如何使用Node.js抓取网站

介绍 (Introduction) Web scraping is the technique of extracting data from websites. This data can further be stored in a database or any other storage system for analysis or other uses. While extracting data from websites can be done manually, web scraping…

[USTC]中科大备忘录

中科大的罪行之一&#xff1a; 居然到现在还不衰落。 世界学术排名最高的7所中国大陆大学&#xff1a;1 清华大学 248名 75.0分&#xff08;Tsing Hua Univ&#xff09; 2 北京大学 287名 66.9分&#xff08;Peking Univ&#xff09; 3 中国科大 312名 62.1分&#xff08;Univ …

如何在DigitalOcean Kubernetes上设置Eclipse Theia Cloud IDE平台

介绍 (Introduction) With developer tools moving to the cloud, creation and adoption of cloud IDE (Integrated Development Environment) platforms is growing. Cloud IDEs are accessible from every type of modern device through web browsers, and they offer nume…

Android中View绘制不同状态背景图片原理以及StateListDrawable使用详解

1、View的几种不同状态属性2、如何根据不同状态去切换我们的背景图片。开篇介绍&#xff1a;android背景选择器selector用法汇总对Android开发有经验的同学&#xff0c;对 <selector>节点的使用一定很熟悉&#xff0c;该节点的作用就是定义一组状态资源图片&#xff0c;使…

django中的app_如何在Django中构建Weather App

django中的app介绍 (Introduction) In this article we’ll build a simple Django app that displays the current weather for various cities. To get the current weather data, we’ll use the Open Weather Map API. 在本文中&#xff0c;我们将构建一个简单的Django应用…

酷炫轮播广告

一、广告轮播条的简介 广告轮播条在HTML网页设计以及APP界面设计中非常常见&#xff0c;如下图所示。在Android中&#xff0c;实现的方式可以是自定义ViewPager来实现&#xff0c;但是我们程序员中流传的一句名言&#xff0c;“不要重复造轮子”。因此我们也可以通过网上已经有…

android View 详解

一、View 的概述 android.View.View(即View)类是以矩形的方式显示在屏幕上&#xff0c;View是用户界面控件的基础。View的继承层次关系如下图&#xff1a; 可以看到所有的界面控件都是View的子类。简单证实一下&#xff0c;每当你用findViewByIds(R.id.xx)时总要将其强转&#…

“大整数阶乖”问题的递推算法

/**//* 标题&#xff1a;<<系统设计师>>应试编程实例-[递推算法程序设计]作者&#xff1a;成晓旭时间&#xff1a;2002年09月11日(11:52:00-16:26:00)实现递推算法的大整数阶乖处理函数时间&#xff1a;2002年09月16日(18:38:00-20:02:00)实现“斐波那契数列”问…