我正在阅读 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:哦!! Duh ...我的解决方案只有在服务器为客户端发送的每一行发送一条行时才有效。如果服务器可以发送未知数量的行作为响应,我将不得不坐在“从服务器读取”循环 - 这将永远不会结束,除非我的协议定义了一些特殊的“响应结束”令牌。通过在单独的进程中处理发送和接收,您可以将其留给终端处的用户以检测“响应结束”。
(我想知道它是客户端还是服务器,通常会生成一个命令提示符?我一直认为它是客户端,但现在我认为它更适合成为服务器。)
答案 0 :(得分: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
}