session中Read方法实现粘包拆包处理
定义简单协议,数据包头由4字节构成:
第1位固定为’$’
第2-3位为Body长度(uint16)
第4位固定为’#’
接收数据时若第1位和第4位不正确则认为接收到异常数据,同时关闭socket连接
本文代码查看github:
https://github.com/zboyco/go-server/tree/step-8
为了实现粘包拆包处理,我们自己实现一个buffer类来管理数据
在server目录中增加buffer.go,这里主要参考了https://studygolang.com/articles/12088
完整代码如下
buffer.go
package server
import (
"errors"
"io"
)
type buffer struct {
reader io.Reader //
buf []byte //缓存
start int //有效位开始索引
end int //有效位结束索引
}
func newBuffer(reader io.Reader, len int) *buffer {
buf := make([]byte, len)
return &buffer{
reader, buf, 0, 0}
}
func (instance *buffer) len() int {
return instance.end - instance.start
}
//cleanBuf 清理缓存中已提取的数据
func (instance *buffer) cleanBuf() {
if instance.start == 0 {