小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《如何在 Go 中刷新 tcp 套接字?》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
问题内容如何在 Go 中刷新 TCP 套接字?
我在套接字上一次发送一条消息,向客户端指示进度,但消息会聚集在一起并同时发送。我在任何地方都看不到冲洗功能。
消息间隔几秒钟发送,每条消息都是 <100 字节,我将它们发送到本地主机。通过刷新,我的意思是我想清除所有阻止它们流出网络的缓冲区;在这种情况下,它们显然被缓冲在某个地方。
如果 Go 没有公开这一点,我可以深入地狱深处亲自刷新底层缓冲区/套接字吗?
解决方案
正如 @jimb 提到的,你不能 flush()
a net.conn
,所以如果你的数据流出现卡顿,它会在其他地方缓冲。
如果您或数据流中的中间包正在使用例如 bufio
:
w := bufio.newwriter(conn)
if _, err := w.writestring(msg); err != nil {
return err
}
w.flush()
虽然 conn
无法刷新,但 bufio.writer
可以。
但是,如果您的连接是作为纯 io.writer
类型提供的(即仅 write()
方法 - 没有 flush()
),您可以尝试运行时转换/检查以查看它是否是“可刷新的” “:
// var connWriter io.Writer
type Flusher interface {
// Flush sends any buffered data to the client.
Flush() error
}
flushable, ok := connWriter.(Flusher) // runtime interface/type check
if !ok {
log.Println("flushing not supported")
return
}
flushable.Flush()
哎呀!它在客户端的 bash 管道中进行缓冲。删除了 | ts -s '%.t'
我必须尝试测量响应之间经过的时间,现在它可以工作了。
brew 安装expect
和unbuffer my-command -a -b --foo | ts -s '%.t'
在 mac 上解决这个问题,linux 建议在这里 https://unix.stackexchange.com/questions/25372/turn-off-buffering-in-pipe
让问题悬而未决,因为我对我提出的问题得到了很好的答案,这可能对其他人有帮助。
好了,本文到此结束,带大家了解了《如何在 Go 中刷新 tcp 套接字?》,希望本文对你有所帮助!关注编程网公众号,给大家分享更多Golang知识!