0

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

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

4

1 回答 1

2

因为<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
}
于 2012-12-25T04:30:56.080 回答