1. 概念
2. websocket 和http
Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。
WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,调用的WebSocket的send函数在实现中最终都是通过TCP的系统接口进行传输的
典型的握手案例:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket //请求的协议是 “websocket”。
Connection: Upgrade //表示客户端想要更改协议
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //浏览器随机生成的安全密钥
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13 //WebSocket 协议版本,当前为 13
Origin: http://example.com //客户端页面的源
其中,下面这两句就是告诉 Apache 、 Nginx 等服务器,我发起的是websocket协议
Upgrade: websocket
Connection: Upgrade
服务器随后返回下面这个,就是表示告诉客户端我已经成功切换协议啦
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
3. ajax轮询、long poll 、websocket 的区别
4. websocket 优缺点
概括地说就是:支持双向通信,更灵活,更高效,可扩展性更好。
优点:
- 实时性: 由于WebSocket的持久化连接,它可以实现实时的数据传输,避免了Web应用程序需要不断地发送请求以获取最新数据的情况。
- 双向通信: WebSocket协议支持双向通信,这意味着服务器可以主动向客户端发送数据,而不需要客户端发送请求。
- 减少网络负载: 由于WebSocket的持久化连接,它可以减少HTTP请求的数量,从而减少了网络负载。
- WebSocket 没有跨源限制。
- 浏览器对 WebSocket 支持很好。
- 可以发送/接收字符串和二进制数据
缺点:
-
需要浏览器和服务器都支持: WebSocket是一种相对新的技术,需要浏览器和服务器都支持。一些旧的浏览器和服务器可能不支持WebSocket。
-
需要额外的开销: WebSocket需要在服务器上维护长时间的连接,这需要额外的开销,包括内存和CPU。
-
安全问题: 由于WebSocket允许服务器主动向客户端发送数据,可能会存在安全问题。服务器必须保证只向合法的客户端发送数据。
5. websocket 的API
WebSocket 方法:
- socket.send(data) //向服务器发送数据。
- socket.close([code], [reason])。 //关闭WebSocket连接
- /*code 是一个特殊的 WebSocket 关闭码(可选)
reason 是一个描述关闭原因的字符串(可选)
例如:
// 关闭方:
socket.close(1000, "Work complete");
// 另一方
socket.onclose = event => {
// event.code === 1000
// event.reason === "Work complete"
// event.wasClean === true (clean close)
};*/
WebSocket 事件:
let socket = new WebSocket('ws://example.com/ws'); //创建 WebSocket 对象
socket .onopen = function(e) {
console.log('WebSocket 连接已经建立。');
};
socket.onmessage = function(event) {
alert(`接收到服务器消息: ${event.data}`);
};
socket.onclose = function(event) {
console.log('WebSocket 连接已经关闭。');
if (event.wasClean) {
alert(`[close] Connection closed cleanly, code=${event.code} reason=${event.reason}`);
} else {
// 例如服务器进程被杀死或网络中断
// 在这种情况下,event.code 通常为 1006
alert('[close] Connection died');
}
};
socket.onerror = function(error) {
console.error('WebSocket 连接出现错误:', event);
alert(`[error] ${error.message}`);
};