【发布时间】:2018-08-03 22:57:10
【问题描述】:
有一个客户端和一个服务器通过 stdio 进行通信。我想我基本上对标准输入和标准输出感到困惑。我对 stdio 有一些疑问。
- 服务器是否从客户端写入的标准输入或标准输出读取请求?
- 服务器是否将响应写入客户端可以读取的标准输入或标准输出?
下面是服务器端连接部分的代码sn-p。
case "stdio":
log.Println("server: reading on stdin, writing on stdout")
<-jsonrpc2.NewConn(context.Background(), jsonrpc2.NewBufferedStream(stdrwc{}, jsonrpc2.VSCodeObjectCodec{}), handler, connOpt...).DisconnectNotify()
log.Println("connection closed")
return nil
type stdrwc struct{}
func (stdrwc) Read(p []byte) (int, error) {
return os.Stdin.Read(p)
}
func (stdrwc) Write(p []byte) (int, error) {
return os.Stdout.Write(p)
}
func (stdrwc) Close() error {
if err := os.Stdin.Close(); err != nil {
return err
}
return os.Stdout.Close()
}
【问题讨论】:
-
你从标准输入读取,你写入标准输出。实际上只有一种方法可以做到这一点,并且该代码似乎可以做到这一点。您遇到的具体问题是什么?
-
@JimB 我将其理解为“这应该如何协同工作?即实际上来回传递数据”。希望黛安可以插话并添加上下文。
-
我的理解是任何程序总是写入标准输出并从标准输入读取,并且客户端和服务器都看到相同的标准输入和标准输出。我感到困惑的是,如果服务器向标准输出写入响应,客户端如何从标准输入读取?或者服务器对标准输出的写响应和客户端应该从标准输出读取?服务器和客户端是否看到相同的标准输入和标准输出?
-
每个程序可以写入标准输出并从标准输入读取,但不是必须的。每个程序都有自己的标准输入和标准输出(更多背景here。当你执行一个程序时,你可以在标准输入中传递它或在其他地方引导标准输出。例如
cat /etc/hosts | wc -l你从cat程序中获取标准输出并将其输入wc程序的标准输入,用于读取etc/hosts文件中的行数。 -
我的第一印象是A:程序正在重新定义stdin/stdout,作为http消息的请求/响应,或者B:stdin/stdin用于调试。我不确定“范围”标准输入/标准输出有什么,所以前一种想法对于任何多请求/线程应用程序来说似乎都极具风险。可能来自试图教授仅概念的非常基本的教程?