1 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
Websocket 服務(wù)器應(yīng)用程序必須通過關(guān)閉連接并釋放與該連接關(guān)聯(lián)的資源來處理連接上的錯(cuò)誤。
當(dāng)包含的頁面刷新時(shí),瀏覽器會(huì)關(guān)閉 websocket 連接。瀏覽器關(guān)閉連接后,服務(wù)器最終會(huì)收到讀取或?qū)懭脲e(cuò)誤。
連接關(guān)閉是服務(wù)器可能遇到的幾種錯(cuò)誤之一。服務(wù)器應(yīng)用程序應(yīng)以相同的方式處理連接上的所有錯(cuò)誤:關(guān)閉連接并釋放與該連接關(guān)聯(lián)的資源。
典型的應(yīng)用程序設(shè)計(jì)是讓客戶端在頁面加載時(shí)進(jìn)行連接,并在發(fā)生錯(cuò)誤后重新連接(使用退避)。服務(wù)器假設(shè)客戶端會(huì)隨著時(shí)間的推移而連接和斷開連接。
可以通過添加一個(gè)通過退避重新連接的 onerror 處理程序來改進(jìn) JS 代碼。根據(jù)應(yīng)用程序的不同,您可能還希望顯示指示連接狀態(tài)的 UI。
Go代碼并不會(huì)在所有場(chǎng)景下關(guān)閉連接。正在運(yùn)行的命令是與連接關(guān)聯(lián)的資源。應(yīng)用程序不會(huì)在連接錯(cuò)誤時(shí)終止該程序。以下是一些修復(fù):
defer ws.Close()升級(jí)成功后添加。ws.Close()刪除對(duì)from的其他直接調(diào)用SocketHandler.ServeHTTP。這確保了ws.Close()在所有場(chǎng)景中都被調(diào)用。
從讀寫泵退出時(shí)終止該命令。命令啟動(dòng)后將讀取泵移至。回來就殺掉。
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)
從寫泵退出時(shí)終止命令:
s := bufio.NewScanner(io.MultiReader(stdout, stderr))
for s.Scan() {
? ? err := ws.WriteMessage(1, s.Bytes())
? ? if err != nil {
? ? ? ? break
? ? }
}
cmd.Process.Kill()
我還沒有運(yùn)行或測(cè)試過這段代碼。有些細(xì)節(jié)可能是錯(cuò)誤的,但這概述了關(guān)閉連接和釋放資源的一般方法。
- 1 回答
- 0 關(guān)注
- 192 瀏覽
添加回答
舉報(bào)