轻源码

  • QingYuanMa.com
  • 全球最大的互联网技术和资源下载平台
搜索
一起源码网 门户 终极进阶 查看主题

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

发布者: yyyyq | 发布时间: 2018-2-2 10:38| 查看数: 4841| 评论数: 1|帖子模式

作者:小水熊;原文地址
摘要: 微信小程序服务端使用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的websocket实现。

要使用ssl,首先你得有ssl证书,生产环境建议你去买一个ssl证书。开发环境你可以给自己生成一个ssl自签名证书临时用一下。

这里说下Linux 系统怎么通过openssl命令生成 证书。

首先执行如下命令生成一个key

  1. openssl genrsa -des3 -out ssl.key 1024

然后他会要求你输入这个key文件的密码。不推荐输入。由于生成时候必须输入密码。你可以输入后 再删掉。

  1. mv ssl.key xxx.key
  2. openssl rsa -in xxx.key -out ssl.key
  3. rm xxx.key

然后根据这个key文件生成证书请求文件

  1. openssl req -new -key ssl.key -out ssl.csr

以上命令生成时候要填很多东西 一个个看着写吧(可以随便,毕竟这是自己生成的证书)

最后根据这2个文件生成crt证书文件

  1. openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt

这里365是证书有效期 。这个随意。最后使用到的文件是key和crt文件。

nodejs websocket(ssl)服务端实现,wss-sample.js

  1. 'use strict';
  2. var fs = require('fs');
  3. // you'll probably load configuration from config
  4. var cfg = {
  5. ssl: true,
  6. port: 8080,
  7. ssl_key: 'ssl.key',
  8. ssl_cert: 'ssl.crt'
  9. };
  10. var httpServ = (cfg.ssl) ? require('https') : require('http');
  11. var WebSocketServer = require('ws').Server;
  12. var app = null;
  13. // dummy request processing
  14. var processRequest = function(req, res) {
  15. res.writeHead(200);
  16. res.end('All glory to WebSockets!\n');
  17. };
  18. if (cfg.ssl) {
  19. app = httpServ.createServer({
  20. // providing server with SSL key/cert
  21. key: fs.readFileSync(cfg.ssl_key),
  22. cert: fs.readFileSync(cfg.ssl_cert)
  23. }, processRequest).listen(cfg.port);
  24. } else {
  25. app = httpServ.createServer(processRequest).listen(cfg.port);
  26. }
  27. // passing or reference to web server so WS would knew port and SSL capabilities
  28. var wss = new WebSocketServer({
  29. server: app
  30. });
  31. wss.on('connection', function(wsConnect) {
  32. wsConnect.on('message', function(message) {
  33. console.log(message);
  34. wsConnect.send('reply');
  35. });
  36. });

运行这个案例, 你需要先安装ws库。

  1. npm install ws

运行:

  1. node wss-sample.js

你可以在浏览器打开https://localhost:8080,在浏览器控制台验证一下websocket是否可以连接:

  1. var socket = new WebSocket('wss://localhost:8080/');
  2. socket.onmessage = function (e) {
  3. console.log('Server: ' + e.data);
  4. };
  5. socket.send('your message');

如果是在express框架下实现websocket(ssl)。wss-express.js:

  1. 'use strict'
  2. var fs = require('fs');
  3. var https = require('https');
  4. var server = https.createServer(
  5. {
  6. 'key':fs.readFileSync('ssl.key'),
  7. 'cert':fs.readFileSync('ssl.crt')
  8. }
  9. );
  10. var url = require('url');
  11. var WebSocketServer = require('ws').Server;
  12. var wss = new WebSocketServer({
  13. server: server
  14. });
  15. var express = require('express');
  16. var app = express();
  17. var port = 8080;
  18. app.use(function(req, res) {
  19. res.send({
  20. msg: "hello"
  21. });
  22. });
  23. wss.on('connection', function connection(ws) {
  24. var location = url.parse(ws.upgradeReq.url, true);
  25. // you might use location.query.access_token to authenticate or share sessions
  26. // or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)
  27. ws.on('message', function incoming(message) {
  28. console.log('received: %s', message);
  29. });
  30. ws.send('something');
  31. });
  32. server.on('request', app);
  33. server.listen(port, function() {
  34. console.log('Listening on ' + server.address().port)
  35. });

简单的微信小程序websocket服务端实现了。

最新评论

你笑的就像海市 发表于 2022-5-17 16:44
java音乐系统

轻源码让程序更轻更快

QingYuanMa.com

工作时间 周一至周六 8:00-17:30

侵权处理

客服QQ点击咨询

关注抖音号

定期抽VIP

Copyright © 2016-2021 https://www.171739.xyz/ 滇ICP备13200218号

快速回复 返回顶部 返回列表