1 回答

TA貢獻1802條經驗 獲得超5個贊
Websocket 服務器應用程序必須通過關閉連接并釋放與該連接關聯的資源來處理連接上的錯誤。
當包含的頁面刷新時,瀏覽器會關閉 websocket 連接。瀏覽器關閉連接后,服務器最終會收到讀取或寫入錯誤。
連接關閉是服務器可能遇到的幾種錯誤之一。服務器應用程序應以相同的方式處理連接上的所有錯誤:關閉連接并釋放與該連接關聯的資源。
典型的應用程序設計是讓客戶端在頁面加載時進行連接,并在發生錯誤后重新連接(使用退避)。服務器假設客戶端會隨著時間的推移而連接和斷開連接。
可以通過添加一個通過退避重新連接的 onerror 處理程序來改進 JS 代碼。根據應用程序的不同,您可能還希望顯示指示連接狀態的 UI。
Go代碼并不會在所有場景下關閉連接。正在運行的命令是與連接關聯的資源。應用程序不會在連接錯誤時終止該程序。以下是一些修復:
defer ws.Close()升級成功后添加。ws.Close()刪除對from的其他直接調用SocketHandler.ServeHTTP。這確保了ws.Close()在所有場景中都被調用。
從讀寫泵退出時終止該命令。命令啟動后將讀取泵移至。回來就殺掉。
go func(c *websocket.Conn, cmd *exec.Command) {
? ? defer c.Close()
? ? defer cmd.Process.Kill()
? ? for {
? ? ? ? if _, _, err := c.NextReader(); err != nil {
? ? ? ? ? ? break
? ? ? ? }
? ? }
}(ws, cmd)
從寫泵退出時終止命令:
s := bufio.NewScanner(io.MultiReader(stdout, stderr))
for s.Scan() {
? ? err := ws.WriteMessage(1, s.Bytes())
? ? if err != nil {
? ? ? ? break
? ? }
}
cmd.Process.Kill()
我還沒有運行或測試過這段代碼。有些細節可能是錯誤的,但這概述了關閉連接和釋放資源的一般方法。
- 1 回答
- 0 關注
- 181 瀏覽
添加回答
舉報