66 lines
2.5 KiB
C#
66 lines
2.5 KiB
C#
using MessagePack;
|
|
using System.Net.WebSockets;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
|
|
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);
|
|
var wsMsg = MessagePackSerializer.Deserialize<WsMessage>(data);
|
|
|
|
if (wsMsg == null) continue;
|
|
|
|
// 处理订阅实例请求
|
|
if (wsMsg.Type == WsMsgType.SubscribeInstance)
|
|
{
|
|
var subscribeReq = MessagePackSerializer.Deserialize<SubscribeInstanceReq>(wsMsg.Data);
|
|
if (subscribeReq != null)
|
|
{
|
|
wsManager.SubscribeInstance(connId, subscribeReq.InstanceId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"[WS] 连接 {connId} 异常:{ex.Message}");
|
|
}
|
|
finally
|
|
{
|
|
wsManager.RemoveConnection(connId);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
} |