go - 如何在 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()
推荐阅读
- javascript - 登录护照js后没有重定向
- python - 使用 PySide2 和 QtQuick 运行 python 文件时出现错误“无法为模块“QtQuick.Window”加载插件
- c# - 通过从组合框中选择类属性名称对列表进行排序
- javascript - 无法使用 .map() 分配给只读属性。使用 NextJs 反冲
- image - 如何使用 ScrollView Image SwiftUI 删除 Zstack 中的顶部安全区域
- java - 使用java在特定点拆分字符串直到特定点
- java - 为什么 Arrays.sort(T[] a, Comparator c) 将 T 推断为 2d 数组的对象?
- python - 计算列表列表中的出现次数python
- android - 如何在 BottomAppBar 中将 CardView 的底部边缘设置为 Fab 形状?
- php - MongoDB 使用过滤器查询嵌套文档