【问题标题】:Golang - Hijack ArgumentsGolang - 劫持参数
【发布时间】:2016-02-22 20:07:01
【问题描述】:

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

Hijack() (net.Conn, *bufio.ReadWriter, 错误)

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

【问题讨论】:

  • *bufio.ReadWriter 是底层net.Conn 的缓冲区IO。您是在问为什么要使用缓冲读取吗?
  • 啊,我明白了。不,我只是很困惑为什么有两种方法可以获取相同的数据... :) 谢谢!

标签: http go go-http


【解决方案1】:

net.Conn.Read*bufio.ReadWriter.Read 都从同一个连接读取,但后者是缓冲的。标准“net/http”包中的Hijack 方法直接返回包裹在bufio.ReadWriter 中的net.Conn,使用已经为http 请求分配的*bufio.Reader

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

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

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

【讨论】:

  • 如果协议规定客户端必须等待服务器的响应才能在 HTTP 请求标头之后写入数据,那么服务器应用程序可以忽略 checking for a client error 之后的 bufio 包装器。 websocket 协议就是一个例子。
  • 非常感谢大家!我是新手,像你这样的人鼓励我不要放弃!对此,我真的非常感激!再次感谢!
【解决方案2】:

它们的区别在于缓冲 IO。

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

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

https://golang.org/pkg/io/#Readerhttps://golang.org/pkg/io/#Writer

【讨论】:

  • 缓冲IO和非缓冲IO是有区别的。
  • 好的,但您只更正了第一个语句。即使你“只打算使用 Read() 和 Write()”,你仍然经常需要缓冲 IO。
  • 缓冲 IO 是可选的,所以我刚才澄清了。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2012-12-27
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多