免费国产欧美国日产_少妇AV一区二区三区无码_蜜桃精品av无码喷奶水小说_jk18禁网站视频_精产国品一二三级产品区别_被夫の上司に犯波多野结衣_78m成人手机免费看_最爽最刺激18禁视频_偷偷色噜狠狠狠狠的777米奇

易優(yōu)GEO 重磅上線 ~ 一站式GEO優(yōu)化工具,讓豆包、文心一言、DeepSeek 在回答中主動推薦你的品牌,搶占AI流量入口!  點擊查看

小程序模板網(wǎng)

微信小程序云端解決方案教程二:WebSocket長連接應用場景

發(fā)布時間:2017-11-20 16:55 所屬欄目:小程序開發(fā)文檔

部署和運行整體架構1. 準備域名和證書2. 云主機和鏡像部署3. 配置 HTTPS4. 域名解析5. 啟動 WebSocket 服務6. 啟動微信小程序為什么要用 WebSocket通信協(xié)議設計服務器邏輯微信端實現(xiàn)沒事打開小程序,和附近的人剪刀 ...

 
 
 
  • 部署和運行
    • 整體架構
    • 1. 準備域名和證書
    • 2. 云主機和鏡像部署
    • 3. 配置 HTTPS
    • 4. 域名解析
    • 5. 啟動 WebSocket 服務
    • 6. 啟動微信小程序
  • 為什么要用 WebSocket
  • 通信協(xié)議設計
  • 服務器邏輯
  • 微信端實現(xiàn)

沒事打開小程序,和附近的人剪刀石頭布,想來就來,想走就走。誰能成為武林高手?!

微信小程序提供了一套在微信上運行小程序的解決方案,有比較完整的框架、組件以及 API,在這個平臺上面的想象空間很大。

騰訊云拿到了小程序內測資格,研究了一番之后,發(fā)現(xiàn)微信支持 WebSocket 還是很值得玩味的。這個特性意味著我們可以做一些實時同步或者協(xié)作的小程序。

這篇文章分享一個簡單的剪刀石頭布的小游戲的制作,希望能對想要在小程序中使用 WebSocket 的開發(fā)者有幫助。

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

部署和運行

拿到了本小程序源碼的朋友可以嘗試自己運行起來。

整體架構

小程序的架構非常簡單,這里有兩條網(wǎng)絡同步,一條是 HTTPS 通路,用于常規(guī)請求。對于 WebSocket 請求,會先走 HTTPS 后再切換協(xié)議到 WebSocket 的 TCP 連接,從而實現(xiàn)全雙工通信。

1. 準備域名和證書

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

  • 只允許和在 MP 中配置好的域名進行通信,如果還沒有域名,需要注冊一個
  • 網(wǎng)絡請求必須走 HTTPS 協(xié)議,所以你還需要為你的域名申請一個證書。

域名注冊好之后,可以登錄微信公眾平臺配置通信域名了。

2. 云主機和鏡像部署

剪刀石頭布的服務器運行代碼和配置已經(jīng)打包成騰訊云 CVM 鏡像,大家可以直接使用。

騰訊云用戶可以免費領取禮包,體驗騰訊云小程序解決方案。

鏡像部署完成之后,云主機上就有運行 WebSocket 服務的基本環(huán)境、代碼和配置了。

鏡像已包含所有小程序的服務器環(huán)境與代碼,需要體驗其它小程序的朋友無需重復部署

3. 配置 HTTPS

鏡像中已經(jīng)部署了 nginx,需要在 /etc/nginx/conf.d 下修改配置中的域名、證書、私鑰。

配置完成后,即可啟動 nginx。

nginx

4. 域名解析

我們還需要添加域名記錄解析到我們的云服務器上,這樣才可以使用域名進行 HTTPS 服務。

在騰訊云注冊的域名,可以直接使用云解析控制臺來添加主機記錄,直接選擇上面購買的 CVM。

解析生效后,我們在瀏覽器使用域名就可以進行 HTTPS 訪問。

5. 啟動 WebSocket 服務

在鏡像的 nginx 配置中(/etc/nginx/conf.d),已經(jīng)把 /applet/websocket 的請求轉發(fā)到 http://127.0.0.1:9595 處理。我們需要把 Node 實現(xiàn)的 WebSocket 服務在這個端口里運行起來。

進入鏡像中源碼位置:

cd /data/release/qcloud-applet-websocket

使用 pm2 啟動服務:

pm2 start process.json

6. 啟動微信小程序

