TCP是一种流媒体协议;一串字节。这就是文件传输协议在TCP上发明/实现的原因,如FTP(文件传输协议)。
但是(不推荐/思想实验)如果你可以发送不包含特定字符/字节的块(如base64 + \ n作为那个特定字符),那么你可以使用该特定字符作为分隔符。
现在,如果我们使用类似这样的功能处理我们之间的联系:
func (srv *Server) handler(conn net.Conn) {
//...
defer srv.closeConnection(conn, nil)
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)
//...
conn.SetDeadline(time.Now().Add(conf.ClientTimeout))
for {
select {
case <-conf.QuitSignal:
return
default:
line, err := reader.ReadBytes('\n')
if err != nil {
return
}
//...
}
conn.SetDeadline(time.Now().Add(conf.ClientTimeout))
}
}
func (srv *Server) closeConnection(conn net.Conn, err error) {
conn.Close()
//...
}
从Reader.ReadBytes
文件,我们读到的ReadBytes回报犯错=零当且仅当返回的数据并没有结束!在分隔符。这样我们就可以识别出碎块。
这是TCP的工作原理。您需要一些更高级别的协议来确定连接是否提前关闭。 – JimB
@JimB是对的。 TCP是一种“流式”协议,可以流式传输字节,而不是基于数据包/数据块的协议。 –
那么,Go怎么知道EOF是意外的? – immibis