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

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

如何使用 json.Decoder 解碼單個 json 消息并將連接切換到不同的協議?

如何使用 json.Decoder 解碼單個 json 消息并將連接切換到不同的協議?

Go
RISEBY 2021-09-10 18:17:26
我正在研究基于 TCP 的代理,該代理必須首先在給定連接上的 json 中執行 REQ/REPLY 握手。因為 JSON 是一種自定界協議,所以我使用 Go 的 json.Decoder 來完成這項工作,這很好地完成了這項工作。以下是我采取的步驟:撥號連接到遠程服務器將單個 json 請求寫入遠程服務器 (REQ)從同一個遠程服務器讀取單個 json 回復(完成代理握手 REPLY)在有效的 json 握手后,將客戶端連接傳遞到代碼的另一部分,從現在開始,該部分將(向前)切換到基于文本的協議。問題是,當 json.Decoder 將數據讀入其內部緩沖區時,它可能會讀取比它需要的更多的數據,在這種情況下,json.Decoder 有一個 Buffered()方法,該方法將剩余數據返回給 io.Reader。此數據(在 Buffered() 方法中可用)現在是基于文本的協議數據,需要在 json 握手完成其工作后從連接中讀取。但是,如果我按原樣傳遞連接而不考慮剩余的緩沖區,連接將進入鎖定狀態,因為它正在等待讀取這個永遠不會到來的數據。處理基于文本的協議的代碼需要一個net.Conn前進,一旦我向前傳遞連接(在進行 json 握手之后),利用該連接的代碼此時就知道如何使用基于文本的協議在。所以應該有明確的工作邊界。我的問題是解決這個問題的理想方法是什么,這樣我仍然可以利用 json.Decoder,但確保當我將連接傳遞到我的代理中代碼的不同部分時,我知道數據的開始基于文本的協議仍然可讀。我以某種方式需要獲取 json.Decoder 的 Buffered() 方法中的剩余數據并將其放回連接前面,以便可以正確讀取。任何見解都非常感謝。
查看完整描述

1 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊


你可以試試


type ConnWithBuffIncluded struct{ //Implement net.Conn so can be passed through pipeline

    net.Conn

    json.Decoder

}


func (x ConnWithBuffIncluded) Read(p []byte) (n int, err error){ //Will Read both sources

    return io.MultiReader(x.Decoder.Buffered(), x.Conn).Read(p)

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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