溫馨提示×

c# websocketserver如何處理連接

c#
小樊
181
2024-12-02 16:46:56
欄目: 編程語言

在C#中,處理WebSocket連接通常需要使用System.Net.WebSockets命名空間中的WebSocket類。以下是一個簡單的示例,展示了如何創建一個基本的WebSocket服務器來處理連接:

  1. 首先,確保在項目中引用了System.Net.WebSockets命名空間。在.csproj文件中添加以下引用:
<PackageReference Include="System.Net.WebSockets" Version="4.5.3" />
  1. 創建一個WebSocket服務器類,如下所示:
using System;
using System.Net.WebSockets;
using System.Threading.Tasks;

public class WebSocketServer
{
    private const string Uri = "ws://localhost:8080/websocket";
    private readonly WebSocketServer _server;

    public WebSocketServer()
    {
        _server = new WebSocketServer(Uri);
    }

    public async Task StartAsync()
    {
        _server.Start();
        Console.WriteLine("WebSocket server started on {0}", Uri);

        while (_server.State == WebSocketServerState.Running)
        {
            var result = await _server.AcceptWebSocketAsync();
            HandleClientConnected(result.WebSocket);
        }
    }

    private void HandleClientConnected(WebSocket webSocket)
    {
        Console.WriteLine("Client connected: {0}", webSocket.Id);

        _ = webSocket.ReceiveAsync(new ArraySegment<byte>(new byte[1024 * 4]), CancellationToken.None)
            .ContinueWith(t =>
            {
                if (t.IsCompletedSuccessfully)
                {
                    var receivedData = t.Result.ToArray();
                    Console.WriteLine($"Received data: {System.Text.Encoding.UTF8.GetString(receivedData)}");

                    _ = webSocket.SendAsync(new ArraySegment<byte>(Encoding.UTF8.GetBytes("Message received")), WebSocketMessageType.Text, true, CancellationToken.None)
                        .ContinueWith(t =>
                        {
                            if (t.IsCompletedSuccessfully)
                            {
                                Console.WriteLine("Message sent to client");
                            }
                        });
                }
            });
    }
}
  1. 創建一個WebSocketServerState枚舉和一個WebSocketServer類,如下所示:
public enum WebSocketServerState
{
    Stopped,
    Running
}

public class WebSocketServer
{
    private readonly Uri _uri;
    private WebSocket _webSocket;
    private WebSocketServerState _state;

    public WebSocketServer(Uri uri)
    {
        _uri = uri;
        _state = WebSocketServerState.Stopped;
    }

    public WebSocketServerState State
    {
        get => _state;
        private set
        {
            _state = value;
            Console.WriteLine($"WebSocket server state changed to: {_state}");
        }
    }

    public async Task StartAsync()
    {
        State = WebSocketServerState.Running;
        var listener = new HttpListener();
        listener.Prefixes.Add(_uri);

        listener.Start();
        Console.WriteLine("WebSocket server started on {0}", _uri);

        while (State == WebSocketServerState.Running)
        {
            var context = await listener.GetContextAsync();
            if (context.Request.HttpMethod == "GET")
            {
                var request = new HttpWebSocketContext(context, _uri);
                _webSocket = request.WebSocket;
                HandleClientConnected(_webSocket);
            }
        }
    }

    public async Task AcceptWebSocketAsync()
    {
        return await _webSocket.AcceptWebSocketAsync();
    }
}
  1. 最后,在Main方法中啟動WebSocket服務器:
public static async Task Main(string[] args)
{
    var server = new WebSocketServer();
    await server.StartAsync();
}

現在,當客戶端連接到WebSocket服務器時,服務器將接收到的消息原樣發送回客戶端。你可以根據需要擴展此示例以處理更復雜的場景,例如發送消息到特定客戶端或廣播消息給所有連接的客戶端。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女