C#WebSocket教程展示了如何在C#中使用websockets。
网络套接字
WebSocket是一种计算机通信协议,通过单个TCP连接提供全双工通信通道。WebSockets用于高度交互的应用程序,例如游戏、聊天或股票市场。
我们创建一个支持websocket的ASP.NET应用程序。我们创建了两个客户端:一个C#控制台程序和一个带有JS代码的HTML页面。
C#ASP.NETWebSocket服务器
下面是一个简单的websocket服务器应用程序。
using System.Net; using System.Net.WebSockets; using System.Text; var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.UseWebSockets(); app.Map("/ws", async context => { if (context.WebSockets.IsWebSocketRequest) { using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); var rand = new Random(); while (true) { var now = DateTime.Now; byte[] data = Encoding.ASCII.GetBytes($"{now}"); await webSocket.SendAsync(data, WebSocketMessageType.Text, true, CancellationToken.None); await Task.Delay(1000); long r = rand.NextInt64(0, 10); if (r == 7) { await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "random closing", CancellationToken.None); return; } } } else { context.Response.StatusCode = (int)HttpStatusCode.BadRequest; } }); app.Run("http://localhost:5050");
应用程序将当前日期时间发送给客户端。当随机数生成器选择值7时,我们关闭连接。
using System.Net.WebSockets;
Websocket支持在System.Net.WebSockets
命名空间中。
app.UseWebSockets();
我们使用UseWebSockets
启用websocket中间件。
app.Map("/ws", async context => {
我们将通信映射到/ws
端点。
if (context.WebSockets.IsWebSocketRequest) {
我们检查该请求是否为WebSocket建立请求。
using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
我们使用AcceptWebSocketAsync
将请求转换为WebSocket连接。
var now = DateTime.Now; byte[] data = Encoding.ASCII.GetBytes($"{now}"); await webSocket.SendAsync(data, WebSocketMessageType.Text, true, CancellationToken.None);
我们使用SendAsync
向客户端发送数据。数据是当前日期时间。
long r = rand.NextInt64(0, 10); if (r == 7) { await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "random closing", CancellationToken.None); return; }
我们使用CloseAsync
随机关闭连接。
$ dotnet watch
我们使用dotnetwatch
启动服务器。
C#WebSocket客户端
在下一个示例中,我们创建一个C#控制台程序,该程序与服务器建立websocket连接。
using System.Net.WebSockets; using System.Text; Console.Title = "Client"; using var ws = new ClientWebSocket(); await ws.ConnectAsync(new Uri("ws://localhost:5050/ws"), CancellationToken.None); byte[] buf = new byte[1056]; while (ws.State == WebSocketState.Open) { var result = await ws.ReceiveAsync(buf, CancellationToken.None); if (result.MessageType == WebSocketMessageType.Close) { await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None); Console.WriteLine(result.CloseStatusDescription); } else { Console.WriteLine(Encoding.ASCII.GetString(buf, 0, result.Count)); } }
我们从控制台应用程序建立到服务器的websocket连接。
using var ws = new ClientWebSocket();
ClientWebSocket
用于在C#应用程序中创建websocket客户端。
await ws.ConnectAsync(new Uri("ws://localhost:5050/ws"), CancellationToken.None);
我们使用ConnectAsync
异步连接到ws://localhost:5050/ws
端点。
byte[] buf = new byte[1056];
这是我们读取响应的缓冲区。
var result = await ws.ReceiveAsync(buf, CancellationToken.None);
我们使用ReceiveAsync
读取响应。
if (result.MessageType == WebSocketMessageType.Close) { await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None); Console.WriteLine(result.CloseStatusDescription); } else { Console.WriteLine(Encoding.ASCII.GetString(buf, 0, result.Count)); }
如果消息类型是WebSocketMessageType.Close
,我们使用CloseAsync
从客户端关闭连接并打印关闭说明。否则我们打印接收到的数据。
$ dotnet run 10/28/2022 2:57:48 PM 10/28/2022 2:57:49 PM 10/28/2022 2:57:50 PM 10/28/2022 2:57:51 PM 10/28/2022 2:57:52 PM 10/28/2022 2:57:53 PM 10/28/2022 2:57:54 PM 10/28/2022 2:57:55 PM random closing
JSWebSocket客户端
在下一个例子中,我们创建一个JS客户端,它创建一个websocket连接。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script type="text/javascript"> function connect() { let o = document.getElementById("output"); var ws = new WebSocket("ws://localhost:5050/ws"); ws.onmessage = e => { o.innerText = e.data; }; ws.onclose = e => { o.innerText = e.reason; }; }; </script> </head> <body> <div id="output"> </div> <p> <a href="#" onclick="connect()">Start</a></div> </p> </body> </html>
在JS中,我们使用WebSocket
类以及onmessage
和onclose
处理程序。
在本文中,我们在C#中使用了WebSocket。
列出所有C#教程。