亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > GO語(yǔ)言如何手動(dòng)處理TCP粘包詳解

GO語(yǔ)言如何手動(dòng)處理TCP粘包詳解

熱門(mén)標(biāo)簽:濱州自動(dòng)電銷機(jī)器人排名 釘釘有地圖標(biāo)注功能嗎 惠州電銷防封電話卡 阿里云ai電話機(jī)器人 汕頭小型外呼系統(tǒng) 鄭州亮點(diǎn)科技用的什么外呼系統(tǒng) 浙江高頻外呼系統(tǒng)多少錢(qián)一個(gè)月 建造者2地圖標(biāo)注 黃岡人工智能電銷機(jī)器人哪個(gè)好

前言

一般所謂的TCP粘包是在一次接收數(shù)據(jù)不能完全地體現(xiàn)一個(gè)完整的消息數(shù)據(jù)。TCP通訊為何存在粘包呢?主要原因是TCP是以流的方式來(lái)處理數(shù)據(jù),再加上網(wǎng)絡(luò)上MTU的往往小于在應(yīng)用處理的消息數(shù)據(jù),所以就會(huì)引發(fā)一次接收的數(shù)據(jù)無(wú)法滿足消息的需要,導(dǎo)致粘包的存在。處理粘包的唯一方法就是制定應(yīng)用層的數(shù)據(jù)通訊協(xié)議,通過(guò)協(xié)議來(lái)規(guī)范現(xiàn)有接收的數(shù)據(jù)是否滿足消息數(shù)據(jù)的需要。在應(yīng)用中處理粘包的基礎(chǔ)方法主要有兩種分別是以4節(jié)字描述消息大小或以結(jié)束符,實(shí)際上也有兩者相結(jié)合的如HTTP,redis的通訊協(xié)議等。

應(yīng)用場(chǎng)景

大部分TCP通訊場(chǎng)景下,使用自定義通訊協(xié)議

粘包處理原理:通過(guò)請(qǐng)求頭中數(shù)據(jù)包大小,將客戶端N次發(fā)送的數(shù)據(jù)緩沖到一個(gè)數(shù)據(jù)包中

例如:

請(qǐng)求頭占3個(gè)字節(jié)(指令頭1字節(jié)、數(shù)據(jù)包長(zhǎng)度2字節(jié)),版本占1個(gè)字節(jié),指令占2個(gè)字節(jié)

協(xié)議規(guī)定一個(gè)數(shù)據(jù)包最大是512字節(jié),請(qǐng)求頭中數(shù)據(jù)包記錄是1300字節(jié),完整的數(shù)據(jù)包是1307個(gè)字節(jié),此時(shí)服務(wù)器端需要將客戶端3次發(fā)送數(shù)據(jù)進(jìn)行粘包處理

代碼示例

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"
)
/*
 客戶端結(jié)構(gòu)體
 */
type Client struct {
 DeviceID string  //客戶端連接的唯標(biāo)志
 Conn  net.Conn  //連接
 reader *bufio.Reader //讀取
 writer *bufio.Writer //輸出
 Data  []byte  //接收數(shù)據(jù)
}
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
}
/**
 數(shù)據(jù)讀取(粘包處理)
 */
