TCP粘包与处理
粘包:
- 客户端使用nagle算法,将传输的小数据合并
- 服务端的接受不及时
golang的处理:
对数据报进行封包和拆包的操作
- 封包:给一段数据加上包头
- 拆包,把头部拆掉
要处理粘包,要封包。给一段数据加上包头,包头长度固定,存储了包体的大小,这样解析就可以根据胞体长度拆分出一个完整的数据包 ```go func Encode(message string) ([]byte, error){ // 读取消息的长度,转换成int32类型(占4个字节) var length = int32(len(message)) var pkg = new(bytes.Buffer) // 写入消息头 err := binary.Write(pkg, binary.LittleEndian, length) if err != nil {// 出现粘包,没有处理粘包现象func process(conn net.Conn){defer conn.Close()reader := bufio.NewReader(conn)var bug [1024]bytefor {n,err := reader.Read(buf[:])if err == io.EOF{break}if err != nil {fmr.Println("read from client failed")break}recvStr := string(buf[:n])fmt.Println("收到发送的数据")}}
} err = binary.Write(pkg, binary.LittleEndian, []byte(message)) if err != nil{return nil, err
} }return nil,err
func Decode(reader *bufio.Reader) (string, error){}
<a name="nmgyN"></a># UDP socket实时性比较好```gofunc main(){listen, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4(0,0,0,0),Port: 30000,})if err != nil {fmr.Println("listen failed, err:", err)return}for (var data [1024]byten, addr, err := listne.ReadFromUDP(data[:]) // 接收数据if err != nil {fmt.Println("read failed, err", err)}fmt.Println("data:%v addr:%v count:%v\n", string(data[n]), addr, n)_,err = listen.WriteToUDP(data[:n], addr) // 发送数据if err != nil {fmt.Printlen("write to udp failed, err", err)continue})}
