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
本站文章未经文下加注授权不得拷贝发布。
交换下友情连接 http://www.iming.info 我的微信 melovexiaomingming
感谢分享~
有个地方补充一下:
ping :是像send一样,主动发起的,是服务端=>浏览器
pong:是像connect一样,被动监听的,是浏览器=>服务端