第1次写c/s,客户端 给服务端发送消息,平均2秒发1次,运行一段时间后,我停掉客户端,但服务端依然在接收消息。然后要再过一些 时间服务端就接收完了 ,这种是什么原因呢?
发送消息代码 如下
```go
// 自定义消息头
const Msg_Header = "xxxxxxxxx"
// 消息编码(消息头+消息长度+消息内容)
func Encode(bytesBuffer io.Writer, content string) error {
// 1. 向缓冲区(套接字)写入消息头
if err := binary.Write(bytesBuffer, binary.BigEndian, []byte(Msg_Header)); err != nil {
return err
}
// 2. 向缓冲区(套接字)写入消息长度
if err := binary.Write(bytesBuffer, binary.BigEndian, int32(len([]byte(content)))); err != nil {
return err
}
// 3. 向缓冲区(套接字)写入消息内容
return binary.Write(bytesBuffer, binary.BigEndian, []byte(content))
}
```
接收消息代码 如下 :
```go
func Decode(bytesBuffer io.Reader) (content []byte, err error) {
// 1.1 准备一个载体接收消息头, 从缓冲区读取消息头
headerBuf := make([]byte, len(Msg_Header))
if _, err := io.ReadFull(bytesBuffer, headerBuf); err != nil {
return nil, err
}
// 1.2 判断消息头是否对上自定义消息头
if string(headerBuf) != Msg_Header {
return nil, errors.New("msg_header error")
}
// 2 准备一个载体接收消息长度,从剩下的缓冲区继续读取消息长度(int32是4字节长度)
contentLenBuf := make([]byte, 4)
if _, err := io.ReadFull(bytesBuffer, contentLenBuf); err != nil {
return nil, err
}
// 3 利用消息长度准备一个等长的载体(长度字节数组需要解码), 从剩余的缓冲区读取消息
contentLen := binary.BigEndian.Uint32(contentLenBuf)
content = make([]byte, contentLen)
_, err = io.ReadFull(bytesBuffer, content)
return content, err
}
```
有疑问加站长微信联系(非本文作者)