一,背景
最近实验室的一个 dns 项目中用到了 websocket,我当时没太理解怎么使用以及它是干什么的。
这篇文章我想讲给大家的是:
- 什么是 socket?什么是 websocket?两者有什么区别?
- ws 和 socket.io 是什么?两者有什么区别?
二,socket
socket 英文翻译是“插座”,在计算机领域叫做“套接字”,其实我觉得插座已经很形象了,socket 就是网络中的插座,相当于一个中转站。当我们的数据按照 TCP/IP 协议到达目的地(服务器或者客户端)之后,我们的 socket 就会将 TCP/IP 复杂的功能封装好,提供接口给应用层调用。
常见的 http 协议就是应用层协议,负责定义传输的两端,比如数据以及相互传输的计算机的信息。
三,websocket
websocket 是一种网络应用层协议,可以在单个 TCP 连接上进行全双工通信,说人话就是可以在两台电脑上进行主动的同时的相互数据交流。
什么是单工、半双工和全双工?
- 单工:信息只能单向传输,只能从一端传输到另一端,比如收音机,只能接受电台信号没办法将自己的信息传回去。
- 半双工:信息能双向传输,但是不能同时双向传输。比如我们常见的 http 请求,浏览器发送请求给服务器,在一段时间后,服务器接受请求再把响应数据传输给浏览器。
- 全双工:信息能够同时双向传输。比如我们的 websocket 就是可以做到服务器和浏览器双向同时传输数据,浏览器可以主动发送数据给服务器,服务器也可以主动发送数据给浏览器(http 是办不到的,它只能浏览器主动发给服务器,服务器被动地反馈)
四,socket 和 websocket 的区别
- 两者没什么关系
- websocket 和 http 一样都是一个应用层协议,而 socket 并不是协议,而是介于传输层和应用层之间的接口层,封装了传输层 TCP/IP 协议族的复杂的功能,而只给应用层呈现简单的接口。(当然网上有很多人的观点是:socket 是一个传输控制层协议)
五,ws 和 socket.IO
我们前后端编程时想要使用 websocket 的话,最常见的场景就是写聊天室。
对于开发 websocket 项目我们可以使用基础的 websocket 接口(前端)加他的封装库 ws(node.js 后端),再或者就是它的拓展库 socket.io(前后端都有响应包)。
前端 websocket 基本接口+WS(JS)/其他后端语言的基础 websocket 接口:如果你只是完成一个简单的项目,比如只是为了完成某个服务器不断返回数据的接口,那么可以使用基本的 websocket 接口。
Socket.IO:对于复杂的场景(并不基于一个简单的业务逻辑),比如一个聊天室项目,我们可以使用 socket.io,它的优点是在普通的 websocket 上提供了更高级的功能:比如 HTTP 长轮询回退、自动重新连接、数据包缓冲等实用的功能。(想要具体地了解自己去哦)
注意:socket.io 不是简单的 websocket 封装实现,而是进行了扩展。所以它和普通的 websocket 前后端是不互通的。意思就是说 socket.io 前端包必须对接 socket.io 的后端包,不能存在 socket.io 后端对接 websocket 前端。
参考资料
- socket 编程入门:http://c.biancheng.net/socket/
- http、socket、websocket 之间的联系和区别:https://www.cnblogs.com/aspirant/p/11334957.html
- websocket 的 MDN:https://developer.mozilla.org/zh-CN/docs/Web/API/Websockets_API
- ws 官网:https://github.com/websockets/ws
- socket.io 文档:https://socket.io/zh-CN/
- ws 测试工具:http://wstool.jackxiang.com/
- socket.io 测试工具:https://admin.socket.io/#/