Go:高效处理通过TCP接收的碎片数据
我正在编写一个小型tcp服务器,它只负责读取数据、解析接收数据(动态长度帧)并处理这些帧。考虑下面的代码:Go:高效处理通过TCP接收的碎片数据,tcp,go,buffer,Tcp,Go,Buffer,我正在编写一个小型tcp服务器,它只负责读取数据、解析接收数据(动态长度帧)并处理这些帧。考虑下面的代码: func ClientHandler(conn net.Conn) { buf := make([]byte, 4096) n, err := conn.Read(buf) if err != nil { fmt.Println("Error reading:", err.Error()) return } fmt.P
func ClientHandler(conn net.Conn) {
buf := make([]byte, 4096)
n, err := conn.Read(buf)
if err != nil {
fmt.Println("Error reading:", err.Error())
return
}
fmt.Println("received ", n, " bytes of data =", string(buf))
handleData(buf)
这就是我的代码的本质。我将X字节读入一个空缓冲区,然后处理数据
问题发生在以下情况:
谢谢。字节片应该支持非常优化的大小调整(即保留比需要更多的字节,如果可以的话不复制,以指数形式增长,复制代码不是用go编写的,而是运行时的一部分,等等) 因此,您可以使用
append
查看它的工作原理
另一种更惯用的方法是使用bufio.Reader
包装连接,它将自动处理所有这些。我在自己编写的tcp服务器中使用过它,速度非常快。你只要做:
r := bufio.NewReader(conn)
然后你可以一直读到一个定界符,如果你事先知道的话,也可以读到给定的字节数 实际上,我可以使用bufio中的ReadByte和ReadRune。谢谢