websocket是一种比较简单的协议,各种语言中都有很多实现版本,实际上它们差别不大,都是在websocket的基础上做些封装,随便选一个即可。
socket.io就是众多websocket库中的一种,它并不像其它库那样简单地实现了一下websocket,而是在websocket外面包裹了厚厚的一层。普通的websocket(例如ws库)只需要服务端就够了,socket.io自定义了一种基于websocket的协议,所以socket.io的服务端和客户端必须配套。简言之,如果服务端使用socket.io,那么客户端就没得选了,必然也用socket.io的客户端。
socket.io的服务端是基于node实现的(只提供了这一种语言的服务端实现),同时它提供了多种语言的客户端,包括JavaScript、Java、C++、Swift、Dart等,可以看出,socket.io是为了移动端才支持多种语言的,socket.io的目标很高远:统一天下,做最好的websocket库。
socket.io在websocket基础上提供了哪些功能呢?主要包括如下几个方面:
- 可靠稳定。即便服务端使用代理或者负载均衡,也能够连接成功;
- 跨平台。各种浏览器、各种移动端操作系统、各种形状的终端都支持;
- 掉线重连和掉线检测。这跟socket.io自定义的ping协议有关;
- 封装完好。API简洁清晰,支持room风格的websocket。
然而,在node中ws库远远要比socket.io流行,这可能是因为人们都喜欢接近本质的东西而不喜欢过多封装。ws已经足够好用了。基于ws,socket.io的多余功能完全可以自己用少量代码实现。
参考资料
socket.io
https://www.npmjs.com/package/socket.io
ws
https://www.npmjs.com/package/ws