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 InvokeAsync(HttpContext context) { if (context.WebSockets.IsWebSocketRequest) { WebSocket socket = await context.WebSockets.AcceptWebSocketAsync(); var connId = _manager.AddSocket(socket); await _notify.NotifyAll(_manager.GetAllSockets(), connId); await ReceiveMessage(socket, async (result, buffer) => { byte[] bufferHalf = new byte[result.Count]; Array.Copy(buffer, bufferHalf, result.Count); var socketReceiver = JsonConvert.DeserializeObject <MessageModel>(Encoding.UTF8.GetString(bufferHalf)); if (result.MessageType == WebSocketMessageType.Text) { var listSockets = this._manager.GetAllSockets() .Where(s => s.Key == socketReceiver.Receiver) .ToList(); foreach (var item in listSockets) { await item.Value.SendAsync( bufferHalf, WebSocketMessageType.Text, true, CancellationToken.None ); } return; } else if (result.MessageType == WebSocketMessageType.Close) { string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == socket).Key; _manager.GetAllSockets().TryRemove(id, out socket); return; } }); } else { await _next(context); } }
// функционал чата 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 async Task RemoveFriendWebSocket(string username, string friend) { var sock = _manager.GetAllSockets().FirstOrDefault(s => s.Key == friend); if (sock.Value != null) { if (sock.Value.State == WebSocketState.Open) { await sock.Value.SendAsync(new ArraySegment <byte>(Encoding.UTF8.GetBytes("{\"eventV\": \"friendRemoved\", \"friend\": \"" + username + "\" }")), WebSocketMessageType.Text, true, CancellationToken.None); } } }
public async Task InvokeAsync(HttpContext context) // request { if (context.WebSockets.IsWebSocketRequest) { WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync(); string conn = _manager.AddSocket(webSocket); Console.WriteLine("NEW Connection -> " + conn); SuperSocket super = new SuperSocket(); #region SuperSocket Config super.OnInitialization += async(socket, id) => { Console.WriteLine("NEW Connection -> " + id); var data = Models.WebSocket.MessageModel.GetWelcomeMessage(id); await socket.SendAsync(data.JsonBinary(), WebSocketMessageType.Text, true, CancellationToken.None); }; super.OnDisconnectMessage += async(socket, guid, result) => { Console.WriteLine($"Close on: " + guid); WebSocket sock; if (_manager.GetAllSockets().TryRemove(guid, out sock)) { Console.WriteLine($"Removed -> From list {guid}"); } Console.WriteLine("Still Managed Connections: " + _manager.GetAllSockets().Count.ToString()); await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); }; super.OnTextMessage += async(socket, messageModel) => { Console.WriteLine("NEW Message -> " + messageModel.JsonSerialize()); var messageText = JsonSerializer.Deserialize <Models.WebSocket.TextMessageModel>(messageModel.data); var reciver = _manager.GetAllSockets().FirstOrDefault((s) => { return(s.Key == messageText.to); }).Value; await reciver.SendAsync(messageModel.JsonBinary(), WebSocketMessageType.Text, true, CancellationToken.None); // TODO: Obsluga default. }; #endregion super.Init(webSocket, conn); Console.WriteLine("Socket Initialized"); await super.Run(); Console.WriteLine("Socket Running"); #region Old /* * //Send ConnID Back * await SendInfo(webSocket, conn); * * await Receive(webSocket, async (result, buffer) => * { * if (result.MessageType == WebSocketMessageType.Text) * { * Console.WriteLine($"Received->Text"); * Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");// TODO: Change this part * await HandleMessage(Encoding.UTF8.GetString(buffer, 0, result.Count)); // < --- * return; * } * else if (result.MessageType == WebSocketMessageType.Close) * { * // string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == webSocket).Key; // why not conn as an id * // conn can will not be the same after 2 client comes * string id = conn; * Console.WriteLine($"Close on: " + id); * WebSocket sock; * * if (_manager.GetAllSockets().TryRemove(id, out sock)) * Console.WriteLine($"Removed -> From list {id}"); * * Console.WriteLine("Still Managed Connections: " + _manager.GetAllSockets().Count.ToString()); * * await sock.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); * * return; * } * else if (result.MessageType == WebSocketMessageType.Binary) * { * string id = _manager.GetAllSockets().FirstOrDefault(s => s.Value == webSocket).Key; // why not * Console.WriteLine("Binary Message"); * await webSocket.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "This server does not handle binary message type.", CancellationToken.None); * return; * } * else * { * await webSocket.CloseAsync(WebSocketCloseStatus.ProtocolError, $"Not expected WebSocketMessageType {result.MessageType}", CancellationToken.None); * throw new Exception("Invalid WebSocketMessageType"); * } * }); */ #endregion } else { // Console.WriteLine("Hello from 2nd Request Delegate - No WebSocket"); await _next(context); } }