Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Linux 用perl启动客户机-服务器编程的最佳方法?_Linux_Perl_Unix_Client Server - Fatal编程技术网

Linux 用perl启动客户机-服务器编程的最佳方法?

Linux 用perl启动客户机-服务器编程的最佳方法?,linux,perl,unix,client-server,Linux,Perl,Unix,Client Server,我需要用perl编写一个客户机-服务器应用程序。许多客户端将发送请求,并通过服务器进行处理 开发这种客户机-服务器应用程序的最佳方法是什么。我搜索了web,发现LWP和IO::Socket是可能的竞争者 处理多个客户端的最佳方法是什么?这是分叉分离进程还是使用线程来处理许多客户机 这是我第一次对perl上的客户机-服务器编程如此困惑。好的,所以-处理多个并发客户机的问题是需要处理异步传入的数据。通常,从套接字(或文件句柄)读取是一种阻塞操作,这意味着一个客户端将“关闭”其他客户端 有两种主要的方

我需要用perl编写一个客户机-服务器应用程序。许多客户端将发送请求,并通过服务器进行处理

开发这种客户机-服务器应用程序的最佳方法是什么。我搜索了web,发现LWP和IO::Socket是可能的竞争者

处理多个客户端的最佳方法是什么?这是分叉分离进程还是使用线程来处理许多客户机


这是我第一次对perl上的客户机-服务器编程如此困惑。

好的,所以-处理多个并发客户机的问题是需要处理异步传入的数据。通常,从套接字(或文件句柄)读取是一种阻塞操作,这意味着一个客户端将“关闭”其他客户端

有两种主要的方法来处理这个问题-一种是以非阻塞的方式从文件描述符中读取,使用and
can\u read
-然后测试哪个套接字有挂起的IO,处理它并重复

从文档中:

use IO::Select;
use IO::Socket;
$lsn = IO::Socket::INET->new( Listen => 1, LocalPort => 8080 );
$sel = IO::Select->new($lsn);
while ( @ready = $sel->can_read ) {
    foreach $fh (@ready) {
        if ( $fh == $lsn ) {

            # Create a new socket
            $new = $lsn->accept;
            $sel->add($new);
        }
        else {
            # Process socket
            # Maybe we have finished with the socket
            $sel->remove($fh);
            $fh->close;
        }
    }
}
或者,您可以使用
线程
分叉
进行多进程处理—执行此操作时,您可以“拆分”进程,并运行单独的实例,每个实例负责一个客户端

你采取哪种方法在很大程度上取决于你想要完成什么
fork
对于快速高效的启动特别有用,因为它是在POSIX操作系统上本机实现的。然而,它对于进程间通信(IPC)来说并不友好,所以如果您的客户端需要通信。。。就我个人而言,我不会

如注释中所述,一些基本的分叉代码可以在

线程与分叉类似——perl文档不推荐使用它,因为它不是轻量级的。但是它确实使线程之间的通信过程变得更加容易。我建议如果您这样做,您可以查看
threads
threads::shared
Thread::Queue

使用非阻塞读取方法意味着您可以潜在地完成所有这一切,而无需使用fork或thread,但只有在每次迭代都做“小”事情时,它才真正起作用-每个传入的客户端都会在您处理下一次迭代时暂停,这可能意味着更多的延迟。(但这可能无关紧要)


Perlmonks还有一些不同客户机类型的示例:

好的,因此-处理多个并发客户机的问题是您需要处理非同步的传入数据。通常,从套接字(或文件句柄)读取是一种阻塞操作,这意味着一个客户端将“关闭”其他客户端

有两种主要的方法来处理这个问题-一种是以非阻塞的方式从文件描述符中读取,使用and
can\u read
-然后测试哪个套接字有挂起的IO,处理它并重复

从文档中:

use IO::Select;
use IO::Socket;
$lsn = IO::Socket::INET->new( Listen => 1, LocalPort => 8080 );
$sel = IO::Select->new($lsn);
while ( @ready = $sel->can_read ) {
    foreach $fh (@ready) {
        if ( $fh == $lsn ) {

            # Create a new socket
            $new = $lsn->accept;
            $sel->add($new);
        }
        else {
            # Process socket
            # Maybe we have finished with the socket
            $sel->remove($fh);
            $fh->close;
        }
    }
}
或者,您可以使用
线程
分叉
进行多进程处理—执行此操作时,您可以“拆分”进程,并运行单独的实例,每个实例负责一个客户端

你采取哪种方法在很大程度上取决于你想要完成什么
fork
对于快速高效的启动特别有用,因为它是在POSIX操作系统上本机实现的。然而,它对于进程间通信(IPC)来说并不友好,所以如果您的客户端需要通信。。。就我个人而言,我不会

如注释中所述,一些基本的分叉代码可以在

线程与分叉类似——perl文档不推荐使用它,因为它不是轻量级的。但是它确实使线程之间的通信过程变得更加容易。我建议如果您这样做,您可以查看
threads
threads::shared
Thread::Queue

使用非阻塞读取方法意味着您可以潜在地完成所有这一切,而无需使用fork或thread,但只有在每次迭代都做“小”事情时,它才真正起作用-每个传入的客户端都会在您处理下一次迭代时暂停,这可能意味着更多的延迟。(但这可能无关紧要)


Perlmonks还提供了一些不同客户机类型的示例:

它将是web服务器还是其他什么。很多时候,在套接字编程中,您可以通过线程连接服务器来接受多个客户端。它本质上不是web服务器。从客户端计算机,一些请求将转到服务器,根据请求中的内容,服务器将在服务器计算机上运行一些函数,并将这些函数的输出作为响应返回给客户端。Net::server提供了一些框架它将是web服务器还是其他什么。很多时候,在套接字编程中,您可以通过线程连接服务器来接受多个客户端。它本质上不是web服务器。从客户端计算机,一些请求将转到服务器,根据请求中的内容,服务器将在服务器计算机上运行一些函数,并将这些函数的输出作为响应返回给客户端。Net::server提供了一些框架感谢您的回答。根据你的回答,我正在考虑使用fork方法。对于每个客户端连接,我可以在服务器上简单地进行分叉。我的客户机只需向服务器发送一些参数,比如说foo和服务器将在服务器机器上运行与foo对应的脚本或命令,并将脚本生成的响应返回给客户机。fork对这个用例不好吗?不,fork可以。fork崩溃的地方在于,如果连接的客户端需要彼此通信,那么你就必须开始做各种各样的伪造工作,让它们同步和通信。哦,那么我对fork很好,因为在我的情况下,客户端永远不必彼此通信。非常感谢你的帮助。提供了一个分叉tcp套接字服务器(和客户端)的完整示例,感谢您的回答。根据你的回答,我正在考虑使用fork方法。对于每个客户端连接,我可以简单地