用nodejs快速實現微信小程式的websocket服務端
摘要: 微信小程式服務端使用websocket方式。socket.io已作為nodejs體系中被廣泛應用的websocket解決方案,卻因socket.io對websocket做了高階封裝,不能相容微信小程式所採用的websocket標準協議無法直接使用,此外微信小程式還要求websocket必須是ssl的。本文著重介紹如何ws庫和ssl證書實現微信小程式的websocket服務端。
微信小程式對第三方服務端的網路通訊方式支援https和Websocket。WebSocket是HTML5開始提供的一種在單個 TCP 連線上進行全雙工通訊的協議。為了解決HTTP協議效率低下的問題,HTML5定義了WebSocket協議,能更好的節省伺服器資源和頻寬並達到實時通訊。WebSocket在資料傳輸的穩定性和資料傳輸量的大小方面,具有很大的效能優勢。有不少公司將nodejs的socket.io作為websocket的解決方案,很遺憾的是socket.io是對websocket的封裝,並不支援html5原始的websocket協議,微信小程式使用的websocket卻是接近於html5原始websocket協議,socket.io居然沒有用武之地了。當然情況也沒有慘到需要你自己一步一步去實現websocket服務端,我們的大node有很多websocket庫,ws就是其中一個,號稱最輕量級,最快。ws的用法比較簡單,直接看github說明(
要使用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');
});
});
執行這個案例, 你需要先安裝ws庫。
npm install ws
執行:
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');
如果是在express框架下實現websocket(ssl)。wss-express.js:
'use strict'
var fs = require('fs');
var https = require('https');
var server = https.createServer(
{
'key':fs.readFileSync('ssl.key'),
'cert':fs.readFileSync('ssl.crt')
}
);
var url = require('url');
var WebSocketServer = require('ws').Server;
var wss = new WebSocketServer({
server: server
});
var express = require('express');
var app = express();
var port = 8080;
app.use(function(req, res) {
res.send({
msg: "hello"
});
});
wss.on('connection', function connection(ws) {
var location = url.parse(ws.upgradeReq.url, true);
// you might use location.query.access_token to authenticate or share sessions
// or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)
ws.on('message', function incoming(message) {
console.log('received: %s', message);
});
ws.send('something');
});
server.on('request', app);
server.listen(port, function() {
console.log('Listening on ' + server.address().port)
});
簡單的微信小程式websocket服務端實現了。