国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

利用 Go 語言編寫一個簡單的 WebSocket 推送服務

2020-04-01 18:57:47
字體:
來源:轉載
供稿:網友

本文中代碼可以在 github.com/alfred-zhong/wserver 獲取。

背景

最近拿到需求要在網頁上展示報警信息。以往報警信息都是通過短信,微信和 App 推送給用戶的,現在要讓登錄用戶在網頁端也能實時接收到報警推送。

依稀記得以前工作的時候遇到過類似的需求。因為以前的瀏覽器標準比較陳舊,并且那時用 Java 較多,所以那時候解決這個問題就用了 Comet4J。具體的原理就是長輪詢,長鏈接。但現在畢竟 html5 流行開來了,IE 都被 Edge 接替了,再用以前這種技術就顯得過時。

很早以前就聽過 WebSocket 的大名,但因為那時很多用戶的瀏覽器還不支持,所以對這個技術也就是淺嘗輒止,沒有太深入研究過。現在趁著項目需要,就來稍微深入了解一下。

websocket 簡介

以往瀏覽器要獲取服務端數據,都是通過發送 HTTP 請求,然后等待服務端回應的。也就是說瀏覽器端一直是整個請求的發起者,只有它主動,才能獲取到數據。而要讓瀏覽器一側能夠獲取到服務端的實時數據,就需要不停地向服務端發起請求。雖然大多數情況下并沒有獲取到實際數據,但這大大增加了網絡壓力,對于服務端來說壓力也直線上升。

go,websocket,推送服務

后來我們學會了使用長連接 + 長輪詢的方式。換句話說,也就是延長 HTTP 請求的存在時間,盡量保持 HTTP 連接。雖然這在一定程度上降低了不少壓力,但仍然需要不停地進行輪詢,也做不到真正的實時性。(借用一張圖)

go,websocket,推送服務

隨著 HTML5 的到來,WebSocket 在 2011 年被定為標準(詳情請參見 RFC 6455)。

借用 《Go Web 編程》的話。WebSocket 采用了一些特殊的報頭,使得瀏覽器和服務器只需要做一個握手的動作,就可以在瀏覽器和服務器之間建立一條連接通道。且此連接會保持在活動狀態,你可以使用 JavaScript 來向連接寫入或從中接收數據,就像在使用一個常規的 TCP Socket 一樣。它解決了 Web 實時化的問題。

go,websocket,推送服務

由于 WebSocket 是全雙工通信,所以當建立了 WebSocket 連接之后,接下來的通信就類似于傳統的 TCP 通信了。客戶端和服務端可以相互發送數據,不再有實時性的問題。

開發包的選擇

在 Go 官方的 SDK 中,并不包含對 WebSocket 的支持,所以必須使用第三方庫。

要使用 Golang 開發 WebSocket,選擇基本就在 x/net/websocket 和 gorilla/websocket 之間。《Go Web 編程》一書中的例子使用了 x/net/websocket 作為開發包,而且貌似它也更加官方且正式。而實際根據我在網上查詢得到的反饋看來,并非如此。x/net/websocket 貌似 Bug 較多,且較為不穩定,問題解決也并不及時。相比之下,gorilla/websocket 則更加優秀。

還有對于 Gorilla web toolkit 組織的貢獻,必須予以感謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永州市| 稷山县| 黄浦区| 虎林市| 马公市| 镇巴县| 余干县| 会理县| 咸宁市| 陈巴尔虎旗| 特克斯县| 灵武市| 宣威市| 武平县| 共和县| 招远市| 溧水县| 黔江区| 类乌齐县| 苏尼特左旗| 米脂县| 双鸭山市| 平凉市| 泸西县| 麻阳| 桦南县| 金湖县| 股票| 怀柔区| 黄龙县| 广汉市| 马鞍山市| 万安县| 蕉岭县| 四子王旗| 宣城市| 远安县| 凤冈县| 望江县| 黔江区| 民权县|