服务器客户端连接通过 stdio

server client connection through stdio

有一个客户端和一个服务器通过stdio进行通信。我想我基本上对标准输入和标准输出感到困惑。我对 stdio 有一些疑问。

  1. 服务器是否从客户端写入的stdin或stdout读取请求?
  2. 服务器是否将响应写入客户端可以读取的标准输入或标准输出?

下面是服务器端连接部分的代码片段。

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()
}

很难说这个程序在做什么(因为只有一部分)。看起来你有一个 ReadWriteCloser 的实现,它从 stdin 读取并写入 stdout(以及 switch 语句的一部分)。

通常任何程序都可以从标准输入读取并写入标准输出(和标准错误)。您可以使用管道(例如 client | server)将一个程序的标准输出 link 输出到另一个程序的标准输入,但这是单向的。在您的情况下,听起来您希望客户端的标准输入转到服务器的标准输出,反之亦然。在本地开发中,通常使用 Unix 套接字,但您可以创建命名管道(使用 mkfifo),如 here.

所示

此外,从不包含 jsonrpc2 和任何其他包的超级简单的玩具程序开始可能更容易。

希望对您有所帮助!