XNet/XNet.Business/Net/WsServer.cs
2025-12-29 17:24:47 +08:00

66 lines
2.7 KiB
C#

using MessagePack;
using System.Net.WebSockets;
namespace XNet.Business.Net
{
public static class WsServer
{
// 启动WebSocket监听
public static void MapWebSocketServer(this WebApplication app, WsConnectionManager wsManager)
{
app.Map("/ws", async context =>
{
if (!context.WebSockets.IsWebSocketRequest)
{
context.Response.StatusCode = StatusCodes.Status400BadRequest;
return;
}
// 建立WebSocket连接
using var webSocket = await context.WebSockets.AcceptWebSocketAsync();
string connId = wsManager.AddConnection(webSocket);
// 接收客户端消息(订阅实例等)
var buffer = new byte[1024 * 4];
try
{
while (webSocket.State == WebSocketState.Open)
{
var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None);
if (result.MessageType == WebSocketMessageType.Close)
{
await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed by client", CancellationToken.None);
break;
}
//byte[] data = new byte[result.Count];
//Buffer.BlockCopy(buffer, 0, data, 0, result.Count);
//new ArraySegment<byte>(data, 0, dataLength)
var wsMsg = MessagePackSerializer.Deserialize<BaseMsg>(new ArraySegment<byte>(buffer, 0, result.Count));
if (wsMsg == null) continue;
// 处理订阅实例请求
if (wsMsg.Type == WsMsgType.CREATE_OR_JOIN_ROOM)
{
var subscribeReq = MessagePackSerializer.Deserialize<SubscribeInstanceReq>(wsMsg.Data);
if (subscribeReq != null)
{
string createRoomId = string.Empty;
wsManager.SubscribeInstance(connId, subscribeReq.RoomId, ref createRoomId);
}
}
}
}
catch (Exception ex)
{
Console.WriteLine($"[WS] 连接 {connId} 异常:{ex.Message}");
}
finally
{
wsManager.RemoveConnection(connId);
}
});
}
}
}