在微信開發(fā)者工具中修改小程序源碼中的 config.js 配置,把通訊域名修改成上面申請的域名。完成后點擊調試即可連接到 WebSocket 服務進行游戲。

配置完成后,運行小程序就可以看到成功搭建的提示!

為什么要用 WebSocket

使用傳統(tǒng)的 HTTP 輪詢或者長連接的方式也可以實現(xiàn)類似服務器推送的效果,但是這類方式都存在資源消耗過大或推送延遲等問題。而 WebSocket 直接使用 TCP 連接保持全雙工的傳輸,可以有效地減少連接的建立,實現(xiàn)真正的服務器通信,對于有低延遲有要求的應用是一個很好的選擇。

目前瀏覽器對 WebSocket 的支持程度已經(jīng)很好,加上微信小程序的平臺支持,這種可以極大提高客戶端體驗的通信方式將會變得更加主流。

Server 端需要實現(xiàn) WebSocket 協(xié)議,才能支持微信小程序的 WebSocket 請求。鑒于 SocketIO 被廣泛使用,剪刀石頭布的小程序,我們選用了比較著名的 SocketIO 作為服務端的實現(xiàn)。

Socket IO 的使用比較簡單,僅需幾行代碼就可啟動服務。

export class Server {    init(path: string) {        /** Port that server listen on */        this.port = process.env.PORT;        /** HTTP Server instance for both express and socket io */        this.http = http.createServer();        /** Socket io instance */        this.io = SocketIO(this.http, { path });        /** Handle incomming connection */        this.io.on("connection", socket => {            // handle connection        });    }    start() {        this.http.listen(this.port);        console.log(`---- server started. listen : ${this.port} ----`);    }}const server = new Server();server.init("/applet/ws/socket.io");server.start();

但是,SocketIO 和一些其它的服務器端實現(xiàn),都有其配套的客戶端來完成上層協(xié)議的編碼解碼。但是由于微信的限制(不能使用 window 等對象), SocketIO 的客戶端代碼在微信小程序平臺上是無法運行的。

經(jīng)過對 SocketIO 通信進行抓包以及研究其客戶端源碼,筆者封裝了一個大約 100 行適用于微信小程序平臺的 WxSocketIO 類,可以幫助開發(fā)者快速使用 SocketIO 來進行 WebSocket 通信。

const socket = new WxSocketIO();socket.on('hi', packet => console.log('server say hi: ' + packet.message));socket.emit('hello', { from: 'techird' });

如果想要使用微信原生的 API,那么在服務器端也可以直接使用 ws 來實現(xiàn) W3C 標準的接口。不過 SocketIO 支持多進程的特性,對于后續(xù)做橫向擴張是很有幫助的。騰訊云在后面也會有計劃推出支持大規(guī)模業(yè)務需求的 WebSocket 連接服務,減小業(yè)務的部署成本。

通信協(xié)議設計

實現(xiàn)一個多客戶端交互的服務,是需要把中間涉及到所有的消息類型都設計清楚的,就像是類似剪刀石頭布這樣一個小程序,都有下面這些消息類型。

消息 方向 說明
hello c => s 客戶端連上后發(fā)送 hello 信息,告知服務器自己身份以及位置。
hi s => c 服務器響應客戶端打招呼,并且反饋附近有多少人
join c => s 客戶端請求加入一個房間進行游戲
leave c => s 客戶端請求退出房間
start s => c 房間里面全部人都 ready 后,會發(fā)送游戲開始的信號,并且告知客戶端游戲時間。
choice c => s 客戶端選擇出剪刀、石頭還是布
face c => s 客戶端更新自己的表情
movement s => c 有用戶更新選擇或者更新表情會通知其它用戶
result s => c 超過選擇時間后,游戲結束,廣播游戲結果

具體每個消息的參數(shù)可以參考源碼里的 server/protocol.brief.md

服務器邏輯

服務器的邏輯很簡單:

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

微信端實現(xiàn)

微信小程序直接使用上面的協(xié)議,針對不同的場景進行渲染。整體的狀態(tài)機如下。

狀態(tài)機整理清楚后,就是根據(jù)狀態(tài)機來控制什么時候發(fā)送消息,接到消息后如何處理的問題了。具體實現(xiàn)請參照 app/pages/game/game.js 里的源碼。



易優(yōu)小程序(企業(yè)版)+靈活api+前后代碼開源 碼云倉庫:starfork
本文地址:http://m.szcjxy.com/wxmini/doc/develop/17840.html 復制鏈接 如需定制請聯(lián)系易優(yōu)客服咨詢: 點擊咨詢
在線客服