【问题标题】:what are the return values of a http.Hijacker?http.Hijacker 的返回值是多少?
【发布时间】:2019-09-03 20:40:58
【问题描述】:

Go 标准库中定义的 http.Hijacker 具有 Hijack() 方法,具有以下签名:

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

前两个返回值是什么意思? net.Conn*bufio.ReadWriter 都有 Write() 方法。两者有什么区别?我应该使用哪一个向网络发送数据?

【问题讨论】:

  • Th Hijacker example 似乎相关。一种是原始连接,另一种是缓冲连接,根据您的程序使用所需的连接。
  • @JimB 该示例似乎仅使用*bufio.ReadWriterConn 仅在最后关闭它。也许这就是它的本意?还是有真正的选择?

标签: go


【解决方案1】:

返回的net.ConnReadWriter.Reader 的底层io.ReaderReadWriter.Writer 的底层io.Writer

ReadWriter.Reader 可以包含从客户端缓冲的数据。 ReadWriter.Writer 是在 Hijack 实现中创建的,可以忽略。

如果应用程序正在从客户端读取并且客户端数据可能已被缓冲,则应用程序必须从 ReadWriter.Reader 读取至少 Reader.Buffered() 字节,然后才能直接从 net.Conn 读取。

如果应用程序要使用bufio包来缓冲网络IO,那么应用程序可以通过使用返回的bufio.Readerbufio.Writer来减少内存分配的次数。

否则,应用程序可以直接使用net.Conn进行读写。

如果应用程序确实使用 bufio.Writer 而不是直接写入 net.Conn,则应用程序可能需要通过调用 Writer.Flush 显式刷新缓冲区。

应用程序必须使用 net.Conn 关闭连接并设置截止日期。

在早期版本的 net/http 包中,服务器使用 bufio.Writer 进行网络 IO,并从 Hijack 方法返回该 bufio.Writer。当实现更改为使用不同的缓冲机制时,bufio.Writer 的创建被移至 Hijack 方法。

一些例子:

Server sent events:可以忽略 ReadWriter.Reader,因为应用程序不会从连接中读取。使用 ReadWriter.Writer 减少分配。

WebSockets:客户端在发送握手请求之后,在收到握手响应之前发送数据是错误的。鉴于此,数据不应在 ReadWriter.Reader 中缓冲。在可能使用Reader.Buffered() != 0 检查意外数据后,应用程序可以选择忽略 ReadWriter.Reader。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-06
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2020-12-13
    相关资源
    最近更新 更多