第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Golang中的TCP固定大小消息成幀方法

Golang中的TCP固定大小消息成幀方法

Go
臨摹微笑 2022-06-13 10:49:27
我無(wú)法理解使用固定大小前綴長(zhǎng)度標(biāo)頭的消息框架是如何工作的。據(jù)說(shuō)一個(gè)固定大小的字節(jié)數(shù)組將包含要發(fā)送的消息的長(zhǎng)度。但是你將如何定義一個(gè)固定大小的字節(jié)數(shù)組,特別是在 Golang 中。說(shuō)這是我的信息:Hello它的長(zhǎng)度是 5。因此,如果我想通過 tcp 流發(fā)送它,為了確保我在另一端收到所有消息,我必須告訴它應(yīng)該讀取多少字節(jié)。一個(gè)簡(jiǎn)單的標(biāo)題是length:message:5:Hello // [53 58 104 101 108 108 111]但是如果消息長(zhǎng)度每次增長(zhǎng) 10 倍,就會(huì)有更多的字節(jié)。所以標(biāo)題大小是動(dòng)態(tài)的。36:Hello, this is just a dumb question. // [51 54 58 72 101 108 108 111 44 32 116 104 105 115 32 105 115 32 106 117 115 116 32 97 32 100 117 109 98 32 113 117 101 115 116 105 111 110 46]所以這里36需要2個(gè)字節(jié)。我想到的一種方法是考慮協(xié)議的最大消息長(zhǎng)度。假設(shè) 10KB = 10240 字節(jié)。然后將前導(dǎo)添加0到消息長(zhǎng)度。這樣,我確定我將擁有一個(gè)固定的 5 字節(jié)標(biāo)頭。這適用于所有情況嗎?如果是,如果我有超過 10KB 的消息,我應(yīng)該將其拆分為 2 條消息嗎?如果不是,還有什么其他解決方案?我想在 Golang 中實(shí)現(xiàn)解決方案。更新 1:我讀過關(guān)于 Endians 的文章,盡管我無(wú)法理解他們做了什么會(huì)導(dǎo)致固定長(zhǎng)度的字節(jié)。但是我在python中找到了一個(gè)示例,并嘗試以這種方式編寫它:客戶:    const maxLengthBytes = 8    conn, err := net.Dial("tcp", "127.0.0.1:9999")    if err != nil {        fmt.Println(err)        return    }    message := "Hello, this is just a dumb question"    bs := make([]byte, maxLengthBytes)    binary.LittleEndian.PutUint64(bs, uint64(len(text)))    bytes := append(bs, []byte(text)...)    conn.Write(bytes)服務(wù)器:    listener, err := net.ListenTCP("tcp", &net.TCPAddr{Port: 9999})    if err != nil {        fmt.Println(err)        return    }    for {        tcp, err := listener.AcceptTCP()        if err != nil {            fmt.Println(err)            continue        }        go Reader(tcp)    }func Reader(conn *net.TCPConn) {    foundLength := false    messageLength := 0    for {        if !foundLength {            var b = make([]byte, maxLengthBytes)            read, err := conn.Read(b)            if err != nil {                fmt.Println(err)                continue            }            if read != 8 {                fmt.Println("invalid header")                continue            }        }    }}
查看完整描述

1 回答

?
炎炎設(shè)計(jì)

TA貢獻(xiàn)1808條經(jīng)驗(yàn) 獲得超4個(gè)贊

請(qǐng)參考我在這篇文章中的回答 TCP client for Android: text is not received full

基本上,您必須定義數(shù)據(jù)如何存儲(chǔ)/格式化。例如:

  1. 我們將前綴長(zhǎng)度存儲(chǔ)為int32(4 字節(jié)),小端。它和你的不一樣。

  2. 使用您的解決方案,長(zhǎng)度是 a string,很難確定長(zhǎng)度。對(duì)于您的解決方案,您必須使用固定長(zhǎng)度的字符串。例如:10 個(gè)字符,并添加前導(dǎo)零。

對(duì)于您的問題。

  1. 它不適用于只有前綴長(zhǎng)度的所有情況。它有它的局限性,例如如果我們使用int32前綴長(zhǎng)度,消息的長(zhǎng)度必須小于 Integer32.max,對(duì)嗎?

  2. 是的,我們必須拆分甚至合并(請(qǐng)參閱我在上面鏈接中的解釋)。

  3. 如果這是我們關(guān)心的問題,我們有很多方法來(lái)處理長(zhǎng)度限制(實(shí)際上,幾乎應(yīng)用程序協(xié)議都有最大請(qǐng)求大?。D梢远嘤靡晃粊?lái)指示消息是否超過最大長(zhǎng)度來(lái)解決它,對(duì)嗎?


查看完整回答
反對(duì) 回復(fù) 2022-06-13
  • 1 回答
  • 0 關(guān)注
  • 204 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)