校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > GO語言如何手動處理TCP粘包詳解

GO語言如何手動處理TCP粘包詳解

熱門標簽:濱州自動電銷機器人排名 釘釘有地圖標注功能嗎 惠州電銷防封電話卡 阿里云ai電話機器人 汕頭小型外呼系統 鄭州亮點科技用的什么外呼系統 浙江高頻外呼系統多少錢一個月 建造者2地圖標注 黃岡人工智能電銷機器人哪個好

前言

一般所謂的TCP粘包是在一次接收數據不能完全地體現一個完整的消息數據。TCP通訊為何存在粘包呢?主要原因是TCP是以流的方式來處理數據,再加上網絡上MTU的往往小于在應用處理的消息數據,所以就會引發一次接收的數據無法滿足消息的需要,導致粘包的存在。處理粘包的唯一方法就是制定應用層的數據通訊協議,通過協議來規范現有接收的數據是否滿足消息數據的需要。在應用中處理粘包的基礎方法主要有兩種分別是以4節字描述消息大小或以結束符,實際上也有兩者相結合的如HTTP,redis的通訊協議等。

應用場景

大部分TCP通訊場景下,使用自定義通訊協議

粘包處理原理:通過請求頭中數據包大小,將客戶端N次發送的數據緩沖到一個數據包中

例如:

請求頭占3個字節(指令頭1字節、數據包長度2字節),版本占1個字節,指令占2個字節

協議規定一個數據包最大是512字節,請求頭中數據包記錄是1300字節,完整的數據包是1307個字節,此時服務器端需要將客戶端3次發送數據進行粘包處理

代碼示例

package server
import (
 "net"
 "bufio"
 "ftj-data-synchro/protocol"
 "golang.org/x/text/transform"
 "golang.org/x/text/encoding/simplifiedchinese"
 "io/ioutil"
 "bytes"
 "ftj-data-synchro/logic"
 "fmt"
 "strconv"
)
/*
 客戶端結構體
 */
type Client struct {
 DeviceID string  //客戶端連接的唯標志
 Conn  net.Conn  //連接
 reader *bufio.Reader //讀取
 writer *bufio.Writer //輸出
 Data  []byte  //接收數據
}
func NewClient(conn *net.TCPConn) *Client {
 reader := bufio.NewReaderSize(conn, 10240)
 writer := bufio.NewWriter(conn)
 c := Client{Conn:conn, reader:reader, writer:writer}
 return c
}
/**
 數據讀取(粘包處理)
 */
func (this *Client)read() {
 for {
  var data []byte
  var err error
  //讀取指令頭 返回輸入流的前4個字節,不會移動讀取位置
  data, err = this.reader.Peek(4)
  if len(data) == 0 || err != nil {
   continue
  }
  //返回緩沖中現有的可讀取的字節數
  var byteSize = this.reader.Buffered()
  fmt.Printf("讀取字節長度:%d\n", byteSize)
  //生成一個字節數組,大小為緩沖中可讀字節數
  data = make([]byte, byteSize)
  //讀取緩沖中的數據
  this.reader.Read(data)
  fmt.Printf("讀取字節:%d\n", data)
  //保存到新的緩沖區
  for _, v := range data {
   this.Data = append(this.Data, v)
  }
  if len(this.Data)  4 {
   //數據包緩沖區清空
   this.Data = []byte{}
   fmt.Printf("非法數據,無指令頭...\n")
   continue
  }
  data, err = protocol.HexBytesToBytes(this.Data[:4])
  instructHead, _ := strconv.ParseUint(string(data), 16, 16)
  //指令頭效驗
  if uint16(instructHead) != 42330 {
   fmt.Printf("非法數據\n")
   //數據包緩沖區清空
   this.Data = []byte{}
   continue
  }
  data = this.Data[:protocol.HEADER_SIZE]
  var p = protocol.Decode(data)
  fmt.Printf("消息體長度:%d\n", p.Len)
  var bodyLength = len(this.Data)  
  /**
   判斷數據包緩沖區的大小是否小于協議請求頭中數據包大小
   如果小于,等待讀取下一個客戶端數據包,否則對數據包解碼進行業務邏輯處理
   */
  if int(p.Len) > len(this.Data) - protocol.HEADER_SIZE {
   fmt.Printf("body體長度:%d,讀取的body體長度:%d\n", p.Len, bodyLength)
   continue
  }
  fmt.Printf("實際處理字節:%v\n", this.Data)
  p = protocol.Decode(this.Data)
  //邏輯處理
  go this.logicHandler(p)
  //數據包緩沖區清空
  this.Data = []byte{}
 }
}

