Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 如何在Perl中处理客户机-服务器通信?_Multithreading_Perl_Client - Fatal编程技术网

Multithreading 如何在Perl中处理客户机-服务器通信?

Multithreading 如何在Perl中处理客户机-服务器通信?,multithreading,perl,client,Multithreading,Perl,Client,我有两个Perl脚本,用于执行以下工作: 服务器启动并等待客户端连接。 客户端连接并以静态方式发送XML文件。 服务器读取XML文件并启动几个线程。 每个线程接收$client socket作为参数,一旦完成,就必须将输出发送回客户端。 在客户端等待消息到达的同时,他应该在命令行上打印这些消息 现在我的问题是我不知道如何实现最后一部分。我尝试使用receive方法,但如果我这样做,两个程序都会卡住 服务器端: my @threads; $server = IO::Socket::INET->

我有两个Perl脚本,用于执行以下工作:

服务器启动并等待客户端连接。 客户端连接并以静态方式发送XML文件。 服务器读取XML文件并启动几个线程。 每个线程接收$client socket作为参数,一旦完成,就必须将输出发送回客户端。 在客户端等待消息到达的同时,他应该在命令行上打印这些消息

现在我的问题是我不知道如何实现最后一部分。我尝试使用receive方法,但如果我这样做,两个程序都会卡住

服务器端:

my @threads;
$server = IO::Socket::INET->new(
            Listen => 1,                
            LocalAddr => 'localhost', 
            LocalPort => '8080', 
            Proto => 'tcp'
) or die "Can't crete socket!\n";
$client = $server->accept;
open FILE, ">".$filename or die "Can't open file!\n";
while (<$client>) {
    print FILE $_;  
}
close FILE;

# READ FILE AND DO SOME OTHER STUFFS
push @threads, threads ->create(\&subroutine1, $parameters, $client);
# OTHER STUFFS
push @threads, threads ->create(\&subroutine2, $parameters, $client);
# MORE THREADS...

sub subroutine1 {
    my @pars= @_;
    my $parameters = $pars[0];
    my $client = $pars[1];
    my $sub1 = `perl other_script.pl $parameters`;
    $client->send($mem);
}
my@threads;
$server=IO::Socket::INET->new(
听着=>1,
LocalAddr=>“localhost”,
LocalPort=>“8080”,
Proto=>“tcp”
)或者死“不能再活下去!\n”;
$client=$server->accept;
打开文件“>”$filename或“无法打开文件!\n”;
而(){
打印文件$;
}
关闭文件;
#阅读文件并做一些其他事情
推送@threads,threads->create(\&subroutine1,$parameters,$client);
#其他东西
推送@threads,threads->create(\&subroutine2,$parameters,$client);
#更多线程。。。
子例程1{
我的@pars=@;
my$parameters=$pars[0];
我的$client=$pars[1];
my$sub1=`perl other_script.pl$parameters`;
$client->send($mem);
}
客户端:

my $server = IO::Socket::INET->new(
    PeerAddr => 'localhost',
    PeerPort => '8080',
    Proto => 'tcp'
) or die "Can't create client socket!\n";
open FILE, $filename;
while (<FILE>) {
    print $server $_;   
}
close FILE;
# HOW DO I READ INFORMATIONS?
$server->close();
my$server=IO::Socket::INET->new(
PeerAddr=>“本地主机”,
PeerPort=>8080',
Proto=>“tcp”
)或“无法创建客户端套接字!\n”;
打开文件,$filename;
而(){
打印$server$;
}
关闭文件;
#如何阅读信息?
$server->close();

您不能将发送部分放入子线程/工作线程中,它将变得混乱

问:为什么多线鸡会过马路

A:另一边。到头来

相反,让父线程/主线程收集子线程的结果,必要时对数据进行排序,序列化,然后作为一个整体发送


您可以使用中的方法进行阅读。

如何检索结果?我现在正在以这种方式使用join():foreach(@threads){$msg=$\->join();print“$msg\n”;#$client->send($msg);}但是print不起作用,我的意思是它什么也不打印。好的,别介意print起作用,但是send不起作用,这两个线程就像以前一样卡住了。客户机现在就是这样工作的:虽然(){print$;}我甚至尝试了$server->recv($msg,$length,0);但实际上我不知道如何定义消息长度。你正在处理一件非常低级的事情,你需要自己处理由此产生的复杂性。您缺少一个协议来定义谁以何种格式发送什么,以及通信伙伴必须期望什么。与其自己发明一个蹩脚的,我的建议是忘记套接字,切换到HTTP。它已经证明了它的价值一万亿倍。你获得了与大量软件的互操作性,你还获得了一个可以向任何方向扩展的巨大生态系统。tl;dr:用Plack编写一个web应用程序,代码将更短,更易于维护。