微信小程序服务端使用websocket方式。socket.io已作为nodejs体系中被广泛应用的websocket解决方案,却因socket.io对websocket做了高级封装,不能兼容微信小程序所采用的websocket标准协议无法直接使用,此外微信小程序还要求websocket必须是ssl的。

安装ws库

npm install ws


新建index.js

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');
    });
});


运行之后,打开浏览器https://localhost:8080,可以在浏览器控制台运行以下代码测试是否跑通

var socket = new WebSocket('wss://localhost:8080/');

socket.onmessage = function (e) {
  console.log('Server: ' + e.data);
};

socket.send('your message');


如果是在express框架下实现websocket(ssl)

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)
});


评论  表情