c#

C# websocketserver多线程处理

小樊
147
2024-07-16 15:43:45
栏目: 编程语言

在C#中可以使用System.Net.WebSockets命名空间中的WebSocket类来创建WebSocket服务器。要实现多线程处理,可以使用Task类或Thread类来处理每个WebSocket连接。

以下是一个简单的示例代码,展示了如何使用Task类来处理WebSocket连接:

using System;
using System.Net;
using System.Net.WebSockets;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        HttpListener listener = new HttpListener();
        listener.Prefixes.Add("http://localhost:8080/");
        listener.Start();
        
        Console.WriteLine("Listening for WebSocket connections...");

        while (true)
        {
            HttpListenerContext context = await listener.GetContextAsync();
            if (context.Request.IsWebSocketRequest)
            {
                ProcessWebSocketRequest(context);
            }
            else
            {
                context.Response.StatusCode = 400;
                context.Response.Close();
            }
        }
    }

    static async void ProcessWebSocketRequest(HttpListenerContext context)
    {
        WebSocketContext webSocketContext = await context.AcceptWebSocketAsync(null);
        WebSocket webSocket = webSocketContext.WebSocket;
        
        Task.Run(async () =>
        {
            byte[] buffer = new byte[1024];
            WebSocketReceiveResult result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), System.Threading.CancellationToken.None);

            while (!result.CloseStatus.HasValue)
            {
                //处理接收到的数据
                //...

                result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), System.Threading.CancellationToken.None);
            }

            await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, System.Threading.CancellationToken.None);
        });
    }
}

在上面的示例中,使用Task.Run来创建一个新的任务来处理每个WebSocket连接。在任务中,首先接收来自客户端的数据,并在一个循环中持续接收数据直到连接关闭。处理接收到的数据的逻辑可以根据实际需求进行实现。

这样就可以实现多线程处理WebSocket连接,每个连接在一个独立的任务中进行处理,避免阻塞主线程。

0
看了该问题的人还看了