微信小程序中如何使用WebSocket實現長連接(含完整源碼)

2021-01-07 即時通訊技術分享

1、前言

微信小程序提供了一套在微信上運行小程序的解決方案,有比較完整的框架、組件以及 API,在這個平臺上面的想像空間很大。騰訊雲研究了一番之後,發現微信支持 WebSocket 還是很值得玩味的。這個特性意味著我們可以做一些實時同步或者協作的小程序。這篇文章分享了一個基於WebSocket長連接的微信小程序——簡單的剪刀石頭布小遊戲的製作過程,希望能對想要在微信小程序中使用 WebSocket 的開發者有所幫助。(說明:本文完整源碼請從文末附件下載,52im.net/thread-1703-1-1.html)

2、相關文章

《新手入門貼:史上最全Web端即時通訊技術原理詳解》《Web端即時通訊技術盤點:短輪詢、Comet、Websocket、SSE》《新手快速入門:WebSocket簡明教程》《WebSocket詳解(一):初步認識WebSocket技術》《WebSocket詳解(二):技術原理、代碼演示和應用案例》《WebSocket詳解(三):深入WebSocket通信協議細節》《WebSocket詳解(四):刨根問底HTTP與WebSocket的關係(上篇)》《WebSocket詳解(五):刨根問底HTTP與WebSocket的關係(下篇)》《WebSocket詳解(六):刨根問底WebSocket與Socket的關係》《socket.io實現消息推送的一點實踐及思路》《Web端即時通訊技術的發展與WebSocket、Socket.io的技術實踐》《Web端即時通訊安全:跨站點WebSocket劫持漏洞詳解(含示例代碼)》《開源框架Pomelo實踐:搭建Web端高性能分布式IM聊天伺服器》《使用WebSocket和SSE技術實現Web端消息推送》《詳解Web端通信方式的演進:從Ajax、JSONP 到 SSE、Websocket》《MobileIMSDK-Web的網絡層框架為何使用的是Socket.io而不是Netty?》《理論聯繫實際:從零理解WebSocket的通信原理、協議格式、安全性》>> 更多同類文章 ……

3、運行效果

整個遊戲非常簡單,連接到伺服器後自動匹配在線玩家(沒有則分配一個機器人),然後兩人進行剪刀石頭布的對抗遊戲。當對方進行拳頭選擇的時候,頭像會旋轉,這個過程使用 WebSocket 會變得簡單快速。

4、為什麼要用 WebSocket

使用傳統的 HTTP 輪詢或者長連接的方式也可以實現類似伺服器推送的效果,但是這類方式都存在資源消耗過大或推送延遲等問題(詳見文章《新手入門貼:史上最全Web端即時通訊技術原理詳解》)。而 WebSocket 直接使用 TCP 連接保持全雙工的傳輸,可以有效地減少連接的建立,實現真正的伺服器通信,對於有低延遲有要求的應用是一個很好的選擇。目前瀏覽器對 WebSocket 的支持程度已經很好,加上微信小程序的平臺支持,這種可以極大提高客戶端體驗的通信方式將會變得更加主流。Server 端需要實現 WebSocket 協議,才能支持微信小程序的 WebSocket 請求。鑑於 SocketIO 被廣泛使用(詳見《Socket.IO介紹:支持WebSocket、用於WEB端的即時通訊的框架》),剪刀石頭布的小程序,我們選用了比較著名的SocketIO 作為服務端的實現。Socket IO 的使用比較簡單,僅需幾行代碼就可啟動服務。

但是,SocketIO 和一些其它的伺服器端實現,都有其配套的客戶端來完成上層協議的編碼解碼。但是由於微信的限制(不能使用 window 等對象), SocketIO 的客戶端代碼在微信小程序平臺上是無法運行的。經過對 SocketIO 通信進行抓包以及研究其客戶端源碼,筆者封裝了一個大約 100 行適用於微信小程序平臺的 WxSocketIO類,可以幫助開發者快速使用 SocketIO 來進行 WebSocket 通信。

如果想要使用微信原生的 API,那麼在伺服器端也可以直接使用 ws 來實現 W3C 標準的接口。不過 SocketIO 支持多進程的特性,對於後續做橫向擴張是很有幫助的。騰訊雲在後面也會有計劃推出支持大規模業務需求的 WebSocket 連接服務,減小業務的部署成本。

