2.14WebSocket 双工通信
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket 的应用场景:
- 实时聊天应用:
WebSocket可以实现实时的消息传递,使得用户间的交流几乎无延迟。 - 在线游戏:对于需要快速响应的游戏,
WebSocket能够提供低延迟的数据传输。 - 股票市场更新:实时更新股票价格和其他金融信息。
- 协同编辑工具:允许多个用户同时编辑同一个文档,并实时看到其他人的更改。
- 实时地图应用:例如导航应用中实时交通状况的更新。
以下示例展示了如何使用 WebSocketClient 连接服务器:
using var webSocketClient = new WebSocketClient("wss://ws.postman-echo.com/raw"); // 支持 ws:// 和 wss://// 连接成功事件webSocketClient.Connected += (sender, s) =>{ Console.WriteLine("连接成功"); return Task.CompletedTask;};// 连接关闭事件webSocketClient.Closed += (sender, args) =>{ Console.WriteLine("连接关闭"); return Task.CompletedTask;};// 接收文本消息webSocketClient.TextReceived += (sender, s) =>{ Console.WriteLine(s.Message); return Task.CompletedTask;};// 接收二进制消息webSocketClient.BinaryReceived += (sender, s) =>{ Console.WriteLine(s.Message); return Task.CompletedTask;};// 连接服务器await webSocketClient.ConnectAsync();// 开启一个任务,循环发送消息_ = Task.Run(async () =>{ var i = 0; while (i < 5) { // 发送文本消息 await webSocketClient.SendAsync("Hello, WebSocket!"); await Task.Delay(1000); i++; } // 关闭连接 await webSocketClient.CloseAsync();});// 等待接收消息和关闭事件(阻塞)await webSocketClient.WaitAsync();WebSocket 与 Server-Sent Events (SSE) 的区别:
- 通信方向:
WebSocket支持全双工双向通信,SSE仅支持服务器向客户端单向推送数据。 - 协议:
WebSocket使用独立的WebSocket协议 (ws://或wss://),SSE基于HTTP协议。 - 握手过程:
WebSocket需要特殊的HTTP升级头来转换协议,SSE无需特殊握手,直接通过HTTP请求建立连接。 - 连接保持:
WebSocket连接保持直到显式关闭,SSE可能因网络问题断开,但浏览器会自动重连。 - 数据格式:
WebSocket支持多种数据格式,包括二进制数据,SSE数据格式较固定,通常是简单的文本消息。 - 跨域支持:
WebSocket建立连接时检查跨域策略,连接后不受限,SSE依赖于CORS策略。
选择使用 WebSocket 还是 SSE 主要取决于具体的应用需求:
- 如果需要实现双向通信或处理大量数据流,
WebSocket是更好的选择; - 如果只是需要服务器向客户端推送更新,且对数据格式要求不高,
SSE可能更加轻量和易于实现。