WebSocket 和 Golang 實現聊天功能

2021-07-12 04:24:24 字數 2883 閱讀 1991

這個示例應用程式展示了如何使用 websocket, golang 和 jquery 建立乙個簡單的web聊天應用程式。這個示例的源**在  。

這個示例需要 golang 開發環境。 該頁面描述如何安裝開發環境。

go get gary.burd.info/go-websocket-chat

go-websocket-chat

在支援 websocket 的瀏覽器嘗試開啟  啟動應用

伺服器程式實現了 http 包,包含了 go 分發和 gorilla 專案的 websocket 包.

應用程式定義了兩種型別, connection 和 hub 。伺服器為每個 webscocket 連線 建立的乙個 connection 型別的例項 。 聯結器扮演了 websocket 和 hub 型別單例 之間的媒介 。 hub 保持一組註冊了的聯結器 和 廣播到聯結器的資訊。

程式執行了乙個 goroutine 給 hub 和兩個 goroutine 給每個聯結器。 goroutine 通過 channel 和其他進行交流。 hub 擁有註冊聯結器、登出聯結器和廣播資訊的 channel。乙個連機器擁有快取的發出資訊的 channel 。其中乙個 聯結器的 goroutine 從這個 channel 中讀資訊 並把資訊寫入 webscoket。另外乙個聯結器 goroutine 從 websocket 讀資訊,並把資訊傳送到 hub。

下面是 hub 型別**:

package main

type hub struct

var h = hub

func (h *hub) run()

case m := <-h.broadcast:

for c := range h.connections }}

}}

應用程式的 主要 函式啟動 hub 以 goroutine 形式執行方法。聯結器 傳送請求到 hub 通過 註冊、登出和廣播 channel。

hub 註冊聯結器通過新增 connection 的指標作為 connections map 的主鍵。這個 map 的值通常是 true。

登出的**有點複雜。除了從 connections map 刪除聯結器的指標外, hub 關閉了 connection 的傳送,來標識沒有資訊再被傳送到 connection了。

hub 通過迴圈註冊聯結器和傳送資訊到聯結器的傳送 channel 來控制資訊。 如果聯結器的傳送緩衝區已經滿了,那麼 hub 假設 客戶端已死或卡住了。這種情況下, hub 登出聯結器 並關閉 websocket.

下面關於 connection 型別的**:

}wshandler 方法被主函式當做http handler註冊。http 連線到 websocket 協議的公升級,建立乙個連線物件,註冊這個連線到 sub ,並通過 defer延遲語句 來控制 連線的登出。

接著,wshandler 方法開啟 聯結器的寫入方法作為乙個 goroutine。 寫入方法將資訊從聯結器的 channel 轉入 websocket。當 hub 關閉 channel 或者 在寫入 websocket 時出錯,寫入方法關閉。

最後,wshandler 方法 呼叫聯結器的 讀 方法。 讀方法將 入站訊息 從 websocket 轉到 hub。

這裡是伺服器的**的其餘部分:

}應用主程式啟動 hub goroutine。 接著 主程式 註冊 主頁 和 websocket 聯結器的控制器n。最後主程式啟動 http 伺服器。

客戶端的實現是乙個簡單的 html 檔案:

客戶端使用 jquery

表單處理器將使用者的輸入寫入到 websocket 並且清除輸入字段。

參考:來自:

web Worker和webSocket 的使用

1 web worker的使用 function webworkeruser params 接受worker傳送過來的資料。worker.onerror function event worker不能完成給定任務時會觸發error事件 worker.terminate 立即終止乙個worker的執行...

GoEasy和自己搭建websocket服務的區別

一 成本 大家都知道,軟體公司的人力成本巨大,乙個小專案配2個程式設計師 1個測試人員,工資以及各項福利,基本上都是上萬了。你要搭建乙個基本能用的websocket服務,兩個程式設計師一天兩天是搞不定的。goeasy一年的服務費用,最便宜的只要幾百,最貴的也就一萬多。這麼一對比,你會發現使用goea...

Websocket和http的區別

websocket websocket協議解決了伺服器與客戶端全雙工通訊的問題。注 什麼是單工 半雙工 全工通訊?資訊只能單向傳送為單工 資訊能雙向傳送但不能同時雙向傳送稱為半雙工 資訊能夠同時雙向傳送則稱為全雙工。websocket協議解析 wensocket協議包含兩部分 一部分是 握手 一部分...