2.14WebSocket 双工通信

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

WebSocket 的应用场景:

  • 实时聊天应用WebSocket 可以实现实时的消息传递,使得用户间的交流几乎无延迟。
  • 在线游戏:对于需要快速响应的游戏,WebSocket 能够提供低延迟的数据传输。
  • 股票市场更新:实时更新股票价格和其他金融信息。
  • 协同编辑工具:允许多个用户同时编辑同一个文档,并实时看到其他人的更改。
  • 实时地图应用:例如导航应用中实时交通状况的更新。

以下示例展示了如何使用 WebSocketClient 连接服务器:

cs
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();

WebSocketServer-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 可能更加轻量和易于实现。