待優化部分:

type Client struct {
 DeviceID string  //客戶端連接的唯標志
 Conn  net.Conn  //連接
 reader *bufio.Reader //讀取
 writer *bufio.Writer //輸出
 Data  []byte  //接收數據
}

結構體中Data屬性可考慮使用bytes.Buffer實現。

Golang標準庫文檔:https://studygolang.com/pkgdoc

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • Go語言服務器開發之簡易TCP客戶端與服務端實現方法
  • GO語言實現簡單TCP服務的方法
  • golang之tcp自動重連實現方法
  • 利用Golang實現TCP連接的雙向拷貝詳解
  • 6行代碼快速解決golang TCP粘包問題
  • Go語言中TCP/IP網絡編程的深入講解

標簽:滄州 昭通 阿壩 瀘州 駐馬店 泰安 晉中 東營

巨人網絡通訊聲明:本文標題《GO語言如何手動處理TCP粘包詳解》,本文關鍵詞  語言,如何,手動,處理,TCP,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《GO語言如何手動處理TCP粘包詳解》相關的同類信息!
  • 本頁收集關于GO語言如何手動處理TCP粘包詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    精品视频1区2区| 99riav久久精品riav| 亚洲精品视频在线| 久久亚洲精品国产精品紫薇| 亚洲自拍欧美精品| 亚洲色欲色欲www| 亚洲男人的天堂在线观看| 国产亚洲成aⅴ人片在线观看| 成人午夜av在线| 国产99久久久国产精品潘金 | 一区二区三区加勒比av| 欧美日韩精品欧美日韩精品一综合| 日韩电影在线一区| 麻豆精品国产传媒mv男同| 久久福利资源站| 国产精品99久久久久久宅男| 成人综合婷婷国产精品久久蜜臀 | 成人ar影院免费观看视频| 国产成人av电影免费在线观看| 亚洲欧美日韩国产中文在线| 亚洲精选在线视频| 婷婷开心久久网| 日本vs亚洲vs韩国一区三区 | 国产精品超碰97尤物18| 亚洲伦理在线免费看| 亚洲综合999| 美女高潮久久久| 成人av网址在线| 欧美日韩不卡一区| 91片黄在线观看| 欧美男女性生活在线直播观看| 国产白丝精品91爽爽久久| 色欲综合视频天天天| 欧美精品精品一区| 久久婷婷久久一区二区三区| 5566中文字幕一区二区电影| 99国内精品久久| 欧美一区二区三区在| 欧美日韩国产综合一区二区| 久久综合国产精品| 91精品福利在线一区二区三区 | 精品捆绑美女sm三区| 5858s免费视频成人| 久久精品一区二区三区四区| 亚洲一区二区三区四区中文字幕| 国产精品久久精品日日| 午夜电影网一区| 91色|porny| 精品播放一区二区| 亚洲国产欧美日韩另类综合| 国产一区在线观看麻豆| 欧美最新大片在线看| 国产女人18毛片水真多成人如厕 | 成人av网在线| 精品国产乱码久久久久久久久| 91精品国产高清一区二区三区蜜臀 | 色视频一区二区| 91国偷自产一区二区三区观看| 99精品视频在线观看| 久久亚洲捆绑美女| 国产精品久久国产精麻豆99网站| 中文字幕欧美一区| 国产露脸91国语对白| 日韩一区二区视频在线观看| 亚洲欧美日韩国产综合在线 | 亚洲第一av色| 97久久精品人人做人人爽50路| 91一区一区三区| 欧美视频自拍偷拍| 一区二区三区四区乱视频| 成人涩涩免费视频| 欧美国产日产图区| 岛国av在线一区| 在线观看91精品国产入口| 亚洲国产精品黑人久久久| 亚洲综合精品久久| 欧洲生活片亚洲生活在线观看| 6080亚洲精品一区二区| 天堂久久一区二区三区| 欧美精品亚洲二区| 日韩高清在线观看| 这里只有精品电影| 免费在线欧美视频| 精品99999| 国产成人亚洲综合色影视| 国产亚洲婷婷免费| 成人午夜在线视频| 亚洲视频综合在线| 日本黄色一区二区| 亚洲成年人影院| 欧美一级二级三级蜜桃| 精品在线亚洲视频| 国产精品乱人伦一区二区| 99久久精品免费| 亚洲精品国产视频| 国产高清不卡一区| 亚洲乱码中文字幕| 国产高清久久久| 亚洲美女一区二区三区| 欧美日韩大陆一区二区| 蜜臀av性久久久久蜜臀av麻豆 | 欧美三级欧美一级| 国产欧美综合在线观看第十页| 同产精品九九九| 日韩一区二区精品葵司在线| 国产精品自在在线| 亚洲人精品午夜| 欧美岛国在线观看| 91在线精品一区二区| 国产日韩欧美不卡| 在线观看中文字幕不卡| 久久99久久久欧美国产| 中文字幕一区av| 精品少妇一区二区三区在线视频| 亚洲一区二区视频在线观看| 日韩视频在线一区二区| 成人在线视频首页| 午夜久久久久久久久久一区二区| 99久久综合色| 日韩成人免费在线| 亚洲欧洲成人av每日更新| 日韩欧美美女一区二区三区| 91毛片在线观看| 国产精品99久久久| 日本成人超碰在线观看| 亚洲免费在线观看| 国产午夜精品一区二区三区视频| 精品一区二区在线看| 亚洲一区二区av电影| 国产精品日产欧美久久久久| 欧美一区二区女人| 免费高清视频精品| 一区二区三区精品在线观看| 欧美亚洲综合网| 国产成人免费在线视频| 久久五月婷婷丁香社区| 777精品伊人久久久久大香线蕉| 午夜视频在线观看一区二区| 亚洲视频免费观看| 亚洲国产岛国毛片在线| 日韩亚洲欧美综合| 9191久久久久久久久久久| 日本电影欧美片| 色妹子一区二区| 成人av高清在线| av激情综合网| 国产99精品在线观看| 国产电影一区二区三区| 青青草原综合久久大伊人精品优势| 26uuu精品一区二区| 欧美tickling网站挠脚心| 大美女一区二区三区| 国产白丝精品91爽爽久久| 国产精品99久| 亚洲一区二区三区四区五区黄| 日韩一区二区三区观看| 欧美二区在线观看| 欧美一级艳片视频免费观看| 91麻豆精品国产91久久久更新时间| 国产老肥熟一区二区三区| **性色生活片久久毛片| 亚洲欧美日本韩国| 国产精品久久久久久亚洲伦| 亚洲欧美日韩国产综合在线 | 欧美日韩情趣电影| 欧美日韩精品系列| 91精品国产综合久久精品图片| 国产精品资源在线看| 国产91露脸合集magnet| 成人丝袜高跟foot| 91久久国产最好的精华液| 欧美影视一区二区三区| 欧美伦理影视网| 精品福利一二区| 国产精品久久三区| 亚洲伦在线观看| 免播放器亚洲一区| 国产成人免费视频网站高清观看视频| 亚洲免费看黄网站| 日韩av在线发布| 国产黄色精品网站| 91黄色免费网站| 欧美精品一区二区三区四区| 国产精品久久久久久久蜜臀| 亚洲国产人成综合网站| 国产精品盗摄一区二区三区| 午夜精品成人在线| 国产一区二区三区免费在线观看| 亚洲mv大片欧洲mv大片精品| 国产在线精品不卡| 色欧美日韩亚洲| 欧美mv和日韩mv国产网站| 亚洲色图制服丝袜| 久久国产乱子精品免费女| 不卡一区在线观看| 成人午夜av电影| 国产精品一区不卡| 欧美三级资源在线| 欧美日韩一区二区三区不卡| 欧美精品一区二区三区一线天视频 |