使用Node.js建立WebSocket服务器

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

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

1.安装ws模块

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

为了保证项目模块的独立性,不建议在安装模块时盲目使用 -g参数(这会把模块装进全局模块文件夹)

2.调用ws模块

使用 require('ws') 即可调用

3.创建服务器

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

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

然后创建出ws服务器

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

实际上除了以上两个选项,还有好多可选项,具体定义在此: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.处理连接

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

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

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

上面说到要记得把连接引用到另一个更方便管理的数组里,实际上也不是必要的,一般这样做的目的是可以知道在线人数这些信息,并且给同一组里的连接广播消息。

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

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

 




如文中无特殊说明,本站均使用以下协议:知识共享许可协议
知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

本博客使用Disqus评论系统,如果看不到评论框,请尝试爬墙。