我正在研究基于 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)
}
- 1 回答
- 0 關注
- 187 瀏覽
添加回答
舉報
0/150
提交
取消