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

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

bufio 掃描儀和處理新行

bufio 掃描儀和處理新行

Go
aluckdog 2023-07-31 17:04:26
我有 2 個(gè)進(jìn)程通過 TCP 套接字進(jìn)行通信。A 方向 B 方發(fā)送字符串,有時(shí)使用標(biāo)準(zhǔn)加密/密碼包對(duì)其進(jìn)行加密。生成的字符串可能包含換行符,但 B 方的 bufio 掃描器將其解釋為請(qǐng)求的結(jié)束。我希望 B 方繼續(xù)接受行、追加它們并等待已知的命令結(jié)束字符,然后再進(jìn)一步處理它。B 方將向 A 方返回響應(yīng),因此連接保持打開狀態(tài),因此不能使用關(guān)閉連接事件作為命令分隔符。對(duì)于單行命令,一切工作正常,但加密輸出中的這些新行字符會(huì)導(dǎo)致問題(大約 10% 的情況)。A 方將以以下格式發(fā)送(第三個(gè)是我試圖正確處理的問題字符串的合法示例):調(diào)用命令()callCommand("一","二","三")callCommand("string","要關(guān)注的加密數(shù)據(jù)","[7b??Cr??l??G????bH?@x????????? ?(z?$? a??0??帶5Y7+??U?QT??l?K?(?n?U??J????QK?BX?+?l\8H??-g?y.?.?1? f??I?C??????o?xz?8???c?e ?Tb??4?hD W??? ?<???Е?gc?????? ?N?V??P8 ???O3")我們可以相當(dāng)可靠地說命令結(jié)束鍵是右括號(hào)“)”和換行符。A方發(fā)送給B方的功能:func writer(text string) string {    conn, err := net.Dial("tcp", TCPdest)    t := time.Now()    if err != nil {        if _, t := err.(*net.OpError); t {            fmt.Println("Some problem connecting.\r\n")        } else {            fmt.Println("Unknown error: " + err.Error()+"\r\n")        }    } else {        conn.SetWriteDeadline(time.Now().Add(1 * time.Second))        _, err = conn.Write([]byte(text+"\r\n"))        if err != nil {            fmt.Println("Error writing to stream.\r\n")        } else {            timeNow := time.Now()                       if timeNow.Sub(t.Add(time.Duration(5*time.Second))).Seconds() > 5 {                return "timeout"            }            scanner := bufio.NewScanner(conn)            for {                ok := scanner.Scan()                if !ok {                    break                }                if strings.HasPrefix(scanner.Text(), "callCommand(") && strings.HasSuffix(scanner.Text(), ")") {                    conn.Close()                    return scanner.Text()                }            }        }    }    return "unspecified error"}B方對(duì)傳入連接的處理:src := "192.168.68.100:9000"listener, _ := net.Listen("tcp", src)defer listener.Close()for {    conn, err := listener.Accept()    if err != nil {        fmt.Println("Some connection error: %s\r\n", err)    }    go handleConnection(conn)}   我不太確定 B 面的這種方法是否正確,但在上面包含了我的代碼。我見過一些實(shí)現(xiàn),但很多似乎依賴于關(guān)閉連接來開始處理請(qǐng)求,這不適合我的場(chǎng)景。
查看完整描述

1 回答

?
萬千封印

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

您的通信“協(xié)議”(一行是一條消息,不完全是協(xié)議)顯然無法處理二進(jìn)制數(shù)據(jù)。如果您想在協(xié)議中發(fā)送文本數(shù)據(jù),您可以將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為文本,例如使用 Base64 編碼。您還需要一些語義來指示某些文本是從二進(jìn)制轉(zhuǎn)換而來的。


或者您可以更改協(xié)議以本地處理二進(jìn)制數(shù)據(jù)。您可以在后面添加二進(jìn)制數(shù)據(jù)的長(zhǎng)度,這樣您就知道必須以二進(jìn)制形式讀取該數(shù)據(jù),而不是將換行符解釋為消息的結(jié)尾。


有許多協(xié)議在這方面做得很好,也許您不需要想出您的自定義協(xié)議。如果你想發(fā)送短信,HTTP 使用起來非常簡(jiǎn)單,你可以將數(shù)據(jù)格式化為 JSON,使用 Base64 將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為文本:


{

    "command": "string",

    "args": [

        "binaryDataAsBase64"

    ]

}


查看完整回答
反對(duì) 回復(fù) 2023-07-31
  • 1 回答
  • 0 關(guān)注
  • 152 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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