用nodejs快速实现websocket服务端(带SSL证书生成)

有不少公司将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 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‘);
    });
});

运行:

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

原文地址:https://www.cnblogs.com/lfri/p/12005133.html

时间: 2024-10-10 19:51:32

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

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

WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; using System.Text.RegularExpressions; using System.Security.Cryptography; na

.NET 即时通信,WebSocket服务端实例

即时通信常用手段 1.第三方平台 谷歌.腾讯 环信等多如牛毛,其中谷歌即时通信是免费的,但免费就是免费的并不好用.其他的一些第三方一般收费的,使用要则限流(1s/限制x条消息)要么则限制用户数. 但稳定性什么都还不错,又能将服务压力甩出 2.System.Net.Sockets.Socket,也能写一套较好的服务器端.在.NET 4.5之前用较多,使用起来麻烦.需要对数据包进行解析等操作(但貌似网上有对超长包的处理方法) 3.System.Net.WebSockets.WebSocket,这个,

《攻城Online》快速原型:服务端设计

“攻城”服务端采用Photon引擎的框架,其主要逻辑如以下UML所示. 服务端的启动入口为ServerApplication,该类包含着相关的Collection数据集合,而Collection内又有与数据库文件夹Database关联的文件.两个文件夹的内容如图. 简单来说,ServerApplication内缓存着各类数据,并完成与数据库等的关联.而本篇的重点是ServerPeer这个类.下面介绍什么是Peer. 每当一个客户端连接到服务端时,服务端会自动生成一个客户端连接实例,称其为Peer

websocket服务端开发

基于http请求以拉的方式去做服务器的推送,无论是实时性和有效字节都是差强人意的效果. 公司的im系统在与客户端的交互上实际上借助了websocket来实现服务器与客户端的事实消息推送,今天就来简单了解下这个协议,并且自己实现对websocket的响应. 可以看到在理解了tcp和http之后,websocket的设计其实并不复杂,再最开始建立链接的时候客户端实际上会进行一次http请求,只不过请求头的内容有些特别,这里我们来看下: GET /chat HTTP/1.1 Host: server.

Pywss - 用python实现WebSocket服务端

一种类似Flask开发的WebSocket-Server服务端框架,适用python3.X 1.安装模块Pywss pip install pywss 2.搭建简易服务器 2.1 服务端代码 代码简介 route: 注册请求路径 example_1(request, data): request: socket句柄,能够发送和接收数据接.发送数据request.ws.send(data),收数据request.ws_recv(1024) data: 客户端发送的数据存于此处 from pywss

[Go] 实现websocket服务端

直接使用官方子包可以实现websocket协议, golang.org/x/net/websocket 如果在这个目录没有这个包就去github下载net库,放进这个目录$GOPATH/src/golang.org/x/net就行了 服务端代码: package main import ( "time" "log" "net/http" "golang.org/x/net/websocket" ) func main(){ h

虚拟机部署度量快速开发平台服务端出现ora-27101错误的一个解决方法

最近在使用hyper-v虚拟机部署系统总出现的一个数据库错误,部署情况如下:1.把之前现有的一个服务端环境的hyper-v停止,拷贝出去vhd文件2.建立新的虚拟机,选择拷贝出去的文件3.启动新的虚拟机,并更改虚拟机的计算机名称,修改oracle数据库的监听和服务名.4.重启oracle的实例和监听.5.连接到数据库,发现报告以下错误:Error:ORA-01034:Oracle not availableORA-27101:shared memory realm dose not exists

cas 服务端和客户端证书配置(详细)

证书的配置 主要分为两大步:服务端生成配置证书,应用端导入证书. SSO服务端 生成keystore, 此文件用于tomcat/conf/server.xml中配置及导出证书: keytool -genkey -keyalg RSA -alias mlongbosso -dname "cn=passport.mlongbo.com" -keystore /home/ndoc/test/cas/mlongbosso.keystore -storepass 123654 说明:指定使用RS

nodejs socket长连接服务端和测试客户端

想用nodejs写个简单的游戏服务器,正在研究中... 服务区代码server.js var net = require('net'); var HOST = '127.0.0.1'; var PORT = 8080; var chatServer = net.createServer(); var clientList = []; chatServer.on('connection', function(client){ client.name = client.remoteAddress +