在C#中,處理WebSocket連接通常需要使用System.Net.WebSockets命名空間中的WebSocket類。以下是一個簡單的示例,展示了如何創建一個基本的WebSocket服務器來處理連接:
System.Net.WebSockets命名空間。在.csproj文件中添加以下引用:<PackageReference Include="System.Net.WebSockets" Version="4.5.3" />
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");
}
});
}
});
}
}
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();
}
}
Main方法中啟動WebSocket服務器:public static async Task Main(string[] args)
{
var server = new WebSocketServer();
await server.StartAsync();
}
現在,當客戶端連接到WebSocket服務器時,服務器將接收到的消息原樣發送回客戶端。你可以根據需要擴展此示例以處理更復雜的場景,例如發送消息到特定客戶端或廣播消息給所有連接的客戶端。