一種網絡通訊協議(握手階段使用的是http 1.1),若是須要服務端主動向客戶端推送信息可使用它。
全雙工,服務端和客戶端能夠互通消息。node
相對於各類論詢,不只省掉屢次握手消耗,節省帶寬資源,並且不用屢次去詢問是否有新數據可消耗。nginx
須要服務端配合,學習成本高些web
若是須要獲取新數據的頻次少,一直保持連接的話,浪費服務器資源。express
技術方案:nodejs + nginx + 微信小程序小程序
hosts文件配置:微信小程序
127.0.0.1 localhost 127.0.0.1 www.test.com
服務端:服務器
var express = require('express'); var ws = require('ws'); const http = require('http'); var server = http.createServer(express()); /** * 建立websocket服務 */ const wss = new ws.createServer({ server, path: '/wss' }, ws => { serveMessage(ws); }); /** * 監聽websocket服務錯誤 */ wss.on('error', (err) => { console.log(err); }); /** * 進行簡單的 WebSocket 服務,對於客戶端發來的全部消息都回復回去 */ function serveMessage(ws) { // 監聽客戶端發來的消息 ws.on('message', (message) => { console.log(`WebSocket received: ${message}`); ws.send(`Server: Received(${message})`); }); // 監聽關閉事件 ws.on('close', (code, message) => { console.log(`WebSocket client closed (code: ${code}, message: ${message || 'none'})`); }); // 鏈接後立刻發送成功響應 ws.send(`Server: 收到個人消息了嘛`); } server.listen(8888);
nginx配置(ps: 若是隻是調試的話也可使用80端口):微信
server { server_name www.test.com; listen 443; ssl on; ssl_certificate xxx.crt; # 證書 ssl_certificate_key yyy.key; # 密鑰,生成方式可自行搜索 access_log /usr/local/etc/nginx/access.log; # 記錄訪問日誌 error_log /usr/local/etc/nginx/error.log; # 記錄錯誤日誌 proxy_read_timeout 10s; #設置超時時間,防止node服務就是掛的 proxy_connect_timeout 5s; #設置超時時間,防止node服務就是掛的 location /wss { proxy_pass http://localhost:8888; proxy_http_version 1.1; # 必需 proxy_set_header Upgrade $http_upgrade; # 必需 proxy_set_header Connection $connection_upgrade; # 必需 proxy_set_header Host $host; # 非必需 proxy_set_header X-Real-IP $remote_addr; # 非必需 proxy_set_header X-Real-Port $remote_port; # 非必需 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 非必需 proxy_set_header X-Forwarded-Protocol "$scheme"; # 非必需 } location / { proxy_pass http://localhost:999; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Protocol $scheme; } }
小程序客戶端(ps: 具體使用語法能夠查看mp.weixin.qq.com官方小程序文檔):websocket
wx.connectSocket({ url: 'wss://www.test.com/wss', data: { message: 'test' }, success: function (res) { console.log('成功了', res); }, fail: function () { console.log('失敗了'); } }); wx.onSocketOpen(function (res) { //balabala,能夠向服務端發消息了 } wx.onSocketMessage(function(data) { //接收到服務端消息,balabala } wx.onSocketError(function (res) { //socket錯誤,balabala }
websocket 客戶端自動關掉連接:緣由是長時間不和websocket服務端交流,超過了nginx設置的proxy_read_timeout時間就自動關閉了,若是想長時間連接,能夠採用setTimeout等相似工具判斷斷了重鏈。網絡
upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server:...: 若是nginx確保沒錯,多半是websocket server的緣由,好比個人,解決方法就是把node中socket.io模塊換成了ws模塊。