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

来源:https://www.cnblogs.com/snowInPluto/archive/2018/04/01/8688453.html
-Advertisement-
Play Games

用 Go 編寫一個簡單的 WebSocket 推送服務 本文中代碼可以在 "github.com/alfred zhong/wserver" 獲取。 背景 最近拿到需求要在網頁上展示報警信息。以往報警信息都是通過簡訊,微信和 App 推送給用戶的,現在要讓登錄用戶在網頁端也能實時接收到報警推送。 依 ...


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

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

背景

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

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

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

websocket 簡介

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

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

long-polling

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

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

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

開發包的選擇

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

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

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 【Java】0x01 配置開發環境,JDK、CLASSPATH等 一. 下載JDK安裝文件 首先,進入Oracle官網Java頁面。 註意,要下載的是JDK而不是JRE,這點很重要,因為JRE並不包含我們要用的源碼編譯之類的工具。 當前JDK最新版本為Java10,但如今主流的運行環境還是1.7、1 ...
  • Description 小Q的媽媽是一個出納,經常需要做一些統計報表的工作。今天是媽媽的生日,小Q希望可以幫媽媽分擔一些工 作,作為她的生日禮物之一。經過仔細觀察,小Q發現統計一張報表實際上是維護一個可能為負數的整數數列,並 且進行一些查詢操作。在最開始的時候,有一個長度為N的整數序列,並且有以下三 ...
  • 導讀 : 1.if語句 2.while語句 一、if語句 if語句是最常用的條件控制語句,Python中的一般形式為: if 條件一: statements elif 條件二: pass # 空語句/占位語句 else: statements Python中用 elif 代替了 else if ,所 ...
  • 本文總結自oldboy python教學視頻。 一、前言 1.裝飾器本質上就是函數,功能是裝飾其他函數,為其他函數添加附加功能。 裝飾器在裝飾函數時必須遵循3個重要的原則: (1)不能修改被裝飾的函數的源代碼 (2)不能修改被裝飾的函數的調用方式 (3)不能修改表裝飾函數的返回結果 2.實現裝飾器的 ...
  • Django在項目開發中有著結構清晰、層次明顯、容易編寫理解查閱demo的優點,那麼我們來個小案例具體看看。 一、項目結構簡析: 我們按照上一篇中的開發流程步驟創建一個新項目myblog,項目下有應用home、存放html文件templates的、運行項目生成的db.sqlite3和manage.p ...
  • 給定一個有序數組,你需要原地刪除其中的重覆內容,使每個元素只出現一次,並返回新的長度。 不要另外定義一個數組,您必須通過用 O(1) 額外記憶體原地修改輸入的數組來做到這一點。 個人代碼,較為弱智。 class Solution {public: int removeDuplicates(vector ...
  • 一直來,都是使用Vivado中自帶的GMIItoRGMII IP核來完成GMII轉RGMII的功能;儘管對GMII及RGMII協議都有一定的瞭解,但從沒用代碼實現過其功能。由於使用IP時,會涉及到MDIO配置IP寄存器的問題,覺得麻煩。因此決定用代碼實現GMII轉RGMII的功能。 參考Lattic ...
  • 在做JavaWeb的SSH框架開發的時候,遇到過很多的細節問題,這裡大概記錄下 我使用的IDE是Eclipse(老版本)三大框架:Spring4、Struts2、Hibernate5 1.web.xml的配置 1.ContextLoaderListener的作用: ContextLoaderList ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...