请问下为什么客户端已经停掉了,但服务端还在接收消息?

taatcc · · 502 次点击 · 开始浏览    置顶
第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 } ```

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

502 次点击  
加入收藏 微博
2 回复  |  直到 2021-08-27 15:52:20
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传