5、通信協議設計

實現一個多客戶端交互的服務,是需要把中間涉及到所有的消息類型都設計清楚的,就像是類似剪刀石頭布這樣一個小程序,都有下面這些消息類型。具體每個消息的參數可以參考源碼裡的server/protocol.brief.md

6、伺服器邏輯

伺服器的邏輯很簡單:

收到用戶請求加入房間(join),就尋找還沒滿的房間: - 找到房間,則加入; - 沒找到房間,創建新房間。有用戶加入的房間檢查是否已滿,如果已滿,則: - 給房間裡每個用戶發送開始遊戲的信號(start); - 啟動計時器,計時器結束後進行遊戲結算。遊戲結算: - 兩兩之間 PK,贏方分數加一,輸方減一,最終得每個玩家基本得分 x; - 對於每個玩家,如果分數 x 大於 0,則視為勝利,連勝次數加一,否則連勝次數歸零; - 本局得分為分數 x 乘以連勝次數。發送本局遊戲結果給房間裡的每位玩家。

6、微信小程序端的實現

微信小程序直接使用上面的協議,針對不同的場景進行渲染。整體的狀態機如下。狀態機整理清楚後,就是根據狀態機來控制什麼時候發送消息,接到消息後如何處理的問題了。具體實現請參照 app/pages/game/game.js裡的源碼。

7、部署和運行

拿到了本小程序源碼的朋友可以嘗試自己運行起來(完整源碼請從文末附件下載)。

7.1整體架構

小程序的架構非常簡單,這裡有兩條網絡同步,一條是 HTTPS 通路,用於常規請求。對於 WebSocket 請求,會先走 HTTPS 後再切換協議到 WebSocket 的 TCP 連接,從而實現全雙工通信。

7.2準備域名和證書

在微信小程序中,所有的網絡請求受到嚴格限制,不滿足條件的域名和協議無法請求,具體包括:

只允許和在 MP 中配置好的域名進行通信,如果還沒有域名,需要註冊一個;網絡請求必須走 HTTPS 協議,所以你還需要為你的域名申請一個證書;域名註冊好之後,可以登錄微信公眾平臺配置通信域名了。

7.3雲主機和鏡像部署

剪刀石頭布的伺服器運行代碼和配置已經打包成騰訊雲 CVM 鏡像,大家可以直接使用。騰訊雲用戶可以免費領取禮包,體驗騰訊雲小程序解決方案。鏡像已包含「剪刀石頭布」和「小相冊」兩個小程序的伺服器環境與代碼,需要體驗兩個小程序的朋友無需重複部署。

7.4配置 HTTPS

鏡像中已經部署了nginx,需要在/etc/nginx/conf.d下修改配置中的域名、證書、私鑰。配置完成後,即可啟動 nginx。

7.5域名解析

我們還需要添加域名記錄解析到我們的雲伺服器上,這樣才可以使用域名進行 HTTPS 服務。在騰訊雲註冊的域名,可以直接使用雲解析控制臺來添加主機記錄,直接選擇上面購買的 CVM。解析生效後,我們在瀏覽器使用域名就可以進行 HTTPS 訪問。

7.6啟動 WebSocket 服務

在鏡像的 nginx 配置中(/etc/nginx/conf.d),已經把 /applet/websocket的請求轉發到http://127.0.0.1:9595 處理。我們需要把 Node 實現的 WebSocket 服務在這個埠裡運行起來。進入鏡像中源碼位置:cd /data/release/qcloud-applet-websocket使用pm2 啟動服務:pm2 start process.json

7.7啟動微信小程序

在微信開發者工具中修改小程序源碼中的 config.js 配置,把通訊域名修改成上面申請的域名。完成後點擊調試即可連接到 WebSocket 服務進行遊戲。配置完成後,運行小程序就可以看到成功搭建的提示!

8、附件下載(完整源碼)

52im.net/thread-1703-1-1.html

