有不少公司将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证书。开发环境你可以给自己生成一个ssl自签名证书临时用一下。

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

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

openssl genrsa -des3 -out ssl.key 

然后他会要求你输入这个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  -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');
});
});

运行:

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

如果前面没有配置SSL,可以将cfg.ssl设为false并使用ws,而不是wss

问题

你会发现SSL证书还是没有生效,

解决方法:根据提示,将证书安装到“受信任的根证书颁发机构”

例如,我是用的chrome浏览器,在设置-->高级-->管理证书-->受信任的根证书颁发机构-->导入ssl.crt

(不过也建议去腾讯云、或七牛云存储申请一个免费的)

导入成功后如下:

参考链接:

1. https://my.oschina.net/waterbear/blog/788100

2.https://blog.csdn.net/weixin_34358092/article/details/92906077

3. https://blog.csdn.net/yunzaitian163/article/details/8213676

用nodejs快速实现websocket服务端(带SSL证书生成)的更多相关文章

  1. nodejs搭建简单的websocket服务端

    创建websocket服务端使用了nodejs-websocket ,首先要安装nodejs-websocket,在项目的目录下: npm install nodejs-websocket 1.搭建w ...

  2. C# WebSocket 服务端示例代码 + HTML5客户端示例代码

    WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...

  3. WebSocket服务端

    http://blog.csdn.net/qq_20282263/article/details/54310737 C# 实现WebSocket服务端 原创 2017年01月10日 09:22:50 ...

  4. 快速搭建Kerberos服务端及入门使用

    快速搭建Kerberos服务端及入门使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Kerberos是一种网络身份验证协议.它旨在通过使用秘密密钥加密为客户端/服务器应用程序提 ...

  5. asp.net网站作为websocket服务端的应用该如何写

    最近被websocket的一个问题困扰了很久,有一个需求是在web网站中搭建websocket服务.客户端通过网页与服务器建立连接,然后服务器根据ip给客户端网页发送信息. 其实,这个需求并不难,只是 ...

  6. Netty 搭建 WebSocket 服务端

    一.编码器.解码器 ... ... @Autowired private HttpRequestHandler httpRequestHandler; @Autowired private TextW ...

  7. 前端学习 node 快速入门 系列 —— 服务端渲染

    其他章节请看: 前端学习 node 快速入门 系列 服务端渲染 在简易版 Apache一文中,我们用 node 做了一个简单的服务器,能提供静态资源访问的能力. 对于真正的网站,页面中的数据应该来自服 ...

  8. C#在服务端验证客户端证书(Certificate)

    使用https协议进行通讯的时候可以设置双向证书认证,客户端验证服务端证书的方法前面已经介绍过了,现在说一下在服务端验证客户端证书的方案. 这里给出的方案比较简单,只需要在Service端的配置文件中 ...

  9. LNMP V1.4一键快速部署Let's Encrypt免费SSL证书

    老左年前在"军哥LNMP V1.4测试版一键脚本安装以及功能上的升级体验"已经简单的体验到目前还没有正式版本的V1.4版本,理论上会在今年儿童节正式上线.从体验和实际的版本变动文档 ...

随机推荐

  1. C#调试程序——断点+几种观察数据的方法

    目录 C#调试程序--断点+观察数据的方法 1.写本文的背景 2.调试与测试 3.断点调试 3.1 F10 3.2 F11 3.3 SHIFT+F11 4.监视 4.1 按照1方法打断点,单步调试. ...

  2. Python 3.7的安装过程

    百度云Pyhton3.7-32位安装包: 链接:https://pan.baidu.com/s/1P5Egkl2KNt_DjhiFaDzqsg提取码:5171 百度云Pyhton3.7-64位安装包: ...

  3. phpmyadmin 4.8.1 远程文件包含漏洞(CVE-2018-12613)

    漏洞详情 范围 phpMyAdmin 4.8.0和4.8.1 原理 首先在index.php 50-63行代码 $target_blacklist = array ( 'import.php', 'e ...

  4. mysql 写入中文乱码

    今天从另一个系统往mysql数据库写入数据,发现中文变成了????? 检查数据库的设置 ,server对应字符集是latinl 调整mysql参数配置,配置文件目录/etc/mysql/mysql.c ...

  5. Pluralsight 科技公司公布自己的avaScript 成为最受欢迎的开发技术

    根据 SDTimes 报道,Pluralsight 科技公司公布自己的 Technology Index,JavaScript 位居榜首. Pluralsight,是美国的一家面向软件开发者的在线教育 ...

  6. MYSQL之事务篇

    目录 事务概述 事务隔离级别 Read Uncommitted Read Committed Repeatable Read Serializable 事务概述 在引入事务之前我们先考虑银行转账的操作 ...

  7. 六、接上一个博客-ITK例子运行结果

    一.程序介绍 该程序的主要思路如下: 二.程序参数 1-程序自己创建三维图像的时候 我自己计算得到的参数如下: 三维图像参数:  旋转参数: 光线投射法参数: 当我们输入参数:  -v 得到程序的输出 ...

  8. Java死锁演示

    Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...

  9. 用 Python 图像识别打造一个小狗分类器

    ​ 项目介绍 小狗分类器可以做什么? 通过这个分类器,你只需要上传照片,就可以得到小狗的品种,以及更多的信息. 这就是所谓的「机器学习」,让机器自己去“学习”.我们今天要做的这个分类任务,是一个“监督 ...

  10. Git终端命令行的常用操作

    一.git源代码管理的优点 方便多人协同开发.工作 降低代码的管理成本 良好的分支管理机制 二.结构分析 服务端和客户端都有版本控制能力,都能进行代码的提交.合并 结构一: 结构二: 三.工作区的创建 ...