我正在編寫一個小型 tcp 服務器,它只假設讀取數據、解析接收數據(動態長度幀)并處理這些幀??紤]以下代碼:func ClientHandler(conn net.Conn) { buf := make([]byte, 4096) n, err := conn.Read(buf) if err != nil { fmt.Println("Error reading:", err.Error()) return } fmt.Println("received ", n, " bytes of data =", string(buf)) handleData(buf)這幾乎是我代碼的本質。我將 X 個字節讀入一個空緩沖區,然后處理數據。問題發生在:一幀數據大于它試圖從 tcp 連接讀入的緩沖區。在這種情況下,在接收到其余數據之前,我無法處理數據(但是接收緩沖區已被先前的數據占用)。當緩沖區包含一個半幀的數據并且我需要處理第一幀時,同時保留不完整的幀以備后用...在這種情況下,我需要從緩沖區中刪除已處理的部分,然后移動不完整的部分框架的其余部分有空間。這兩種情況都可能需要重新分配和復制數據,這可能是一項代價高昂的操作?此外,除了擴展緩沖區之外,我對如何處理大于緩沖區的幀沒有任何想法……但是不斷增加的緩沖區可能會導致性能問題和拒絕服務。最后,但并非最不重要的是,我不知道 Golang 的標準庫是否足夠好,無法知道是否有任何明確構建的包來處理這些情況。所以我的問題是:是否有處理這些情況的最佳實踐?是否有任何 golang 包可以為我完成部分或大部分工作?謝謝你。
1 回答

慕村9548890
TA貢獻1884條經驗 獲得超4個贊
字節切片應該支持非常優化的調整大小(即保留比需要更多的字節,如果可以的話不要復制,呈指數增長,復制代碼不是用 go 編寫的,而是運行時的一部分,等等)。
所以你可以使用append
并查看它是如何工作的。
另一種更慣用的方法是使用bufio.Reader
包裝連接,它會自動處理所有這些。我已經在我編寫的 tcp 服務器中使用了它,而且速度非???。你只需要:
r := bufio.NewReader(conn)
然后您可以讀取直到分隔符或給定數量的字節(如果您事先知道的話)。
- 1 回答
- 0 關注
- 273 瀏覽
添加回答
舉報
0/150
提交
取消