使用Node.js建立WebSocket服务器

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

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

1.安装ws模块

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

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

然后ws模块将被安装在node_modules文件夹里,至于它在哪里也不关我们的事了。

如果在安装过程中出现了什么错误,可以先忽略,因为我每次安装都出错但照样可以用。。。

2.调用ws模块

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

3.创建服务器

请无视上面的第二步。。。

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

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

然后创建出ws服务器

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

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

  • host:指定这个服务器的地址/域名,不指定则将接受所有接收到的发向任何域的请求
  • server:由于websocket建立在http协议上,所以连接websocket必须要有一个http服务器(使用http模块建立的服务器),如果不指定使用的http server,那么ws将会自动创建一个http server
  • handleProtocols:如何处理协议,似乎没啥用处,具体见这里
  • path:文档也没写这个是干嘛用的。。。看起来也没什么用
  • noServer:不知道这是啥,文档也没写。估计是不使用http模块创建服务器
  • disableHixie:没文档,什么鬼!
  • clientTracking:没文档,什么鬼!
  • perMessageDeflate:没文档,什么鬼!

4.处理连接

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

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

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

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

5.连接的方法

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

data:要发送的数据,可以是二进制数据或者字符串

options:{

mask:true||false  //是否使用掩码,具体例子见此

binary:true||false  //是否是二进制流

compress::true||false  //看起来是压缩的意思,不过我没见过实例

}

callback:发送完成后调用的函数,(注:send是一个异步方法)

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

code:返回一个状态码

data:结束时再给客户端最后发送一点东西

  • 暂停:socket.pause()
  • 继续:socket.resume()
  • PING:socket.ping([data], [options], [dontFailWhenClosed])

data:ping的同时发送给客户端的数据

options:同send

dontFailWhenClosed:true||false  //如果连接已断开,是否抛出错误

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

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

  • 流:socket.stream([options], callback)

实在没看懂文档里写的什么意思,也没google到相关实例,先放着吧

  • 终止连接:socket.terminate()

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

 

 


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

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

 





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

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