http.Hijacker的返回值是多少?

时间:2019-09-03 20:40:58

标签: go

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

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

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

1 个答案:

答案 0 :(得分:4)

返回的net.Connio.Reader的基础ReadWriter.Readerio.Writer的基础ReadWriter.Writer

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

如果应用程序正在从客户端读取数据,并且有可能缓冲了客户端数据,则在直接从net.Conn读取数据之前,应用程序必须至少从ReadWriter.Reader中读取Reader.Buffered()个字节。

>

如果应用程序要使用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。