用nodejs快速实现微信小程序的websocket服务端

要使用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);

// youll 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!
);
};

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

你可以在浏览器打开,在浏览器控制台验证一下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)
});
经验分享 程序员 微信小程序 职场和发展