亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

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

2020-04-01 19:00:41
字體:
來源:轉載
供稿:網友

前言

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

應用場景

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

go,tcp,粘包,go語言,tcp粘包處理

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

例如:

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

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

代碼示例

package serverimport ( "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

總結

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美电影在线观看| 国产日韩欧美成人| 久久久精品2019中文字幕神马| 高清欧美性猛交xxxx| 国产精品综合久久久| 91沈先生作品| 欧美成人中文字幕| 中文精品99久久国产香蕉| 欧美日韩中国免费专区在线看| 亚洲r级在线观看| 亚洲天堂成人在线| 欧美日韩国产影院| 色噜噜久久综合伊人一本| 亚洲丝袜在线视频| 日韩欧美中文字幕在线观看| 久久99久久亚洲国产| 91免费看国产| 亚洲人在线视频| 欧美影院在线播放| 日韩精品高清在线| 色综合久久天天综线观看| 欧美在线视频观看免费网站| 亚洲精品自拍视频| 91免费看国产| 97婷婷大伊香蕉精品视频| 精品无人区乱码1区2区3区在线| 国产精品久久久久久婷婷天堂| 国产日韩欧美在线视频观看| 国产免费一区二区三区在线观看| 亚洲欧洲在线观看| 97精品国产97久久久久久春色| 国产69精品久久久| 国产精品高潮在线| 亚洲男人天堂视频| 国产欧美中文字幕| 国产拍精品一二三| 精品久久久国产精品999| 精品久久久999| 一色桃子一区二区| 日韩大胆人体377p| 亚洲理论在线a中文字幕| 久久久久久69| 欧美日韩国产成人在线观看| 欧美日韩高清在线观看| 国产精品jizz在线观看麻豆| 777国产偷窥盗摄精品视频| 68精品国产免费久久久久久婷婷| 欧美久久精品一级黑人c片| 91最新国产视频| 丰满岳妇乱一区二区三区| 亚州精品天堂中文字幕| 免费av一区二区| 国产99久久精品一区二区 夜夜躁日日躁| 午夜精品久久久久久久久久久久| 国产精品视频区| 亚洲一区二区久久久久久久| 亚洲女人天堂网| 日韩在线观看av| 丝袜美腿亚洲一区二区| 久久成人精品电影| 国产主播在线一区| 丝袜一区二区三区| 久久精品中文字幕免费mv| 国产亚洲一区二区在线| 国产91亚洲精品| 日韩欧美在线免费观看| 亚洲欧美三级伦理| 免费91在线视频| 色噜噜狠狠色综合网图区| 中文字幕精品在线视频| 亚洲天堂网站在线观看视频| 亚洲美女av电影| 精品国产户外野外| 亚洲一区二区中文| 九九久久精品一区| 91精品在线国产| 成人做爽爽免费视频| 成人在线视频网站| 91精品视频专区| 日韩欧美国产成人| 国产成人精品视| 欧美日韩高清区| 91免费福利视频| 亚洲成人网在线观看| 国产福利精品av综合导导航| 亚洲第一网中文字幕| 69久久夜色精品国产69乱青草| 日产精品久久久一区二区福利| 中文字幕亚洲综合久久| 久久久久久久久中文字幕| 亚洲精品www久久久| 国产精品久久久久免费a∨| 日韩最新中文字幕电影免费看| 一区二区三区在线播放欧美| 国产精品福利在线观看| 4388成人网| 麻豆成人在线看| 久久久久久久久电影| 日韩av成人在线| 欧美久久久精品| 国产精品一二三在线| 国产亚洲成av人片在线观看桃| 日韩在线视频线视频免费网站| 久久69精品久久久久久久电影好| 美女少妇精品视频| 日韩电影网在线| 中文字幕欧美在线| 国产精品av免费在线观看| 亚洲一区二区三区久久| 国产亚洲福利一区| 91久久精品在线| 国产精品白丝av嫩草影院| 国产精品亚洲一区二区三区| 亚洲精品小视频在线观看| 97人洗澡人人免费公开视频碰碰碰| 国产成人一区三区| 国产一区二区三区三区在线观看| 日韩视频免费看| 亚洲午夜未满十八勿入免费观看全集| 国产精品视频1区| 国产精品视频1区| 国产一区二区黑人欧美xxxx| 久久色免费在线视频| 激情亚洲一区二区三区四区| 亚洲黄色av女优在线观看| 91精品国产777在线观看| 欧美福利视频在线| 日本精品一区二区三区在线| 全亚洲最色的网站在线观看| 亚洲欧美国产精品| 久久网福利资源网站| 成人av在线亚洲| 亚洲女成人图区| 日韩视频中文字幕| 久久免费精品视频| 日韩在线免费视频观看| 亚洲国产精品va在线看黑人| 91亚洲国产成人精品性色| 欧美激情亚洲精品| 中文字幕久热精品在线视频| 自拍视频国产精品| 国产在线观看精品一区二区三区| 欧美影院成年免费版| 97精品久久久| 欧美国产极速在线| 亚洲跨种族黑人xxx| 国产精品久久久久久久久久| 欧美亚洲视频在线看网址| 亚洲一区中文字幕| 亚洲欧美日韩爽爽影院| 亚洲新中文字幕| 国产成人精品电影久久久| 久久久久久九九九| 在线观看视频99| 亚洲欧美在线免费观看| 欧美大片欧美激情性色a∨久久| 亚洲美女av在线| 国产精品69精品一区二区三区| 国产欧美在线视频| 欧美日韩另类视频| 亚洲永久免费观看| 色yeye香蕉凹凸一区二区av| 日韩欧美精品免费在线| 成人在线精品视频|