You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中Bufio Writer无法写入TCP连接问题求助

问题分析与解决方法

我之前做Go服务器的时候也踩过bufio这个坑!你遇到的核心问题几乎可以肯定是bufio.Writer的缓冲没有被主动刷新——毕竟bufio系列的Writer是带内存缓冲的,它不会像直接调用conn.Write()那样立刻把数据发送到底层TCP连接,而是先把数据攒在内存里,要么等缓冲满了自动刷,要么得你手动调用Flush()触发写入。直接用连接写能正常工作,就是因为跳过了缓冲这一步,数据直接被发送出去了。

具体解决步骤

  1. 写完数据后必须调用Flush()
    你可以检查下自己的代码,是不是只调用了writer.Write()或者writer.WriteString(),却漏掉了关键的Flush()?比如错误的写法:

    // 错误示例:写完没刷新,数据留在缓冲里
    writer := bufio.NewWriter(conn)
    writer.WriteString("Response to client")
    // 这里没有Flush,客户端永远收不到数据
    

    正确的写法应该是:

    writer := bufio.NewWriter(conn)
    _, err := writer.WriteString("Response to client")
    if err != nil {
        fmt.Printf("Write error: %v\n", err)
        return
    }
    // 手动刷新缓冲,把数据推送到连接
    err = writer.Flush()
    if err != nil {
        fmt.Printf("Flush error: %v\n", err)
        return
    }
    
  2. 循环写入时的刷新时机
    如果是在循环里持续给客户端发数据,建议在每次逻辑写完后就调用Flush();如果是按行交互的场景,可以在发送内容末尾加上换行符后立刻Flush,避免客户端一直阻塞等待读取触发条件。

  3. 连接关闭前的最后刷新
    当你要关闭连接前,一定要记得先调用Flush(),不然缓冲里剩余的未发送数据会直接丢失,不会被自动发送。

额外提醒

如果你的客户端是按行读取数据(比如用bufio.Reader.ReadLine()),那除了Flush,还要确保发送的内容末尾带有换行符,不然客户端可能会一直阻塞等待换行触发读取。

内容的提问来源于stack exchange,提问作者Jmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:32:10