[Node.js]使用Node.js建立WebSocket服务器

node上有多种websocket模块可以选择,本文推荐模块`ws` ,因为它不需要在客户端挂额外的js文件。

不像`socket.io` 模块,`ws` 是一个单纯的websocket模块,不提供向前兼容(也就是fallback),使用最新浏览器的原生Websocket API即可通信。

1.安装ws模块

假设你已经有nodejs了,现在进入需要使用ws模块的项目目录,打开对应路径的命令行窗口,执行

npm install ws

`-g`参数(这会把模块装进全局模块文件夹)

2.调用ws模块

使用`require(‘ws’)` 即可调用

3.创建服务器

ws模块包含两部分,一部分是客户端,一部分是服务端。客户端用以连接其他的websocket服务器(实现服务器间的ws通信),服务端用于创建在指定端口监听的服务器。

接下来我们获取一个websocket服务器对象

var WebSocketServer = require('ws').Server;

然后创建出ws服务器

var ws = new WebSocketServer({
	port: 80,//监听的端口
	verifyClient: socketverify //(可选)用于验证连接的函数
});

这样一个服务器就创建好了,接着定义`socketverify` 函数以验证连接是否符合要求,如果创建服务器时没有设置`verifyClient` ,那么有连接上门的时候服务器就不会直接进行验证,所以推荐定义这一项。

function socketverify(info) {
	//做一些事情来验证连接合法性,如果允许连接则return true,否则return false,如下例子
	var origin=info.origin.match(/^(:?.+\:\/\/)([^\/]+)/);
	if (origin.length>=3 && origin[2]=="blog.luojia.me") {
		return true;//如果是来自blog.luojia.me的连接,就接受
	}
	return false;//否则拒绝

	//传入的info参数会包括这个连接的很多信息,你可以在此处使用console.log(info)来查看和选择如何验证连接
}

实际上除了以上两个选项,还有好多可选项,具体定义在此:https://github.com/websockets/ws/blob/master/doc/ws.md#class-websocketserver,以下稍作说明。

      • host:指定这个服务器的地址/域名,不指定则将接受所有接收到的发向任何域的请求
      • server:由于websocket建立在http协议上,所以连接websocket必须要有一个http服务器(使用http模块建立的服务器),如果不指定使用的http server,那么ws将会自动创建一个http server
      • backlog:设置队列中最多可以有多少等待的连接
      • handleProtocols:设置可以用来处理ws子协议的函数,具体见这里
      • path:接收到的连接的url为这个path的时候才会处理这个连接
      • noServer:不创建http服务器
      • clientTracking:设置是否持续跟踪这个连接
      • perMessageDeflate:是否开启deflate压缩。默认为false,要开启的话需要传入一个具有对应参数的对象,详见server文档下面的perMessageDeflate说明
      • maxPayload:最大允许的消息数据字节数。

4.处理连接

现在服务器建立好了,我们需要定义一系列响应连接的操作。

一般来说,作为服务器,要做的就是等待客户端的连接,所以要做一个处理上门连接的函数

ws.on('connection',function(wsocket) {
	//获取的websocket对象,在这里可理解为一个连接,一般来说,你需要把它存起来,一般是存进一个数组,以便于对连接的管理
});

这就是处理连入连接的大门,接着我们可以为连接定义一些事件处理函数。

ws.on('connection',function(wsocket) {
	wsocket.on('message',message);
	wsocket.on('close',close);
	wsocket.on('error',error);
	wsocket.on('open',open);
});

function message(msg){
	//对接收到的消息做些什么
}
function error(err){
	//处理错误
}
function close(){
	//连接关闭时做些什么
}
function open(){
	//此链接开启后做些什么
}

5.连接的方法

发送数据:wsocket.send(data, [options], [callback])

      • data : 要发送的数据,可以是二进制数据或者字符串
      • options : {
        mask:true||false  //是否使用掩码,具体例子见此
        binary:true||false  //是否是二进制流
        compress::true||false  //看起来是压缩的意思,不过我没见过实例
        }
      • callback : 发送完成后调用的函数,(注:send是一个异步方法)

关闭连接:wsocket.close([code], [data])

      • code : 返回一个状态码
      • data : 结束时再给客户端最后发送一点东西

暂停:wsocket.pause()

继续:wsocket.resume()

PING:wsocket.ping([data], [options], [dontFailWhenClosed])

      • data : ping的同时发送给客户端的数据
      • options : 同send
      • dontFailWhenClosed : true||false  //如果连接已断开,是否抛出错误

PONG:wsocket.pong([data], [options], [dontFailWhenClosed])

同上。也许你会奇怪为啥有个ping还有个pong,他们的区别就是他们发送的数据其实不一样,一个包含的是ping帧(0x9),一个包含的是pong帧(0xA)『标准』,pong是对于接到ping之后的回应,以让双方都知道连接还存在。

终止连接:wsocket.terminate()

不向客户端发送关闭帧就立刻关闭连接,不推荐对正常连接使用。


看完这些,就足够创建一个功能健全的websocket服务器了。

要创建通过https的websocket服务器,请看这里:2877

对于文章内我无法查明的内容如果你知道请留言补充,谢谢。



本文发布于 https://luojia.me

本站文章未经文下加注授权不得拷贝发布。

0 0 投票数
打分
订阅评论
提醒
guest
2 评论
内联反馈
查看所有评论
明明
游客
明明
3 年 前

交换下友情连接 http://www.iming.info 我的微信 melovexiaomingming

李东云
游客
李东云
4 年 前

感谢分享~
有个地方补充一下:
ping :是像send一样,主动发起的,是服务端=>浏览器
pong:是像connect一样,被动监听的,是浏览器=>服务端