Golang - 劫持参数

Golang - Hijack Arguments

Hijack()http.ResponseWriter 实例一起使用时

Hijack() (net.Conn, *bufio.ReadWriter, error)

阅读 net.Conn*bufio.ReadWriter 有什么区别?

它们的区别在于缓冲IO。

net.Conn 实现 Read() 和 Write() 从而实现 io.Reader 和 io.Writer。这就是为什么 bufio 可以将其包装为 buffered ReadWriter 并进一步以缓冲方式使用这两种方法在顶部实现功能。

如果您只想使用 Read() 和 Write(),您可以坚持使用 net.Conn,否则您可以利用缓冲的 ReadWriter 方法。

https://golang.org/pkg/io/#Reader and https://golang.org/pkg/io/#Writer

net.Conn.Read*bufio.ReadWriter.Read 都从同一个连接读取,但后者被缓冲。标准 "net/http" 中的 Hijack 方法直接将 returns 包装在 bufio.ReadWriter 中的 net.Conn,使用已经分配给的相同 *bufio.Reader http 请求。

bufio.Reader 中可能仍有缓冲的数据,您在直接从网络连接读取时可能会错过这些数据。如果你想直接使用net.Conn,你应该检查Reader.Buffered是否已经有缓冲数据,并根据使用的协议处理。

一般来说,您应该更喜欢使用 bufio.ReadWriter,因为对于非最佳大小的网络读取和写入,它会更有效。

仍然需要 net.Conn 来处理读取和写入截止日期、完成后关闭 net.Conn 以及任何其他特定于网络的活动。