从不同文件发送数据的简单 perl 程序

Posted

技术标签:

【中文标题】从不同文件发送数据的简单 perl 程序【英文标题】:A simple perl program to send data from different files 【发布时间】:2012-08-13 15:54:27 【问题描述】:

我编写了一个 perl 程序,它定期将更新的数据从文件发送到远程服务器。但现在我希望它从不同的文件中读取它并发送更新的数据,以便接收者应该知道如何将数据与混合数据分开。我只需要放置某种分隔符吗?此类事情是否已有任何标准?

#############
#Change parameters
############
$PeerAddr='192.168.0.7';
$PeerPort='7070';
##############
# Import packages
##############
use Text::Diff;
use IO::Socket;
#############
# Define global variables
#############
$lineCount=0;
$loopCount=0;
our $stats2 = 0;
for($count = 0; $count <= 10000; $count++)
        my $data_dir="archive/otat/*dat";
        my $data_file= `ls -t $data_dir | head -1`;
        chomp($changed_data_file);
        print "old data_file is $changed_data_file \n";
        chomp($data_file);
        if($data_file ne $changed_data_file)
                $lineCount2=0;
                $changed_data_file=$data_file;
                print ("String:$data_file :$changed_data_file  are not equal\n");
                
        while(defined($data_file))
                print "$data_file \n";
                open (DAT,$data_file) || die("Could not open file! $!");
                @iofile = <DAT>;
                $lineCount = @iofile;
                splice(@diffLines);
                print "printing: $lineCount\n";
                print "printing 2: $lineCount2 \n";
                chomp $lineCount;
                chomp $lineCount2;
                if($lineCount != $lineCount2)
                        $j=0;
                        for($i=$lineCount2;$i <= $lineCount; $i++)
                        $diffLines[$j] = $iofile[$i];
                                $j++;
                
                        $num=@diffLines;
                        print "count of diff lines:$num\n";
                        $lineCount2 = $lineCount;
                        $loopCount=0;
                
                if($loopCount>2)
                        $loopCount=0;
                        print "Look for recent file \n";
                        last;
                
                $loopCount++;
                sleep(5);
############################
                &socket_con(@diffLines);
        


#### Methods/Functions
sub socket_con 
        if ($sock== 0)
                $sock = new IO::Socket::INET (
                                                        PeerAddr => $PeerAddr,
                                                        PeerPort => $PeerPort,
                                                        Proto => 'tcp'
                                                        );
                die "Could not create socket: $!\n" unless $sock;
        
        print $sock @_;
#close($sock);

【问题讨论】:

ietf.org/rfc/rfc4627.txtw3.org/TR/REC-xmlietf.org/rfc/rfc4180.txt 雇用serialisation。 @Quentin 我无法打开您评论的链接。 不会让服务器接受命令(如“PARSE TYPE1”)或发送结构化数据,认为 YAML/JSON/XML 是实现您所追求的一个很好的方式吗? XML is badly suited,不推荐 【参考方案1】:

我经常使用 JSON,结果很好http://metacpan.org/pod/JSON 您可以将数据存储在散列中,将其序列化,将文本发送到客户端,然后让它将字符串转换回 Perl 散列,以便于使用。例如:

# on the server
use JSON;
...
# store changed lines in a hash
$diffLines->$data_file[$j]=$io_file[$i];
...
# Serialize the hash reference into a string which you then send to the client
$diffLinesSerialized = encode_json $diffLines;

# on the clinet
use JSON;
...
# convert received data from serialized string into hash
$diffLines = decode_json $diffLinesSerialized;
# $diffLines is now a has reference which can be accessed like normal
foreach my $data_file (keys %$diffLines) 
  foreach my $line (@$diffLines->$data_file) 
    ...
  

说了这么多,尽管从编程的角度来看我不太喜欢 XML,但它是这类事情的普遍标准。如果这只是一个专门的内部工具,不会发展成更大的东西,那可能没关系,但如果你认为这可以变成更通用的服务,比如对于非 perl 客户,最好考虑XML 作为一个选项。从面向服务的角度进行编程可以让未来的发展变得更加容易。

【讨论】:

我唯一的问题是,我不想在每台客户端机器上安装 json.pm,我可以在我的代码包中安装 json.pm 吗? 要使用核心模块执行此操作,您可以使用Data::Dumpereval 进行序列化,但是,您可能应该正确使用JSON。

以上是关于从不同文件发送数据的简单 perl 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个 TCP 数据包中从不同文件中分离数据?

python,tcp,udp接收发送数据,简单的文件下载服务器

python,tcp,udp接收发送数据,简单的文件下载服务器

如何将数据从 Perl 发送到 Python

如何从 Perl CGI 程序发送 JSON 响应?

Perl教程_编程入门自学教程_菜鸟教程-免费教程分享