public override async Task Receive(WebSocket socket, WebSocketReceiveResult result, byte[] buffer)
        {
            var socketId      = Connections.GetId(socket);
            var messageString = Encoding.UTF8.GetString(buffer, 0, result.Count);
            var message       = JsonConvert.DeserializeObject <IncomingClientMessage>(messageString);

            switch (message.Type)
            {
            case ClientMessageType.JOIN:
            {
                var user = (User)message.Data;
                AddUser(socketId, user);
                var confirmationMessage = new OutgoingAPIServerMessage
                {
                    Type = APIServerMessageType.ACTION_CONFIRMED,
                    Data = new Models.Action
                    {
                        Type = ClientMessageType.JOIN.ToString()
                    },
                    Date = DateTime.Now
                };
                await SendMessage(socketId, confirmationMessage);

                var outgoingMessage = new OutgoingAPIServerMessage
                {
                    Type = APIServerMessageType.JOINED,
                    Data = new List <User> {
                        user
                    },
                    Date = DateTime.Now
                };
                await SendMessageToAllExcept(outgoingMessage, socketId);

                break;
            }

            case ClientMessageType.MESSAGE:
            {
                Console.WriteLine($"Message received: {message.Data}");
                var user        = GetUserById(socketId);
                var textMessage = (TextMessage)message.Data;
                textMessage.Sender = user;
                var outgoingMessage = new OutgoingAPIServerMessage
                {
                    Type = APIServerMessageType.MESSAGE,
                    Data = textMessage,
                    Date = DateTime.Now
                };
                await SendMessageToAll(outgoingMessage);

                break;
            }

            default:
                throw new Exception("Invalid message type.");
            }
        }
Пример #2
0
 public async Task SendMessageToAllExcept(OutgoingAPIServerMessage message, string socketId)
 {
     foreach (var con in Connections.GetAllConnections())
     {
         if (con.Key == socketId)
         {
             continue;
         }
         await SendMessage(con.Value, message);
     }
 }
        public override async Task OnDisconnected(WebSocket socket)
        {
            var socketId = Connections.GetId(socket);
            await base.OnDisconnected(socket);

            var user    = RemoveUser(socketId);
            var message = new OutgoingAPIServerMessage
            {
                Type = APIServerMessageType.LEFT,
                Data = new List <User> {
                    user
                },
                Date = DateTime.Now
            };

            await SendMessageToAll(message);
        }
Пример #4
0
        public async Task SendMessage(WebSocket socket, OutgoingAPIServerMessage message)
        {
            if (socket.State != WebSocketState.Open)
            {
                return;
            }
            var contractResolver = new DefaultContractResolver
            {
                NamingStrategy = new CamelCaseNamingStrategy()
            };
            var messageString = JsonConvert.SerializeObject(message, new JsonSerializerSettings
            {
                ContractResolver = contractResolver
            });
            await socket.SendAsync(new ArraySegment <byte>(Encoding.ASCII.GetBytes(messageString), 0, messageString.Length), WebSocketMessageType.Text, true, CancellationToken.None);

            Console.WriteLine($"Message \"{messageString}\"");
        }
Пример #5
0
        private async void ReceiveMessageFromAPIServer()
        {
            var buffer = new byte[1024 * 4];

            while (_client != null)
            {
                var result = await _client.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None);

                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await _client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);

                    break;
                }
                var messageString = Encoding.UTF8.GetString(buffer, 0, result.Count);
                Console.WriteLine($"Received message from API Server: {messageString}");
                var incomingMessage = JsonConvert.DeserializeObject <IncomingAPIServerMessage>(messageString);
                if (incomingMessage.Type == APIServerMessageType.ACTION_CONFIRMED && incomingMessage.Data is Models.Action && ((Models.Action)incomingMessage.Data).Type == ClientMessageType.LEAVE.ToString())
                {
                    Console.WriteLine("Action confirmed");
                    await _client.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "", CancellationToken.None);

                    break;
                }
                var outgoingMessage = new OutgoingAPIServerMessage(incomingMessage);
                if (!string.IsNullOrEmpty(incomingMessage.ReceiverSocketId))
                {
                    await SendMessage(incomingMessage.ReceiverSocketId, outgoingMessage);
                }
                else if (!string.IsNullOrEmpty(incomingMessage.SocketIdToOmit))
                {
                    await SendMessageToAllExcept(outgoingMessage, incomingMessage.SocketIdToOmit);
                }
                else
                {
                    await SendMessageToAll(outgoingMessage);
                }
            }
            Console.WriteLine("Stopped listening API Server.");
        }
Пример #6
0
 public async Task SendMessageToAll(OutgoingAPIServerMessage message)
 {
     await SendMessageToAllExcept(message, null);
 }
Пример #7
0
 public async Task SendMessage(string id, OutgoingAPIServerMessage message)
 {
     await SendMessage(Connections.GetSocketById(id), message);
 }