WebSockets 是一种协议,它能让客户端和服务器之间通过单个长期连接进行无缝通信。与 HTTP 等遵循请求-响应模式的传统网络通信方法不同,WebSockets 引入了全双工通信通道。这意味着客户端和服务器可以同时发送和接收数据,从而实现即时更新和实时交互。
WebSockets 常用于需要实时数据更新的场景。例如,多人游戏大厅聊天、实时通知、股票市场数据馈送和实时协作工具。这些应用需要即时通信和数据交换,而 WebSockets 恰好能提供这些功能。
不过,虽然 WebSockets 具有显著的优势,但它们确实需要特定的服务器端支持。服务器需要实现一个遵守 WebSocket 协议的 WebSocket 服务器。该协议包括处理传入连接、管理客户端会话以及在已连接的客户端之间路由消息。
在本教程中,我们将使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端。
前提条件
- Visual Studio 2022
- .NET 6.0
创建 WebSocket 服务器
首先,打开 Visual Studio 并从模板中创建一个新的 ASP.NET Core 项目。选择使用 C# 作为语言的 “ASP.NE Core Empty “模板。
如果此选项不可用,请从 Visual Studio 安装程序安装“ ASP.NET 和 Web 开发”功能。
输入您的项目名称、位置和解决方案名称。我将使用“ SimpleWS-Server ”作为我们的 WebSocket 服务器的项目和解决方案名称。
选择 .NET 6.0 作为框架,保持其他一切不变。
项目生成后,我们将得到一个空白的 ASP.NET Core 6.0 模板。我们可以删除未使用的 “Hello World!”端点。将 app.Run() 修改为 app.RunAsync()。
在我们的项目中使用 WebSocket。在 WebApplication 实例中调用 UseWebSockets() 函数。为了方便起见,还可以调用 builder.WebHost.UseUrls() 方法来设置服务器的 URL 和端口。在本教程中,我使用 localhost 作为 URL,端口为 6969。
然后,我们需要为 WebSocket 服务器映射一个端点。为此,我们将使用 app.Map() 方法,将路由和上下文映射到用于处理 WebSocket 的路由和上下文中。在此,我们将使用 “ws “作为 WebSocket 路由。
在上下文中,我们将通过检查 context.WebSockets.IsWebSocketRequest 来配置端点,使其只接受 WebSocket 连接。如果不是 WebSocket 请求,则将状态代码设为 BadRequest (400)。
检查连接后是一个WebSocketRequest。我们可以使用下面的代码来定义当前的连接实例。
using var ws = await context.WebSockets.AcceptWebSocketAsync();
通过 WebSocket 实例,我们可以使用ws.State检查连接状态。
以下是WebSocketState的可能值
1. None
2. Connecting:连接正在与远程端点协商握手。
3. Open:HTTP 握手完成后的初始状态。
4. CloseSent : 关闭消息已发送到客户端。
5. CloseReceived:从客户端收到关闭消息。
6. Closed:关闭握手优雅地完成。
7.Aborted:连接已中止。
要发送消息,我们可以在 WebSocket 连接实例上使用 SendAsync() 方法。SendAsync 方法接受 ArraySegment<byte>、WebSocketMessageType 枚举、bool endofMessage 和 CancelationToken 作为参数。要向客户端发送文本,我们需要将其转换为字节数组,并创建一个 ArraySegment<byte>。
var message = "Hello World!";
var bytes = Encoding.UTF8.GetBytes(message);
var arraySegment = new ArraySegment<byte>(bytes, 0, bytes.Length);
await ws.SendAsync(arraySegment,
WebSocketMessageType.Text,
true,
CancellationToken.None);
现在让 WebSockets 服务器每 1 秒以“HH:mm:ss”格式向客户端返回当前时间。我们可以通过将用于发送消息的逻辑包装在 while(true) 循环内并使用Thread.Sleep(1000)实现 1 秒延迟来实现此目的。我们还将检查仅在 WebSocket 状态为“打开”时发送消息,并在状态为“关闭”或“中止”时中断循环。
WebSocket 服务器已经完成了。现在要检查它,需要一个 WebSocket 客户端。
创建 WebSocket 客户端
首先,打开 Visual Studio 并创建一个 C# .NET 控制台应用程序:
输入您的项目名称、位置和解决方案名称。我将使用“ SimpleWS-Server ”作为我们的 WebSocket 服务器的项目和解决方案名称。
要创建 WebSocket 客户端,可以使用System.Net.WebSockets中的ClientWebSocket。
using System.Net.WebSockets;
var ws = new ClientWebSocket();
要与 WebSocket 服务器连接,可以使用带有 URL 和取消令牌的ConnectAsync方法。
await ws.ConnectAsync(new Uri("ws://localhost:6969/ws"),
CancellationToken.None);
现在,让我们创建一个任务,在连接有效时接收来自服务器的消息。
要接收消息,我们可以在 WebSocketClient 实例上使用 ReceiveAsync() 方法。ReceiveAsync 方法接受 ArraySegment<byte> 和 CancellationToken。要接收消息,我们需要创建一个新的字节数组作为缓冲区,我们将用它来创建 ArraySegment<byte>。对于 CancellationToken,我们将使用 CancellationToken.None。
请记住,结果仍然是字节数组,以将其显示为字符串。需要先对其进行编码,可以通过使用Encoding.UTF8.GetString()方法来做到这一点。
最后,在处理结果之前,我们需要检查连接是否未关闭。我们可以通过检查消息类型是否不是 Close 来做到这一点
result.MessageType == WebSocketMessageType.Close
这是我们的 WebSocket 客户端的最终代码。
现在运行 WebSocket 服务器,然后运行客户端。如果运行成功,我们的客户端就会每隔 1 秒显示一次当前时间。
这样,我们就可以创建一个可以发送信息的 WebSocket 服务器和一个可以接收信息的客户端。
服务器和客户端的代码可以在https://github.com/k-end-rick/SimpleWS查看
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。