首页 > 解决方案 > 如何在 Go 中刷新 tcp 套接字?

问题描述

如何在 Go 中刷新 tcp 套接字?

我正在通过套接字一次发送一条消息,向客户端指示进度,但是这些消息会聚集在一起并同时发送。我在任何地方都看不到刷新功能。

消息间隔几秒钟发送,每个消息<100字节,我将它们发送到本地主机。通过冲洗,我的意思是我想清除任何阻止它们从电线上出来的缓冲区;在这种情况下,它们显然在某处被缓冲。

如果 Go 不公开这一点,我可以深入到地狱深处自己刷新底层缓冲区/套接字吗?

标签: gotcpflush

解决方案


正如@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()

推荐阅读