摘要:微信小程序?qū)Φ谌椒?wù)端的網(wǎng)絡(luò)通信方式支持https和Websocket。WebSocket是HTML5開始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。為了解決HTTP協(xié)議效率低下的問題,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊。WebSocket在數(shù)據(jù)傳輸?shù)姆€(wěn)定性和數(shù)據(jù)傳輸量的大小方面,具有很大的性能優(yōu)勢。有不少公司將nodejs的socket
微信小程序?qū)Φ谌椒?wù)端的網(wǎng)絡(luò)通信方式支持https和Websocket。WebSocket是HTML5開始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。為了解決HTTP協(xié)議效率低下的問題,HTML5定義了WebSocket協(xié)議,能更好的節(jié)省服務(wù)器資源和帶寬并達(dá)到實(shí)時(shí)通訊。WebSocket在數(shù)據(jù)傳輸?shù)姆€(wěn)定性和數(shù)據(jù)傳輸量的大小方面,具有很大的性能優(yōu)勢。有不少公司將nodejs的socket.io作為websocket的解決方案,很遺憾的是socket.io是對websocket的封裝,并不支持html5原始的websocket協(xié)議,微信小程序使用的websocket卻是接近于html5原始websocket協(xié)議,socket.io居然沒有用武之地了。當(dāng)然情況也沒有慘到需要你自己一步一步去實(shí)現(xiàn)websocket服務(wù)端,我們的大node有很多websocket庫,ws就是其中一個(gè),號(hào)稱最輕量級,最快。ws的用法比較簡單,直接看github說明(https://github.com/websockets/ws)就可以。我這里著重講的是針對微信小程序?qū)崿F(xiàn)的加入ssl的websocket實(shí)現(xiàn)。
要使用ssl,首先你得有ssl證書,生產(chǎn)環(huán)境建議你去買一個(gè)ssl證書。開發(fā)環(huán)境你可以給自己生成一個(gè)ssl自簽名證書臨時(shí)用一下。
這里說下Linux 系統(tǒng)怎么通過openssl命令生成 證書。
首先執(zhí)行如下命令生成一個(gè)key
openssl genrsa -des3 -out ssl.key 1024
然后他會(huì)要求你輸入這個(gè)key文件的密碼。不推薦輸入。由于生成時(shí)候必須輸入密碼。你可以輸入后 再刪掉。
mv ssl.key xxx.key openssl rsa -in xxx.key -out ssl.key rm xxx.key
然后根據(jù)這個(gè)key文件生成證書請求文件
openssl req -new -key ssl.key -out ssl.csr
以上命令生成時(shí)候要填很多東西 一個(gè)個(gè)看著寫吧(可以隨便,畢竟這是自己生成的證書)
最后根據(jù)這2個(gè)文件生成crt證書文件
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
這里365是證書有效期 。這個(gè)隨意。最后使用到的文件是key和crt文件。
nodejs websocket(ssl)服務(wù)端實(shí)現(xiàn),wss-sample.js
'use strict';var fs = require('fs');// you'll probably load configuration from configvar 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 processingvar 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 capabilitiesvar wss = new WebSocketServer({ server: app }); wss.on('connection', function(wsConnect) { wsConnect.on('message', function(message) { console.log(message); wsConnect.send('reply'); }); });
運(yùn)行這個(gè)案例, 你需要先安裝ws庫。
npm install ws
運(yùn)行:
node wss-sample.js
你可以在瀏覽器打開https://localhost:8080,在瀏覽器控制臺(tái)驗(yàn)證一下websocket是否可以連接:
var socket = new WebSocket('wss://localhost:8080/'); socket.onmessage = function (e) { console.log('Server: ' + e.data); }; socket.send('your message');
如果是在express框架下實(shí)現(xiàn)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服務(wù)端實(shí)現(xiàn)了。