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."); } }
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); }
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}\""); }
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."); }
public async Task SendMessageToAll(OutgoingAPIServerMessage message) { await SendMessageToAllExcept(message, null); }
public async Task SendMessage(string id, OutgoingAPIServerMessage message) { await SendMessage(Connections.GetSocketById(id), message); }