WebSocket建立连接的过程

本文深入探讨了实时通讯的三种主要方式:Ajax轮询、Longpull和Websocket。详细解析了它们的工作原理,性能表现及应用场景,尤其强调了Websocket作为一种长连接协议,在实时通讯中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实时通讯的方式

1.1 Ajax轮询

异步的方式,是通过ajax+js的方式,每隔一段时间发送一个请求到后端,询问服务器有没有相关的消息或者是数据的更新,如果有就把数据拿到前端进行渲染。但是这种方式是一种死循环,会一直循环下去。ajax是不需要刷新浏览器的,页面上的一些状态更新的操作就需要使用ajax轮询去做。

1.2 Long pull

Long pull的原理和Ajax轮询的方式是差不多的,但是不同的是Long pull是一种阻塞的方式。性能差
这两种方式其实都是向服务器发送请求等待处理,都是被动的。这两种方式的性能都是不怎么好的。

1.3 Websocket

websocket是一种连接协议,是一种长连接,http1.0是一种短连接。服务端和客户端会一直保持着连接。并且服务端会主动的推送消息给客户端。websocket是一种实时化的协议,Http的一个周期是request来界定。也就是说有一个请求发送到服务端,服务端就会做出响应。一个request对应一个response。多个request对应的是多个response。数量是一一对应的。
websocket连接建立之后,服务端就会一直不停的向客户端发送请求。主动的推送消息给客户端。只需要建立一次请求,就会源源不断的推送想要的数据给客户端。除非自己断开连接重新连接。

2.websock连接的过程

首先写一个小demo
(1)先在html界面上构建一个骨架,用于展示发送消息和接收消息的内容。

 <div>发送消息:</div>
 <input type="text" id="msgContent"/>
 <input type="button" value="点击发送" onclick="CHAT.chat()"/>
 <div>接收消息:</div>
 <div id="receiveMsg" style="background-color: gainsboro;"></div>

(2)开始编写建立websocket连接的过程
首先定义一个CHAT对象

window.CHAT = {
	soctet: null,
	init:function() {            //初始化的方法
		//判断当前浏览器是否支持websocket
		if(window.WebSocket) {
			// 进行初始化操作
			CHAT.socket = new WebSocket('ws://localhost:8080/ws');     //创建一个新的WebSocket
			//定义CHAT生命周期函数
			CHAT.socket.onopen = function() {
				console.log('客户端和服务端的连接建立成功');
			}
			CHAT.socket.onmessage = function() {
				 console.log('接收到的消息' + e.data); 
				 var receiveMsg = document.getElementById('receiveMsg');
				 var html = receiveMsg.innerHTML;
				 receiveMsg.innerHTML = html + "<br />" + e.data;
			}
			CHAT.socket.onclose = function() {
				console.log('消息关闭.....');
			}
			CHAT.socket.onerror = function() {
					console.log('消息发生错误');
			}
		}else {
			alert('当前浏览器不支持websocket协议');
		}
	},
	chat:function() {
		var msg =  document.getElementById("msgContent");
		CHAT.socket.send(msg.value);
	}
}
### WebSocket 连接建立流程详解 #### TCP 三次握手 在 WebSocket 建立连接之前,客户端和服务器之间首先需要完成 TCP 的三次握手。这一过程确保双方可以可靠地交换数据[^3]。 ```plaintext Client: SYN -> Server Server: SYN-ACK -> Client Client: ACK -> Server ``` #### 发送 HTTP 升级请求 一旦建立了可靠的 TCP 连接,客户端会向服务器发起一个特殊的 HTTP 请求,用于请求将现有连接升级至 WebSocket 协议。此请求包含若干特定头部字段: - `Upgrade`: 表明希望使用的协议名称(通常是 "websocket") - `Connection`: 设置为 "Upgrade" - `Sec-WebSocket-Key`: 随机生成的一串 Base64 编码字符串 - 可选的其他安全性和扩展相关参数 ```http GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Version: 13 ``` #### 接收并解析响应 当服务器接收到上述请求后,会对其中的信息进行验证,并决定是否允许此次升级操作。如果一切正常,则返回一条带有状态码 101 (Switching Protocols) 的响应给客户端,表明即将切换到新的通信模式——即 WebSocket 模式。该响应同样携带了一些必要的头部信息作为回应: - `Upgrade` 和 `Connection` 字段应与客户端发出的内容相匹配; - `Sec-WebSocket-Accept` 是基于客户端提供的 Sec-WebSocket-Key 计算得出的结果; ```http HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= ``` 此时,整个 WebSocket 握手过程结束,双方便可通过这条新建立起来的持久化通道自由传递消息了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值