perlipc - 带有 IO::Socket 的交互式客户端 - 为啥要分叉?

Posted

技术标签:

【中文标题】perlipc - 带有 IO::Socket 的交互式客户端 - 为啥要分叉?【英文标题】:perlipc - Interactive Client with IO::Socket - why does it fork?perlipc - 带有 IO::Socket 的交互式客户端 - 为什么要分叉? 【发布时间】:2012-12-25 04:09:48 【问题描述】:

我正在阅读 perlipc perldoc,对标题为“带有 IO::Socket 的交互式客户端”的部分感到困惑。它显示了一个客户端程序,它与某个服务器连接并发送消息,接收响应,发送另一条消息,接收响应,无限循环。作者 Tom Christiansen 指出,将客户端编写为单进程程序会“更加困难”,并继续展示一个实现,该实现派生一个专用于读取 STDIN 并发送到服务器的子进程,而父进程读取来自服务器并写入 STDOUT。

我了解这是如何工作的,但我不明白为什么将其编写为单进程程序不会更更简单(而不是更难):

while (1) 
    read from STDIN
    write to server
    read from server
    write to STDOUT

也许我没有抓住重点,但在我看来这是一个不好的例子。您是否真的设计了一个客户端/服务器应用程序协议,服务器可能会突然想到其他内容,将字符插入到客户端正在输入下一个查询的终端上?

更新 1: 我了解示例允许异步性;我感到困惑的是,为什么 CLI 客户端和服务器之间的并发 I/O 永远是可取的(由于终端)。我想不出任何 CLI 应用程序(无论是否是客户端/服务器)都能做到这一点。

更新 2: 哦!呃......我的解决方案只有在客户端发送的每一行都恰好行从服务器发送时才有效。如果服务器可以发送未知数量的行作为响应,我将不得不坐在“从服务器读取”循环中——这永远不会结束,除非我的协议定义了一些特殊的“响应结束”令牌。通过在单独的进程中处理发送和接收,您可以将其留给终端用户来检测“响应结束”。

(我想知道是客户端还是服务器通常会生成命令提示符?我一直认为它是客户端,但现在我认为它是服务器更有意义。)

【问题讨论】:

取决于协议。只有当协议完全同步时,您的代码才有效。 perlipc 中的代码可以处理更多的异步。 ssh, telnet, HTTP with Keep-Alive, ..., 具有多个并发客户端的单线程服务器。 但是我相信每个客户端和服务器之间的协议是同步的。 ssh 和 telnet clients 是否能够同时从服务器接收和发送到服务器? 不,我提到的任何三个都不是这种情况。这些是异步协议的示例。 【参考方案1】:

因为<STDIN> 读取请求可能会阻塞,所以在单个进程中执行相同的操作需要更复杂的异步处理输入/输出函数:

while (1) 
    if there is data in STDIN
       read from stdin
       write to server
    if there is data from server
       read from server
       write to STDOUT

【讨论】:

以上是关于perlipc - 带有 IO::Socket 的交互式客户端 - 为啥要分叉?的主要内容,如果未能解决你的问题,请参考以下文章

更改 Socket.IO 静态文件服务路径

Angular 6 和 Socket.IO - Socket.On 不工作

/socket.io/socket.io.js 中不提供 Socket.io

Express.js 'socket.io/socket.io.js 404'

socket.io 中文手册 socket.io 中文文档

socket.io 中文手册 socket.io 中文文档