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]byte
for {
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
实时性比较好
```go
func 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]byte
n, 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
}
)
}