通过stdio的服务器客户端连接

时间:2018-08-03 22:57:10

标签: go stdout stdin

有一个通过stdio通信的客户端和服务器。我认为我对stdin和stdout基本上感到困惑。我对stdio有一些疑问。

  1. 服务器是否从客户端写入的stdin或stdout中读取请求?
  2. 服务器是否向客户端可以读取的stdin或stdout写入响应?

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

希望对您有帮助!