AD:靠谱的微信小程序外包开发

admin

admin

发表于 2017-02-16 12:50:44

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说明(https://github.com/websockets/ws)就可以。我这里着重讲的是针对微信小程序实现的加入ssl的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');

  // 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服务端实现了。


  


528阅读 | 1评论
你的回应
  • KennAlicieno

    2017-05-09 13:39:14 KennAlicieno

    Prix Levitra 10 Acheter viagra Gnc Viagra Substitute Discount Propecia Online Xenical Prix Stendra 100mg On Sale No Doctor

写文章

1848