使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

WebSockets 是一种协议,它能让客户端和服务器之间通过单个长期连接进行无缝通信。与 HTTP 等遵循请求-响应模式的传统网络通信方法不同,WebSockets 引入了全双工通信通道。这意味着客户端和服务器可以同时发送和接收数据,从而实现即时更新和实时交互。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端
Http 与 Websocket(来源:
Microsoft Learn)

WebSockets 常用于需要实时数据更新的场景。例如,多人游戏大厅聊天、实时通知、股票市场数据馈送和实时协作工具。这些应用需要即时通信和数据交换,而 WebSockets 恰好能提供这些功能。

不过,虽然 WebSockets 具有显著的优势,但它们确实需要特定的服务器端支持。服务器需要实现一个遵守 WebSocket 协议的 WebSocket 服务器。该协议包括处理传入连接、管理客户端会话以及在已连接的客户端之间路由消息。

在本教程中,我们将使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端。

前提条件

  1. Visual Studio 2022
  2. .NET 6.0

创建 WebSocket 服务器

首先,打开 Visual Studio 并从模板中创建一个新的 ASP.NET Core 项目。选择使用 C# 作为语言的 “ASP.NE Core Empty “模板。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

如果此选项不可用,请从 Visual Studio 安装程序安装“ ASP.NET 和 Web 开发”功能。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

输入您的项目名称、位置和解决方案名称。我将使用“ SimpleWS-Server ”作为我们的 WebSocket 服务器的项目和解决方案名称。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

选择 .NET 6.0 作为框架,保持其他一切不变。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

项目生成后,我们将得到一个空白的 ASP.NET Core 6.0 模板。我们可以删除未使用的 “Hello World!”端点。将 app.Run() 修改为 app.RunAsync()。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

在我们的项目中使用 WebSocket。在 WebApplication 实例中调用 UseWebSockets() 函数。为了方便起见,还可以调用 builder.WebHost.UseUrls() 方法来设置服务器的 URL 和端口。在本教程中,我使用 localhost 作为 URL,端口为 6969。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

然后,我们需要为 WebSocket 服务器映射一个端点。为此,我们将使用 app.Map() 方法,将路由和上下文映射到用于处理 WebSocket 的路由和上下文中。在此,我们将使用 “ws “作为 WebSocket 路由。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

在上下文中,我们将通过检查 context.WebSockets.IsWebSocketRequest 来配置端点,使其只接受 WebSocket 连接。如果不是 WebSocket 请求,则将状态代码设为 BadRequest (400)。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

检查连接后是一个WebSocketRequest。我们可以使用下面的代码来定义当前的连接实例。

using var ws = await context.WebSockets.AcceptWebSocketAsync();

通过 WebSocket 实例,我们可以使用ws.State检查连接状态。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

以下是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 状态为“打开”时发送消息,并在状态为“关闭”或“中止”时中断循环。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

WebSocket 服务器已经完成了。现在要检查它,需要一个 WebSocket 客户端。

创建 WebSocket 客户端

首先,打开 Visual Studio 并创建一个 C# .NET 控制台应用程序:

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

输入您的项目名称、位置和解决方案名称。我将使用“ 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);

现在,让我们创建一个任务,在连接有效时接收来自服务器的消息。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

要接收消息,我们可以在 WebSocketClient 实例上使用 ReceiveAsync() 方法。ReceiveAsync 方法接受 ArraySegment<byte> 和 CancellationToken。要接收消息,我们需要创建一个新的字节数组作为缓冲区,我们将用它来创建 ArraySegment<byte>。对于 CancellationToken,我们将使用 CancellationToken.None。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

请记住,结果仍然是字节数组,以将其显示为字符串。需要先对其进行编码,可以通过使用Encoding.UTF8.GetString()方法来做到这一点。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

最后,在处理结果之前,我们需要检查连接是否未关闭。我们可以通过检查消息类型是否不是 Close 来做到这一点

result.MessageType == WebSocketMessageType.Close

这是我们的 WebSocket 客户端的最终代码。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

现在运行 WebSocket 服务器,然后运行客户端。如果运行成功,我们的客户端就会每隔 1 秒显示一次当前时间。

使用 C# 在 .NET 6.0 中实现 WebSocket 服务器和客户端

这样,我们就可以创建一个可以发送信息的 WebSocket 服务器和一个可以接收信息的客户端。

服务器和客户端的代码可以在https://github.com/k-end-rick/SimpleWS查看

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论