Golang实现简单tcp服务器04 -- 服务器的粘包处理
服务器的粘包处理什么是粘包 一个完成的消息可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这个就是TCP的拆包和封包问题 TCP粘包和拆包产生的原因
TCP粘包和拆包的解决策略
参考(http://www.52php.cn/article/p-eokjffzs-g.html) 我们的处理方式 解决粘包问题有多种多样的方式,我们这里的做法是:
在实验环境中的主文件夹内,新建一个名为codec的文件夹在其之下新建一个文件codec.go,将我们的Encode和Decode方法写入其中,这里给出Encode与Decode相应的代码: codec.go package codec import ( "bufio" "bytes" "encoding/binary" ) func Encode(message string) ([]byte,error) { // 读取消息的长度 var length int32 = int32(len(message)) var pkg *bytes.Buffer = new(bytes.Buffer) // 写入消息头 err := binary.Write(pkg,binary.LittleEndian,length) if err != nil { return nil,err } // 写入消息实体 err = binary.Write(pkg,[]byte(message)) if err != nil { return nil,err } return pkg.Bytes(),nil } func Decode(reader *bufio.Reader) (string,error) { // 读取消息的长度 lengthByte,_ := reader.Peek(4) lengthBuff := bytes.NewBuffer(lengthByte) var length int32 err := binary.Read(lengthBuff,&length) if err != nil { return "",err } if int32(reader.Buffered()) < length+4 { return "",err } // 读取消息真正的内容 pack := make([]byte,int(4+length)) _,err = reader.Read(pack) if err != nil { return "",err } return string(pack[4:]),nil } 这里就不帖服务器与客户端的调用代码了,同学们自己动手试试~ 相关源码: https://git.oschina.net/victoriest/go-simple-tcp-server.git (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |