亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 net.Conn 連接正確處理讀寫

使用 net.Conn 連接正確處理讀寫

Go
斯蒂芬大帝 2022-10-10 19:51:58
我正在嘗試使用網絡連接進行讀寫。似乎正在發生的事情是,如果數據進入服務器的速度過快,一些數據將被丟棄或丟失??蛻舳诉B接,協商連接,然后我讓它快速連續發送 3 個命令來更新狀態頁面。每個通信都是一個 JSON 字符串,它被轉換為一個結構并使用存儲的密鑰進行解碼。如果我多次單擊客戶端上的請求(每次生成 3 個以 \n 結尾的 JSON 有效負載),服務器有時會拋出 ERROR: invalid character X after the top-level value。我轉儲了客戶端發送的信息,看起來客戶端上有 3 個格式正確的 JSON 條目;在服務器端,似乎其中一個 JSON 有效負載完全丟失,其中一個丟失了前 515 個字符。由于缺少前 515 個字符,因此 JSON 格式不正確,因此封送處理失敗。我的問題是,我能做些什么來防止從連接中讀取的數據丟失?我是否遇到某種競爭條件或錯誤處理如何在連接上讀取和發送?下面基本上是我用于客戶端連接處理程序的內容??蛻舳撕头掌鲄f商加密連接,因此有多個對模式和 RSA 狀態的引用,并且在正確設置密鑰時使用模式 4,以便服務器和客戶端可以交換命令和結果。在高層次上,處理程序衍生出一個從連接中讀取并將其發送到通道的 goroutine。該字符串被讀取并轉換為結構。會話的第一部分專門用于“握手”以協商加密密鑰并保存會話信息;一旦到達第 4 階段,該結構就會攜帶來自客戶端的加密命令并將結果發送回,直到連接出錯或關閉。
查看完整描述

1 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

應用程序將數據發送到緩沖的讀取器,然后丟棄讀取器和它可能緩沖超過第一行的任何數據。


在連接的生命周期內保留緩沖的閱讀器:


    rdr := bufio.NewReader(conClient)

    for {

        netData, err := rdr.ReadString('\n')

        ...

您可以通過消除 goroutine 來簡化代碼(并修復與緩沖區問題無關的其他問題)。使用讀取期限來處理無響應的服務器。


func HandleClientConnection(conClient net.Conn) {

    defer conClient.Close()

    chnLogging <- "Connection from " + conClient.RemoteAddr().String()

    conClient.SetReadDeadline(time.Minute * SERVER_INACTIVITY_TIMEOUT_MINUTES)

    scanner := bufio.NewScanner(conClient)

    for scanner.Scan() {

        var strctNetEncrypted stctNetEncrypted

        err := json.Unmarshal(scanner.Bytes(), &strctNetEncrypted)

        CheckErr(err)

        switch strctNetEncrypted.IntMode {

             // Insert contents of switch statement from

             // question here with references to 

             // chnCloseConn removed.

        }

        conClient.SetReadDeadline(time.Minute * SERVER_INACTIVITY_TIMEOUT_MINUTES)

    }

    if scanner.Err() != nil {

        chnLogging <- "Error from client " + conClient.RemoteAddr().String() + ": " + err.Error()

    } else {

        chnLogging <- "Client " + conClient.RemoteAddr().String() + " disconnected"

    }

}


查看完整回答
反對 回復 2022-10-10
  • 1 回答
  • 0 關注
  • 122 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號