func (this *Client)read() {
 for {
  var data []byte
  var err error
  //讀取指令頭 返回輸入流的前4個(gè)字節(jié),不會(huì)移動(dòng)讀取位置
  data, err = this.reader.Peek(4)
  if len(data) == 0 || err != nil {
   continue
  }
  //返回緩沖中現(xiàn)有的可讀取的字節(jié)數(shù)
  var byteSize = this.reader.Buffered()
  fmt.Printf("讀取字節(jié)長(zhǎng)度:%d\n", byteSize)
  //生成一個(gè)字節(jié)數(shù)組,大小為緩沖中可讀字節(jié)數(shù)
  data = make([]byte, byteSize)
  //讀取緩沖中的數(shù)據(jù)
  this.reader.Read(data)
  fmt.Printf("讀取字節(jié):%d\n", data)
  //保存到新的緩沖區(qū)
  for _, v := range data {
   this.Data = append(this.Data, v)
  }
  if len(this.Data)  4 {
   //數(shù)據(jù)包緩沖區(qū)清空
   this.Data = []byte{}
   fmt.Printf("非法數(shù)據(jù),無(wú)指令頭...\n")
   continue
  }
  data, err = protocol.HexBytesToBytes(this.Data[:4])
  instructHead, _ := strconv.ParseUint(string(data), 16, 16)
  //指令頭效驗(yàn)
  if uint16(instructHead) != 42330 {
   fmt.Printf("非法數(shù)據(jù)\n")
   //數(shù)據(jù)包緩沖區(qū)清空
   this.Data = []byte{}
   continue
  }
  data = this.Data[:protocol.HEADER_SIZE]
  var p = protocol.Decode(data)
  fmt.Printf("消息體長(zhǎng)度:%d\n", p.Len)
  var bodyLength = len(this.Data)  
  /**
   判斷數(shù)據(jù)包緩沖區(qū)的大小是否小于協(xié)議請(qǐng)求頭中數(shù)據(jù)包大小
   如果小于,等待讀取下一個(gè)客戶端數(shù)據(jù)包,否則對(duì)數(shù)據(jù)包解碼進(jìn)行業(yè)務(wù)邏輯處理
   */
  if int(p.Len) > len(this.Data) - protocol.HEADER_SIZE {
   fmt.Printf("body體長(zhǎng)度:%d,讀取的body體長(zhǎng)度:%d\n", p.Len, bodyLength)
   continue
  }
  fmt.Printf("實(shí)際處理字節(jié):%v\n", this.Data)
  p = protocol.Decode(this.Data)
  //邏輯處理
  go this.logicHandler(p)
  //數(shù)據(jù)包緩沖區(qū)清空
  this.Data = []byte{}
 }
}

待優(yōu)化部分:

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

結(jié)構(gòu)體中Data屬性可考慮使用bytes.Buffer實(shí)現(xiàn)。

Golang標(biāo)準(zhǔn)庫(kù)文檔:https://studygolang.com/pkgdoc

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

您可能感興趣的文章:
  • Go語(yǔ)言服務(wù)器開(kāi)發(fā)之簡(jiǎn)易TCP客戶端與服務(wù)端實(shí)現(xiàn)方法
  • GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單TCP服務(wù)的方法
  • golang之tcp自動(dòng)重連實(shí)現(xiàn)方法
  • 利用Golang實(shí)現(xiàn)TCP連接的雙向拷貝詳解
  • 6行代碼快速解決golang TCP粘包問(wèn)題
  • Go語(yǔ)言中TCP/IP網(wǎng)絡(luò)編程的深入講解

