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