Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Go中刷新tcp套接字?_Go_Tcp_Flush - Fatal编程技术网

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

如何在Go中刷新tcp套接字?,go,tcp,flush,Go,Tcp,Flush,如何在Go中刷新tcp套接字 我通过一个套接字一次发送一条消息,指示客户端的进度,但是这些消息会聚集在一起并同时发送。我在任何地方都看不到刷新功能 消息相隔几秒钟发送,正如@JimB提到的,它们是的,你不能刷新net.Conn,因此如果你的数据流是断断续续的,它会被缓冲到其他地方 如果您(或数据流中的中间包)正在使用例如bufio: 虽然不能刷新conn,但bufio.Writer可以 但是,如果您的连接是以纯io.Writer类型提供给您的,即仅限Write方法-无刷新,则您可以尝试运行时转换

如何在Go中刷新tcp套接字

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


消息相隔几秒钟发送,正如@JimB提到的,它们是的,你不能刷新net.Conn,因此如果你的数据流是断断续续的,它会被缓冲到其他地方

如果您(或数据流中的中间包)正在使用例如bufio:

虽然不能刷新conn,但bufio.Writer可以

但是,如果您的连接是以纯io.Writer类型提供给您的,即仅限Write方法-无刷新,则您可以尝试运行时转换/检查以查看其是否可刷新:

// 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并取消缓冲我的命令-a-b-foo | ts-s“%.T”,以便在mac上解决此问题,这里是linux建议


因为我提出的问题得到了很好的答案,所以这个问题没有答案,这可能会对其他人有所帮助。

没有刷新方法,因为您无法刷新TCP套接字。你到底想做什么?TCP做的是“聚束”即片段聚合。这是正常和可取的。这是字节流协议,不是消息传递协议。您必须对接收应用程序进行相应的编码。但是这不会有帮助。Nagle算法和TCP的正常运行仍然会导致段合并。接收方不需要假定它是一个消息传递协议。不是。@user207421我以为是纳格尔算法。他关心的是效率?如果你不在乎额外的比特/字节是通过网络发送的——而你真正想要的是实时传输——那么这当然是可能的。1字节的击键通过telnet实时发送,是的,在两个方向上都会额外花费许多字节。@colminator:nagle的算法只是发送段之前TCP堆栈检查的众多测试之一。禁用它可以减少延迟,但仍然不能保证每次写入都作为单独的数据包发送。@colminator“当然可以”的意思是什么?在TCP中,发送和接收之间没有保证的1::1关联。在Telnet示例中,击键确实可能一次发送一个,但不能保证服务器会以这种方式接收击键,Nagle算法的目的不是确保非合并接收。
// 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()