Node.js 知识量:9 - 37 - 115
WebSocket是一种在单个TCP连接上进行全双工通信的网络传输协议,独立于HTTP协议,允许在客户端和服务器之间建立持久性的连接,并进行双向数据传输。
WebSocket的工作原理是:用户打开Web浏览器,访问Web站点,Web浏览器(客户端)与Web服务端建立连接。一旦建立了WebSocket连接,Web浏览器和服务器就可以双向实时通信,并且这种连接会一直保持,直到关闭请求。
WebSocket的主要特点有:
建立在TCP协议之上,服务器端的实现比较容易。
与HTTP协议有良好的兼容性,默认端口也是80和443,握手阶段采用HTTP协议,因此不容易被屏蔽,可以通过各种HTTP代理服务器。
数据格式比较轻量,性能开销小,通信高效。
可以发送文本或二进制数据。
没有同源限制,客户端可以与任意服务器通信。
协议标识符是ws(如果加密,则为wss),服务器网址就是URL。
WebSocket的应用场景包括但不限于:需要实时传输消息的场景,如股票交易、抢单、即时通讯、多人协作服务等。
WebSocket的握手过程是WebSocket协议中建立连接的关键步骤。以下是握手过程的基本描述:
客户端向服务器发送WebSocket连接请求。这个请求看起来就像是一个普通的HTTP请求,但其中包含了一些特殊的头部字段,用于指示这是一个WebSocket连接请求。
客户端请求中必须包含"Connection"头部字段,其值为"Upgrade",表示请求将现有的连接升级为WebSocket连接。同时,"Upgrade"头部字段的值也必须设置为"websocket",进一步指明要升级到的协议类型。
客户端请求中还应包含"Sec-WebSocket-Key"头部字段,其值是一个随机生成的字符串,经过特定的算法处理后得到。这个密钥用于后续的WebSocket帧加密和验证。
如果请求来自浏览器客户端,通常还会包含"Origin"头部字段,表示请求的发起源。这是出于安全考虑,服务器可以根据该字段验证请求的合法性。
服务器收到WebSocket连接请求后,会检查请求中的头部字段,确认是否满足WebSocket握手的条件。如果满足条件,服务器会生成响应头,并通过TCP连接返回给客户端。
服务器的响应头中也会包含一些特殊的字段。其中,"Connection"字段的值为"Upgrade",表示接受客户端的连接升级请求。"Upgrade"字段的值同样为"websocket",确认升级到的协议类型。
服务器还会在响应头中包含"Sec-WebSocket-Accept"字段,其值是根据客户端请求中的"Sec-WebSocket-Key"字段计算得到的。这个计算过程使用了特定的加密算法,确保连接的安全性和验证的正确性。
当客户端收到服务器的响应后,会验证响应头中的字段,特别是"Sec-WebSocket-Accept"字段的值是否与预期一致。如果验证通过,客户端和服务器之间的WebSocket连接就成功建立了。
需要注意的是,WebSocket握手过程中使用的是HTTP协议进行通信,但一旦握手完成并建立了WebSocket连接,后续的数据传输就不再依赖于HTTP协议,而是使用WebSocket协议进行高效的双向通信。
在Node.js中,可以使用WebSocket库实现WebSocket握手过程。以下是实现WebSocket握手的基本步骤:
1. 首先,需要在Node.js项目中安装WebSocket库。可以使用npm(Node包管理器)进行安装,运行以下命令:
npm install ws
2. 导入WebSocket库:
const WebSocket = require('ws');
3. 创建WebSocket服务器:
const wss = new WebSocket.Server({ port: 8080 });
这里创建了一个WebSocket服务器,监听在8080端口上。
4. 在WebSocket服务器上监听连接事件:
wss.on('connection', (ws) => { console.log('客户端已连接'); // 处理WebSocket连接逻辑... });
当有客户端连接到服务器时,会触发'connection'事件,并传入一个WebSocket实例对象。在这个回调函数中,可以处理WebSocket连接的逻辑。
5. 客户端与服务器进行握手:
客户端和服务器通过WebSocket库提供的API进行握手。以下是一个简单的握手示例:
const ws = new WebSocket('ws://localhost:8080'); ws.onopen = () => { console.log('WebSocket握手成功'); // 发送消息到服务器或其他操作... }; ws.onerror = (error) => { console.error('WebSocket握手失败:', error); };
这里创建了一个新的WebSocket实例,并指定要连接的服务器地址和端口。在实例上监听了'open'事件,当握手成功时,会触发该事件。同时,还监听了'error'事件,当出现错误时,会触发该事件并打印错误信息。
6. 在握手成功后,客户端和服务器就可以通过WebSocket实例进行双向通信了。可以使用WebSocket实例上的方法发送消息、接收消息等。例如:
ws.send('Hello, server!'); // 发送消息到服务器 ws.onmessage = (message) => { // 接收服务器发送的消息 console.log('收到服务器消息:', message); };
在Node.js中,WebSocket数据传输主要包括发送和接收数据帧。
首先,需要创建一个WebSocket客户端,然后通过ws.send()方法发送数据。这个方法接受一个字符串或Buffer对象作为参数。例如:
ws.send('Hello, server!'); // 发送一个字符串
或者
const buffer = Buffer.from('Hello, server!', 'utf8'); ws.send(buffer); // 发送一个Buffer对象
在服务器端,可以通过WebSocket实例的onmessage事件监听器来接收数据。这个事件监听器接受一个参数,表示接收到的数据。例如:
ws.onmessage = (message) => { console.log('收到客户端消息:', message); };
需要注意的是,WebSocket数据帧是按照WebSocket协议进行编码和传输的。在WebSocket协议中,每个数据帧都由一个或多个字节组成,每个字节都有特定的含义。例如,第一个字节用于指示数据帧的类型(文本、二进制、连接关闭等),后续字节用于存储实际的数据内容。
在Node.js中,WebSocket库提供了对WebSocket协议的封装,使得发送和接收数据变得相对简单。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6