相關焦點

  • 兩個步驟讓你獲取任何微信小程序源碼!
    在實際練手中,完全是黑盒的,看到人家上線的小程序的效果,純靠推測,部分效果在絞盡腦汁後能做出大致的實現,但是有些細節,費勁全力都沒能做出來。很想一窺源碼,查看究竟,看看大廠的前端大神們是如何規避了小程序的各種奇葩的坑。於是就想到獲取到小程序地源文件,然後再對其進行反編譯還原為原始碼,來作為學習參考。我百度了各種關於小程序地反編譯教程,但是感覺都不太適合像我這樣地初學小白,踩了挺多坑。
  • 【投稿】actix-websocket 使用 protocol的一點個人理解
    actix的docs和example對protocol的使用有點省略,對著源碼實驗了下,終於搞清楚了。
  • 仿微信的IM聊天時間顯示格式(含iOS/Android/Web實現)[圖文+源碼]
    Android工具類源碼,效果可媲美微信 [附件下載]》《高仿Android版手機QQ可拖拽未讀數小氣泡源碼 [附件下載]》《Android聊天界面源碼:實現了聊天氣泡、表情圖標(可翻頁) [附件下載]》《高仿Android版手機QQ首頁側滑菜單源碼 [附件下載]》《分享java AMR音頻文件合併源碼,全網最全》《Android
  • 微信小程序「反編譯」實戰(二):源碼還原
    在上一篇文章《微信小程序「反編譯」實戰(一):解包》中,我們詳細介紹了如何獲取某一個小程序的 .wxapkg 包,以及分析了 .wxapkg 包的結構
  • 便民超市小程序源碼,生鮮、超市等實體店開發微信小程序的意義
    超市商城小程序的開啟,可謂是打開一個全新的渠道,通過手機就能夠迅速的選購自己的產品,完全不需要浪費更多的時間在產品的甄選以及路途的奔波上。便民超市小程序源碼,生鮮、超市等實體店開發微信小程序的意義在哪裡?
  • 八問WebSocket協議:為你快速解答WebSocket熱門疑問
    它使用方面、應用廣泛,已經滲透到前後端開發的各種場景中。對http一問一答中二式流程(就是從所周之的「長輪詢」技要啦)的不滿,催生了支持雙向通信的WebSocket誕生。WebSocket是個不太乾淨協議。本文將從8個常見的疑問入手,為還不了解WebSocket協議的開發者快速普及相關知識,從而節省您學習WebSocket的時間。
  • 微信小程序完整版點餐系統【附帶源碼】
    本系統是微信小程序——餐飲點餐商城是針對餐飲行業推出的一套完整的餐飲解決方案,實現了用戶在線點餐下單、外賣、叫號排隊、支付、配送等功能,完美的使餐飲行業更高效便捷!使用教程註冊開通小程序帳號https://mp.weixin.qq.com/ 根據自己的實際情況選擇 「企業」、「個體工商戶」身份,註冊小程序帳號,商城類小程序不支持個人用戶上線,所以一定要選擇企業或者個體戶,獲得你自己小程序的 appid 和 secret 信息,保存好,下面會用到:如何查看小程序的AppID和AppSecret
  • 小程序雲端解決方案,微信小程序及後臺交互架構
    1小程序雲端解決方案 小程序不需要安裝,易於分享與傳播、開發容易同時用戶體驗也非常好,那麼,他的這些特性是如何實現的呢?騰訊雲高級工程師朱展,從小程序架構分析、小程序解決方案進化歷程以及騰訊雲小程序解決方案介紹三方面給出了答案。
  • 使用iris框架和websocket開發簡單的頁面訪問次數記錄功能
    Iris 框架裡內置 websocket 模塊,可以實現 websocket 伺服器,核心是封裝了 neffos 開源模塊。Websocket 可實現全雙工通信,也就是客戶端和伺服器在建立連接之後,可以互相接收和發送消息,具有長連接的特性。可以利用 websocket 實現移動端消息推送,地圖位置實時顯示等功能,提高用戶體驗。
  • 搭建websocket消息推送服務,必須要考慮的幾個問題
    另外還有兩個目的:服務端檢測到某個客戶端遲遲沒有心跳過來可以主動關閉通道,讓它下線;客戶端檢測到某個服務端遲遲沒有響應心跳也能重連獲取一個新的連接。2.建立具有良好兼容性的客戶端SDK雖說現在主流瀏覽器都支持websocket,但在編碼中還是會遇到瀏覽器兼容性問題,而且通過websocket通信的客戶端早已不僅限於各種web瀏覽器,還包括越來越多的APP,小程序。
  • 小程序實現BLE藍牙連接
    自從微信小程序提供BLE藍牙api後,網上隨便一搜便是各種稱實現了小程序連接ble 的功能的文章,上來就貼代碼,貼效果圖,對於我們這種沒有與硬體開發打過交道的網際網路開發者
  • 微信小程序的場景化應用在哪裡?騰訊雲高級PM詳細解讀
    在微信公開課2017Pro中,張小龍反覆強調了,小程序,最大的入口,就是在各類線下的商業場景中,這是對「讓商業存在於無形之中」的理念的詮釋。所以,我們首先從線下的商業場景,來談一談微信小程序的場景化應用。
  • 聊聊OkHttp實現WebSocket細節,包括鑑權和長連接保活及其原理!
    一、序OkHttp 應該算是 Android 中使用最廣泛的網絡庫了,我們通常會利用它來實現 HTTP 請求,但是實際上它還可以支持 WebSocket,並且使用起來還非常的便捷。那本文就來聊聊,利用 OkHttp 實現 WebSocket 的一些細節,包括對 WebSocket 的介紹,以及在傳輸前如何做到鑑權、長連接保活及其原理。
  • 科普:除了源碼下載,微信小程序還有哪些開發方式?
    製作一個微信小程序真的有那麼難?那要看你用的是什麼方式了。這種方式你要先下載微信官網開發者工具,新建一個小程序項目,填入小程序的 AppID(需先在微信公眾平臺申請好),勾選 「創建 QuickStart 項目」,你就得到了你的第一個小程序了,點擊頂部菜單編譯就可以在微信開發者工具中預覽你的第一個小程序。具體注意事項需要參考官方配置文檔。
  • 【開發實錄】在鴻蒙開發板上使用Websocket(移植自librws庫)
    基礎:完成官方的快速入門教程雖然在web雙向通信中,除了使用ajax(單向輪詢)外,一般都推薦websocket,但網上關於websocket的實現代碼很少,而且大部分為js和java,很少有C語言。因為課程項目開發需要使用到websocket,就在網上尋找了挺久的,終於找到了這個庫。
  • Web端即時通訊實踐乾貨:如何讓WebSocket斷網重連更快速?
    試想打開網絡一分鐘後,微信的網絡不能即時感知到socket連接的恢復,無法即時收發聊天消息的話,是不是很崩潰?因此,如何在複雜網絡場景下,更即時快速地感知網絡變動,並快速恢復WebSocket的可用性,就變得尤為重要。本文將基於筆者的開發實踐,分享WebSocket在不同狀態下、不同的網絡狀態下,應該如何實現快速斷網重連。
  • SpringBoot+Netty+Websocket整合案例(實現基本的聊天功能)
    之前使用Springboot整合了websocket,實現了一個後端向前端推送信息的基本小案例,這篇文章主要是增加了一個新的框架就是Netty,實現一個高性能的websocket伺服器,並結合前端代碼,實現一個基本的聊天功能。你可以根據自己的業務需求進行更改。
  • 如何判斷網校源碼是否值得使用?
    如何判斷網校源碼是否值得使用? 1、檢查下載的源碼是否是完整版 很多源碼下載之後,會發現網校系統功能不完整。所以這個時候就需要通過搜索其他網站源碼或者類似的源碼來替代,甚至需要重新做網站。因此,源碼是否完整是非常重要的,在使用的時候一定要檢查好。 2、下載的網站源碼是否有作者或團隊在維護 網絡上很多免費的源碼都是二次搬運的,沒有原作者和團隊進行維護。
  • 錯過了微信小程序,別再錯過抖音小程序了
    3年前,微信小程序出現,一群小程序開發者賺的盆滿缽滿,你又錯過了。先入局者,迅速佔有市場份額,賺得財富,而後知後覺的你,夾在中間不上不下。2020年,抖音小程序迎來需求井噴期,而這次,你還要錯過嗎?而小程序作為一個連接一切的工具性輕應用,在熱議上中上線的小程序是近年來最大的移動網際網路商機,一些大牌商家紛紛率先上線小程序,搶佔流量紅利,實現營收激增!