public WebSocketServerMiddleware(RequestDelegate _next, WebSocketServerConnectionManager _manager) { this._next = _next; this._manager = _manager; this._notify = new WebSocketNotifyManager(); }
public async Task ManageSocket(HttpContext context, WebSocket webSocket, WebSocketServerConnectionManager _manager) { // добавить веб сокет в список string ConnID = _manager.AddSocket(webSocket); // отправить ID клиенту await _manager.SendConnIDAsync(webSocket, ConnID); // полученное сообщение result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); // если клиент просит закрыть соединение if (result.MessageType == WebSocketMessageType.Close) { // получение соответ. ID из списка string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == webSocket).Key; Console.WriteLine($"Receive->Close"); // удалене веб соккета из списка _manager.GetAllSockets().TryRemove(id, out WebSocket sock); Console.WriteLine("Managed Connections: " + _manager.GetAllSockets().Count.ToString()); await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); return; } }
// функционал чата public async Task RouteJSONMessageAsync(string message, WebSocketServerConnectionManager _manager) { // изменения JSON в объект var routeOb = JsonConvert.DeserializeObject <dynamic>(message); // если есть получатель if (Guid.TryParse(routeOb.To.ToString(), out Guid guidOutput)) { Console.WriteLine("Targeted"); // поиск получателя в списке var sock = _manager.GetAllSockets().FirstOrDefault(s => s.Key == routeOb.To.ToString()); // если есть if (sock.Value != null) { if (sock.Value.State == WebSocketState.Open) { await sock.Value.SendAsync(Encoding.UTF8.GetBytes(routeOb.Message.ToString()), WebSocketMessageType.Text, true, CancellationToken.None); } } // если нет else { Console.WriteLine("Invalid Recipient"); } } // если нет отправить всем else { Console.WriteLine("Broadcast"); foreach (var sock in _manager.GetAllSockets()) { if (sock.Value.State == WebSocketState.Open) { await sock.Value.SendAsync(Encoding.UTF8.GetBytes(routeOb.Message.ToString()), WebSocketMessageType.Text, true, CancellationToken.None); } } } }
public OrdersController(WebSocketServerConnectionManager manager, IOrderService orderService) { _manager = manager; _orderService = orderService; }
public FriendsOp(RequestDelegate next, WebSocketServerConnectionManager manager) { _next = next; _manager = manager; }
// manager shoudl send new message on new user. public WebSocketServerMiddleware(RequestDelegate next, WebSocketServerConnectionManager manager) { _next = next; _manager = manager; }
// рассылка сообщений public async Task ManageChat(WebSocketReceiveResult result, byte[] buffer, WebSocket webSocket, WebSocketServerConnectionManager _manager, ChatMan _chatManager) { while (!result.CloseStatus.HasValue) { // отправка await _chatManager.RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count), _manager); // ожидание нового сообщения от клиента result = await webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } }