有不少公司將nodejs的socket.io作為websocket的解決方案,很遺憾的是socket.io是對websocket的封裝,並不支持html5原始的websocket協議,微信小程序使用的websocket卻是接近於html5原始websocket協議,socket.io居然沒有用武之地了。
當然情況也沒有慘到需要你自己一步一步去實現websocket服務端,我們的大node有很多websocket庫,ws就是其中一個,號稱最輕量級,最快。ws的用法比較簡單,直接看github說明(https://github.com/websockets/ws)就可以。我這里着重講的是針對微信小程序實現的加入ssl的websocket實現。
生成SSL證書
要使用ssl,首先你得有ssl證書,生產環境建議你去買一個ssl證書。開發環境你可以給自己生成一個ssl自簽名證書臨時用一下。
這里說下Linux 系統怎么通過openssl命令生成 證書。
首先執行如下命令生成一個key
openssl genrsa -des3 -out ssl.key 1024
然后他會要求你輸入這個key文件的密碼。不推薦輸入。由於生成時候必須輸入密碼。你可以輸入后 再刪掉。
mv ssl.key xxx.key openssl rsa -in xxx.key -out ssl.key rm xxx.key
然后根據這個key文件生成證書請求文件
openssl req -new -key ssl.key -out ssl.csr
以上命令生成時候要填很多東西 一個個看着寫吧(可以隨便,畢竟這是自己生成的證書)
最后根據這2個文件生成crt證書文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
這里365是證書有效期 。這個隨意。最后使用到的文件是key和crt文件(就在當前目錄下)。
服務端實現
nodejs websocket(ssl)服務端實現,wss-sample.js
'use strict'; var fs = require('fs'); // you'll probably load configuration from config var cfg = { ssl: true, port: 8080, ssl_key: 'ssl.key', ssl_cert: 'ssl.crt' }; var httpServ = (cfg.ssl) ? require('https') : require('http'); var WebSocketServer = require('ws').Server; var app = null; // dummy request processing var processRequest = function(req, res) { res.writeHead(200); res.end('All glory to WebSockets!\n'); }; if (cfg.ssl) { app = httpServ.createServer({ // providing server with SSL key/cert key: fs.readFileSync(cfg.ssl_key), cert: fs.readFileSync(cfg.ssl_cert) }, processRequest).listen(cfg.port); } else { app = httpServ.createServer(processRequest).listen(cfg.port); } // passing or reference to web server so WS would knew port and SSL capabilities var wss = new WebSocketServer({ server: app }); wss.on('connection', function(wsConnect) { wsConnect.on('message', function(message) { console.log(message); wsConnect.send('reply'); }); });
運行:
node wss-sample.js
你可以在瀏覽器打開https://localhost:8080,在瀏覽器控制台驗證一下websocket是否可以連接:
var socket = new WebSocket('wss://localhost:8080/'); socket.onmessage = function (e) { console.log('Server: ' + e.data); }; socket.send('your message');
如果前面沒有配置SSL,可以將cfg.ssl設為false並使用ws,而不是wss
問題
你會發現SSL證書還是沒有生效,
解決方法:根據提示,將證書安裝到“受信任的根證書頒發機構”
例如,我是用的chrome瀏覽器,在設置-->高級-->管理證書-->受信任的根證書頒發機構-->導入ssl.crt
(不過也建議去騰訊雲、或七牛雲存儲申請一個免費的)
導入成功后如下:
參考鏈接:
1. https://my.oschina.net/waterbear/blog/788100
2. https://blog.csdn.net/weixin_34358092/article/details/92906077
3. https://blog.csdn.net/yunzaitian163/article/details/8213676