標(biāo)簽:滄州 昭通 阿壩 瀘州 駐馬店 泰安 晉中 東營(yíng)

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《GO語(yǔ)言如何手動(dòng)處理TCP粘包詳解》,本文關(guān)鍵詞  語(yǔ)言,如何,手動(dòng),處理,TCP,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《GO語(yǔ)言如何手動(dòng)處理TCP粘包詳解》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于GO語(yǔ)言如何手動(dòng)處理TCP粘包詳解的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产伦理精品| 日本在线不卡视频| 久久99中文字幕久久| 精品视频一区二区三区免费| 日韩一级黄色片| 成人高清视频在线观看| 国产伦理精品| 青青久热| 91麻豆精品国产自产在线| 天天做日日爱夜夜爽| 免费毛片基地| 日韩字幕在线| 香蕉视频亚洲一级| 国产伦理精品| 欧美国产日韩一区二区三区| 国产一区二区精品尤物| 999精品在线| 四虎久久精品国产| 91麻豆精品国产高清在线| 日韩在线观看视频免费| 香蕉视频亚洲一级| 欧美日本二区| 日韩专区亚洲综合久久| 国产成人啪精品| 久草免费在线观看| 精品国产亚洲一区二区三区| 999久久狠狠免费精品| 国产网站免费| 欧美日本免费| 国产精品免费久久| 免费一级片在线| 久久国产影视免费精品| 欧美另类videosbestsex久久 | 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产亚洲精品成人a在线| 韩国三级一区| 黄色短视屏| 中文字幕一区二区三区精彩视频| 国产91精品系列在线观看| 欧美a免费| 青青青草视频在线观看| 国产亚洲免费观看| 亚洲 激情| 欧美18性精品| 亚洲精品永久一区| 欧美日本二区| 久久国产精品自线拍免费| 久久福利影视| 欧美国产日韩一区二区三区| 久久福利影视| 你懂的日韩| 日本特黄特黄aaaaa大片 | 欧美另类videosbestsex久久 | 国产美女在线一区二区三区| 国产视频一区二区在线观看| 国产一区二区精品| 九九干| 久久国产影视免费精品| 欧美爱爱网| 99久久视频| 999久久狠狠免费精品| 精品在线观看国产| 国产麻豆精品高清在线播放| 欧美激情在线精品video| 可以免费看毛片的网站| 亚洲第一页乱| 精品久久久久久中文字幕2017| 国产美女在线一区二区三区| 香蕉视频亚洲一级| 日韩一级黄色| 久草免费资源| 国产网站免费视频| 亚洲wwwwww| 黄视频网站免费看| 精品视频在线观看免费| 黄色免费三级| 国产原创视频在线| 亚洲爆爽| 欧美另类videosbestsex久久 | 日韩一级黄色片| 日韩欧美一二三区| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 欧美激情一区二区三区在线播放 | 亚洲爆爽| 日韩av片免费播放| 一级片免费在线观看视频| 欧美大片一区| 天天色成人网| 欧美电影免费| 日韩在线观看网站| 一级片免费在线观看视频| 91麻豆爱豆果冻天美星空| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产激情一区二区三区| 国产伦精品一区二区三区无广告| 成人免费网站久久久| 午夜精品国产自在现线拍| 日日日夜夜操| 免费毛片基地| 你懂的日韩| 国产a毛片| 日韩欧美一二三区| 国产亚洲免费观看| 国产伦精品一区二区三区无广告| 国产韩国精品一区二区三区| 亚洲第一色在线| 欧美激情在线精品video| 台湾毛片| 免费国产在线观看| 欧美国产日韩一区二区三区| 精品毛片视频| 999久久狠狠免费精品| 国产一区免费观看| 亚飞与亚基在线观看| 99久久精品国产高清一区二区| 可以免费看毛片的网站| 午夜激情视频在线播放| 精品国产一区二区三区国产馆| 欧美激情在线精品video| 久久精品大片| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 久草免费资源| 国产网站在线| 日韩字幕在线| 国产麻豆精品免费视频| 99热精品在线| 日韩专区亚洲综合久久| 日本免费乱理伦片在线观看2018| 国产不卡福利| 午夜在线亚洲| 国产视频一区二区在线观看| 国产激情一区二区三区| 欧美日本免费| 99热精品在线| 一级女性全黄久久生活片| 韩国毛片| 国产麻豆精品免费视频| 国产精品免费久久| 色综合久久天天综线观看| 青青青草视频在线观看| 午夜在线亚洲| 欧美一区二区三区在线观看| 美女免费精品视频在线观看| 久久99这里只有精品国产| 欧美1区2区3区| 免费一级片在线| 韩国三级一区| 国产亚洲免费观看| 欧美大片aaaa一级毛片| 欧美大片aaaa一级毛片| 91麻豆爱豆果冻天美星空| 欧美a级大片| 人人干人人插| 久久精品店| 可以免费看毛片的网站| 日韩中文字幕在线播放| 天天做人人爱夜夜爽2020| 国产视频网站在线观看| 亚欧成人乱码一区二区 | 精品久久久久久中文字幕2017| 成人在激情在线视频| 日韩一级黄色片| 久久精品大片| 国产成人精品影视| 日本特黄特色aaa大片免费| 韩国毛片| 国产国语对白一级毛片| 精品国产香蕉伊思人在线又爽又黄| 日本在线不卡视频| 久久国产精品永久免费网站| 国产伦精品一区二区三区在线观看 | 日韩中文字幕一区| 99色视频在线观看| 精品在线免费播放| 日韩中文字幕在线播放| 成人免费网站久久久| 欧美激情一区二区三区在线| 人人干人人插| 午夜家庭影院| 精品毛片视频| 成人免费网站久久久| 午夜激情视频在线播放| 日本免费乱理伦片在线观看2018| 999精品视频在线| 亚欧成人乱码一区二区 | 精品国产一区二区三区免费| 日本在线播放一区| 91麻豆精品国产自产在线| 国产高清在线精品一区a| 欧美a级片视频| 日韩免费在线| 成人免费观看网欧美片| 精品国产一区二区三区免费| 精品毛片视频| 国产成人啪精品| 精品国产一区二区三区免费| 成人免费一级纶理片| 99久久精品国产高清一区二区| 欧美激情一区二区三区视频 | 99热精品在线|