golang网络承插粘包问题的解决方法

  

本文实例讲述了golang网络承插粘包问题的解决方法。分享给大家供大家参考,具体如下:

  

看到很多人问这个问题,今天就写了个例子,希望能帮助大家

  

首先说一下<强>什么是粘包:百度上比较通俗的说法是指。

  

解决方案如下:

  

<>强服务端:
  强代码如下:包主要
  导入(
  ,,“字节”
  ,,“编码/二进制”
  ,,“fmt”
  ,,“输入输出”
  ,,“净”
  )
  函数main () {
  ,,//监听端口
  ,,ln,犯错:=净。听(“tcp”、“: 6000”)
  ,,如果犯错!=nil {
  ,,,,,,fmt。Printf(“听错误:% s \ n”,犯错)
  ,,,,,,返回
  ,,}
  ,,//监听循环
  ,,为{
  ,,,,,,//接受客户端链接
  ,,,,,,康涅狄格州,犯错:=ln.Accept ()
  ,,,,,,如果犯错!=nil {
  ,,,,,,,,,,fmt。Printf(“接受错误:% s \ n”,犯错)
  ,,,,,,,,,,继续
  ,,,,,,}
  ,,,,,,//处理客户端链接
  ,,,,,,去handleConnection(康涅狄格州)
  ,,}
  }
  func handleConnection(康涅狄格州net.Conn) {
  ,,//关闭链接
  ,,推迟conn.Close ()
  ,,//客户端
  ,,fmt。Printf(“客户:% s \ n”, conn.RemoteAddr ())
  ,,//消息缓冲
  ,,msgbuf:=字节。NewBuffer(使(10240)[]字节0)
  ,,//数据缓冲
  ,,databuf:=([]字节,4096)
  ,,//消息长度
  ,,长度:=0
  ,,//消息长度uint32
  ,,ulength:=uint32 (0)
  ,,//数据循环
  ,,为{
  ,,,,,,//读取数据
  ,,,,,,n,犯错:=conn.Read (databuf)
  ,,,,,,如果做错了==OF {
  ,,,,,,,,,,fmt。Printf("客户端退出:% s \ n ", conn.RemoteAddr ())
  ,,,,,,}
  ,,,,,,如果犯错!=nil {
  ,,,,,,,,,,fmt。Printf("读取错误:% s \ n”,犯错)
  ,,,,,,,,,,返回
  ,,,,,,}
  ,,,,,,fmt.Println (databuf [n]):
  ,,,,,,//数据添加到消息缓冲
  ,,,,,,n,呃=msgbuf.Write (databuf [n]):
  ,,,,,,如果犯错!=nil {
  ,,,,,,,,,,fmt。Printf("缓冲区写错误:% s \ n ",犯错)
  ,,,,,,,,,,返回
  ,,,,,,}
  ,,,,,,//消息分割循环
  ,,,,,,为{
  ,,,,,,,,,,//消息头
  ,,,,,,,,,,如果长度==0,,祝辞msgbuf.Len ()=4 {
  ,,,,,,,,,,,,,,二进制文件。读(msgbuf,二进制。LittleEndian及ulength)
  ,,,,,,,,,,,,,,长度=int (ulength)
  ,,,,,,,,,,,,,,//检查超长消息
  ,,,,,,,,,,,,,,如果长度比;10240年{
  ,,,,,,,,,,,,,,,,,,fmt。Printf("消息太长:% d \ n”,长度)
  ,,,,,,,,,,,,,,,,,,返回
  ,,,,,,,,,,,,,,}
  ,,,,,,,,,,}
  ,,,,,,,,,,//消息体
  ,,,,,,,,,,如果长度比;0,,msgbuf.Len()在长度={
  ,,,,,,,,,,,,,,fmt。Printf(“客户信息:% s \ n”字符串(msgbuf.Next(长度)))
  ,,,,,,,,,,,,,,长度=0
  null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

golang网络承插粘包问题的解决方法