Пример #1
0
        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;
            }
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        public async Task InvokeAsync(HttpContext context)
        {
            if (context.WebSockets.IsWebSocketRequest)
            {
                WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();

                bool isDriver = false;

                var userId = int.Parse(context.Request.Query["id"]);

                if (context.Request.Path.ToString().ToLower() == "/driver")
                {
                    _manager.AddDriverSocket(userId, webSocket);
                    isDriver = true;
                    Console.WriteLine($"New socket (driver) connection established (with user id: {userId})");
                }
                else
                {
                    _manager.AddSocket(userId, webSocket);
                    Console.WriteLine($"New socket (customer) connection established (with user id: {userId})");
                }

                //Send ConnID Back
                // await SendConnID(webSocket, conn);

                await Receive(webSocket, async (result, buffer) =>
                {
                    if (result.MessageType == WebSocketMessageType.Text)
                    {
                        Console.WriteLine("Receive->Text");
                        Console.WriteLine($"Message: {Encoding.UTF8.GetString(buffer, 0, result.Count)}");

                        await RouteJSONMessageAsync(Encoding.UTF8.GetString(buffer, 0, result.Count));
                    }
                    else if (result.MessageType == WebSocketMessageType.Close)
                    {
                        WebSocketConnection webSocketConnection;

                        if (isDriver)
                        {
                            WebSocketConnection foundWebSocket = _manager.GetDriverSockets().FirstOrDefault(s => s.Value.Socket == webSocket).Value;
                            _manager.GetDriverSockets().TryRemove(foundWebSocket.SocketConnectionId, out webSocketConnection);
                        }
                        else
                        {
                            WebSocketConnection foundWebSocket = _manager.GetCustomerSockets().FirstOrDefault(s => s.Value.Socket == webSocket).Value;
                            _manager.GetCustomerSockets().TryRemove(foundWebSocket.SocketConnectionId, out webSocketConnection);
                        }

                        Console.WriteLine($"Socket connection closed -> close for user id: {webSocketConnection?.UserId}");

                        await webSocketConnection.Socket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None);
                    }
                });
            }
            else
            {
                Console.WriteLine("Not a websocket request");
                await _next(context);
            }
        }