Socket
Socket 基本概念
Socket 是对 TCP/IP 协议族的一种封装,是应用层与 TCP/IP 协议族通信的中间软件抽象层。从设计模式的角度看来,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。
Socket 还可以认为是一种网络间不同计算机上的进程通信的一种方法,利用三元组(ip 地址,协议,端口)就可以唯一标识网络中的进程,网络中的进程通信可以利用这个标志与其它进程进行交互。
Socket 起源于 Unix ,Unix/Linux 基本哲学之一就是“一切皆文件”,都可以用“打开(open) –> 读写(write/read) –> 关闭(close)”模式来进行操作。因此 Socket 也被处理为一种特殊的文件。
Websocket
传统的 HTTP 协议是一个请求-响应协议,请求必须先由浏览器发给服务器,服务器才能响应这个请求,再把数据发送给浏览器。
WebSocket 是 HTML5 新增的协议,是一个双向通信的通道,任何一方都可以主动发消息给对方。服务器的更新可以被及时推送给客户端。
传统做法
兼容:
- FLASH Socket
- 长轮询: 定时发送 ajax
- long poll: 发送 --> 有消息时再 response
WebSocket API
在 WebSocket API 中,浏览器和服务器只需要完成一次握手,利用了 HTTP 协议来建立连接,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
- new WebSocket(url)
- Socket.onopen 连接建立时触发
- Socket.onmessage 客户端接收服务端数据时触发
webSocket.send()方法,可用于向服务器发送数据。- Socket.onerror 通信发生错误时触发
- Socket.onclose 连接关闭时触发
特点
- 没有同源限制,客户端可以与任意服务器通信。
- 协议标识符是 ws(如果加密,则为 wss),服务器网址就是 URL。
和普通的 HTTP 请求有几点不同
- GET 请求的地址不是类似/path/,而是以 ws://开头的地址;
- 请求头 Upgrade: websocket 和 Connection: Upgrade 表示这个连接将要被转换为 WebSocket 连接;
- Sec-WebSocket-Key 是用于标识这个连接,并非用于加密数据;
- Sec-WebSocket-Version 指定了 WebSocket 的协议版本。
该响应代码101表示本次连接的 HTTP 协议即将被更改,更改后的协议就是 Upgrade: websocket 指定的 WebSocket 协议。