From d5d6d596905b7c896d29116756ca46deff5993c7 Mon Sep 17 00:00:00 2001 From: Dogukan Date: Wed, 21 Oct 2020 22:40:36 +0200 Subject: [PATCH 1/3] [FIX] fixed the broadcast for the chat messages. --- Client/Client.cs | 7 +++++++ Client/ViewModels/ViewModelGame.cs | 14 ++++++++++---- Server/Models/ServerClient.cs | 12 ++++++++---- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/Client/Client.cs b/Client/Client.cs index 5346d92..8a51785 100644 --- a/Client/Client.cs +++ b/Client/Client.cs @@ -24,6 +24,7 @@ namespace Client public Callback OnLobbyJoinSuccess; public Callback OnLobbiesReceivedAndWaitingForHost; public OnLobbyCreated OnLobbyCreated; + private ClientData data = ClientData.Instance; public Lobby[] Lobbies { get; set; } public Client(string username) @@ -81,6 +82,7 @@ namespace Client byte[] payload = new byte[message.Length - 5]; Array.Copy(message, 5, payload, 0, message.Length - 5); + Debug.WriteLine("[CLIENT] GOT STRING" + Encoding.ASCII.GetString(payload)); switch (id) { case JSONConvert.LOGIN: @@ -92,6 +94,11 @@ namespace Client string textUsername = combo.Item1; string textMsg = combo.Item2; + if(textUsername != data.User.Username) + { + ViewModels.ViewModelGame.HandleIncomingMsg(textUsername, textMsg); + } + //TODO display username and message in chat window Debug.WriteLine("[CLIENT] INCOMING MESSAGE!"); Debug.WriteLine("[CLIENT] User name: {0}\t User message: {1}", textUsername, textMsg); diff --git a/Client/ViewModels/ViewModelGame.cs b/Client/ViewModels/ViewModelGame.cs index 65fd353..298a7fc 100644 --- a/Client/ViewModels/ViewModelGame.cs +++ b/Client/ViewModels/ViewModelGame.cs @@ -20,13 +20,13 @@ namespace Client.ViewModels private Point currentPoint = new Point(); private Color color; - public ObservableCollection Messages { get; } = new ObservableCollection(); + public static ObservableCollection Messages { get; } = new ObservableCollection(); private dynamic _payload; - private string _username; + public string _username; - private string _message; + public string _message; public string Message { get @@ -120,7 +120,13 @@ namespace Client.ViewModels data.Client.SendMessage(JSONConvert.GetMessageToSend(JSONConvert.MESSAGE, _payload)); } - + public static void HandleIncomingMsg(string username, string message) + { + Application.Current.Dispatcher.Invoke(delegate + { + Messages.Add($"{username}: {message}"); + }); + } } } diff --git a/Server/Models/ServerClient.cs b/Server/Models/ServerClient.cs index 90eab73..125c8f7 100644 --- a/Server/Models/ServerClient.cs +++ b/Server/Models/ServerClient.cs @@ -122,11 +122,15 @@ namespace Server.Models string textUsername = combo.Item1; string textMsg = combo.Item2; - Debug.WriteLine("[SERVERCLIENT] User name: {0}\t User message: {1}", textUsername, textMsg); + //Takes the data sent from the client, and then sets it in a data packet to be sent. + dynamic packet = new + { + username = textUsername, + message = textMsg + }; - // todo handle sending to all except this user the username and message to display in chat - serverCom.SendToLobby(ServerCommunication.INSTANCE.GetLobbyForUser(User),payload); - Debug.WriteLine("Payload has been sent!"); + //Sends the incomming message to be broadcast to all of the clients inside the current lobby. + serverCom.SendToLobby(serverCom.GetLobbyForUser(User), JSONConvert.GetMessageToSend(JSONConvert.MESSAGE, packet)); break; case JSONConvert.LOBBY: -- 2.47.2 From e8a72e164fb85e0cbbdb9fa8a9ce50a70859f06f Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 21 Oct 2020 22:41:39 +0200 Subject: [PATCH 2/3] add try catch --- Server/Models/ServerClient.cs | 81 +++++++++++++++------------- Server/Models/ServerCommunication.cs | 6 +++ 2 files changed, 51 insertions(+), 36 deletions(-) diff --git a/Server/Models/ServerClient.cs b/Server/Models/ServerClient.cs index 843db9c..69875ba 100644 --- a/Server/Models/ServerClient.cs +++ b/Server/Models/ServerClient.cs @@ -6,6 +6,7 @@ using SharedClientServer; using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Net.Sockets; using System.Text; using static SharedClientServer.JSONConvert; @@ -45,48 +46,56 @@ namespace Server.Models if (ar == null || (!ar.IsCompleted) || (!this.stream.CanRead) || !this.tcpClient.Client.Connected) return; - - int bytesReceived = this.stream.EndRead(ar); - - if (totalBufferReceived + bytesReceived > 1024) + try { - throw new OutOfMemoryException("buffer is too small!"); - } + int bytesReceived = this.stream.EndRead(ar); - // copy the received bytes into the buffer - Array.Copy(buffer, 0, totalBuffer, totalBufferReceived, bytesReceived); - // add the bytes we received to the total amount - totalBufferReceived += bytesReceived; - - // calculate the expected length of the message - int expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0); - - while (totalBufferReceived >= expectedMessageLength) - { - // we have received the full packet - byte[] message = new byte[expectedMessageLength]; - // copy the total buffer contents into the message array so we can pass it to the handleIncomingMessage method - Array.Copy(totalBuffer, 0, message, 0, expectedMessageLength); - HandleIncomingMessage(message); - - // move the contents of the totalbuffer to the start of the array - Array.Copy(totalBuffer, expectedMessageLength, totalBuffer, 0, (totalBufferReceived - expectedMessageLength)); - - // remove the length of the expected message from the total buffer - totalBufferReceived -= expectedMessageLength; - // and set the new expected length to the rest that is still in the buffer - expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0); - - if (expectedMessageLength == 0) + if (totalBufferReceived + bytesReceived > 1024) { - break; - } + throw new OutOfMemoryException("buffer is too small!"); + } + // copy the received bytes into the buffer + Array.Copy(buffer, 0, totalBuffer, totalBufferReceived, bytesReceived); + // add the bytes we received to the total amount + totalBufferReceived += bytesReceived; + + // calculate the expected length of the message + int expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0); + + while (totalBufferReceived >= expectedMessageLength) + { + // we have received the full packet + byte[] message = new byte[expectedMessageLength]; + // copy the total buffer contents into the message array so we can pass it to the handleIncomingMessage method + Array.Copy(totalBuffer, 0, message, 0, expectedMessageLength); + HandleIncomingMessage(message); + + // move the contents of the totalbuffer to the start of the array + Array.Copy(totalBuffer, expectedMessageLength, totalBuffer, 0, (totalBufferReceived - expectedMessageLength)); + + // remove the length of the expected message from the total buffer + totalBufferReceived -= expectedMessageLength; + // and set the new expected length to the rest that is still in the buffer + expectedMessageLength = BitConverter.ToInt32(totalBuffer, 0); + + if (expectedMessageLength == 0) + { + break; + } + + + } + // start reading for a new message + stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnRead), null); } - // start reading for a new message - stream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(OnRead), null); - + catch (IOException e) + { + tcpClient.Close(); + ServerCommunication.INSTANCE.ServerClientDisconnect(this); + } + } diff --git a/Server/Models/ServerCommunication.cs b/Server/Models/ServerCommunication.cs index c461aa1..0447bd2 100644 --- a/Server/Models/ServerCommunication.cs +++ b/Server/Models/ServerCommunication.cs @@ -97,6 +97,12 @@ namespace Server.Models } } + public void ServerClientDisconnect(ServerClient serverClient) + { + // remove from serverclientsinlobbies + // send leave message + } + public void SendToAllExcept(string username, byte[] message) { foreach (ServerClient sc in serverClients) -- 2.47.2 From c150bf3611c08e2ad05410f430d6c9305b79b017 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 21 Oct 2020 22:54:37 +0200 Subject: [PATCH 3/3] [FIX] fixed handling client disconnect --- Server/Models/ServerCommunication.cs | 27 +++++++++++++++++++++++++-- Server/ViewModels/MainViewModel.cs | 4 ++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Server/Models/ServerCommunication.cs b/Server/Models/ServerCommunication.cs index 0447bd2..1d22c27 100644 --- a/Server/Models/ServerCommunication.cs +++ b/Server/Models/ServerCommunication.cs @@ -16,6 +16,7 @@ namespace Server.Models public bool Started = false; public List lobbies; private Dictionary> serverClientsInlobbies; + internal Action DisconnectClientAction; public Action newClientAction; @@ -99,8 +100,22 @@ namespace Server.Models public void ServerClientDisconnect(ServerClient serverClient) { - // remove from serverclientsinlobbies - // send leave message + Debug.WriteLine("[SERVERCOMM] handling disconnect"); + DisconnectClientAction?.Invoke(); + int id = -1; + foreach (Lobby l in serverClientsInlobbies.Keys) + { + if (serverClientsInlobbies[l].Contains(serverClient)) + { + id = l.ID; + }break; + } + + if (id != -1) + { + LeaveLobby(serverClient.User, id); + SendToAllExcept(serverClient, JSONConvert.ConstructLobbyLeaveMessage(id)); + } } public void SendToAllExcept(string username, byte[] message) @@ -111,6 +126,14 @@ namespace Server.Models } } + public void SendToAllExcept(ServerClient sc, byte[] message) + { + foreach (ServerClient s in serverClients) + { + if (s != sc) s.sendMessage(message); + } + } + public void SendToLobby(Lobby lobby, byte[] message) { foreach (Lobby l in lobbies) diff --git a/Server/ViewModels/MainViewModel.cs b/Server/ViewModels/MainViewModel.cs index ad06638..5d153b8 100644 --- a/Server/ViewModels/MainViewModel.cs +++ b/Server/ViewModels/MainViewModel.cs @@ -33,6 +33,10 @@ namespace Server.ViewModels { InformationModel.ClientsConnected++; }; + serverCommunication.DisconnectClientAction = () => + { + InformationModel.ClientsConnected--; + }; //BitmapImage onlineImg = new BitmapImage(new Uri(@"/img/online.png",UriKind.Relative)); //BitmapImage offlineImg = new BitmapImage(new Uri(@"/img/offline.png", UriKind.Relative)); -- 2.47.2