private static void writeStream(ClientAppState clientAppState, IClientUINotifier clientUINotifier)
        {
            var tcpClient           = clientAppState.TCPClient;
            var clientMessagesQueue = clientAppState.ClientMessagesQueue;

            while (true)
            {
                if (!clientMessagesQueue.IsEmpty)
                {
                    if (clientMessagesQueue.TryDequeue(out ClientMessage clientMessage))
                    {
                        try
                        {
                            NetworkStream networkStream = tcpClient.GetStream();

                            byte[] bufferData = clientMessage.Serialize(out int dataLength);

                            networkStream.Write(bufferData, 0, dataLength);
                            networkStream.Flush();
                        }
                        catch (IOException ioEx)
                        {
                            if (!clientUINotifier.ClientWantsShutdown.WaitOne(0))
                            {
                                clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Server was forcibly closed during the write process.. :("));
                                clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Message : " + ioEx.Message));
                            }
                            break;
                        }
                        catch (InvalidOperationException iopEx)
                        {
                            if (!clientUINotifier.ClientWantsShutdown.WaitOne(0))
                            {
                                clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Read process : Server had forcibly close the connection before .. :("));
                                clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Message : " + iopEx.Message));
                            }
                            break;
                        }
                        catch (Exception ex)
                        {
                            clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage(ex.GetType().ToString() + "\n" + ex.Message + "\n" + ex.StackTrace));

                            break;
                        }
                    }
                }
            }
        }
        private static void readStream(ClientAppState clientAppState, IClientUINotifier clientUINotifier)
        {
            var           tcpClient     = clientAppState.TCPClient;
            NetworkStream networkStream = tcpClient.GetStream();

            while (true)
            {
                try
                {
                    if (networkStream.DataAvailable)
                    {
                        ServerMessage serverMessage = ServerMessage.Deserialize(networkStream);

                        handleServerMessage(serverMessage, clientUINotifier, clientAppState);
                    }
                }
                catch (IOException ioEx)
                {
                    if (!clientUINotifier.ClientWantsShutdown.WaitOne(0))
                    {
                        clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Server was forcibly closed during the read process.. :("));
                        clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Message : " + ioEx.Message));
                    }
                    break;
                }
                catch (InvalidOperationException iopEx)
                {
                    if (!clientUINotifier.ClientWantsShutdown.WaitOne(0))
                    {
                        clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Write process : Server had forcibly close the connection before .. :("));
                        clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage("Message : " + iopEx.Message));
                    }
                    break;
                }
                catch (Exception ex)
                {
                    clientUINotifier.HandleDisplayTextServerMessage(new DisplayTextServerMessage(ex.GetType().ToString() + "\n" + ex.Message + "\n" + ex.StackTrace));
                    break;
                }
            }
        }
        private static void handleServerMessage(ServerMessage serverMessage, IClientUINotifier clientUINotifier, ClientAppState clientAppState)
        {
            switch (serverMessage.ServerMessageType)
            {
            case ServerMessageType.DisplayTextToConsole:
                clientUINotifier.HandleDisplayTextServerMessage(serverMessage as DisplayTextServerMessage);
                break;

            case ServerMessageType.RegisterIdResult:
                try
                {
                    IPeerMessageTransmitter peerMessageTransmitter = (serverMessage as RegisterIdResultServerMessage)?.Result ?? false ? clientAppState : null;
                    clientUINotifier.HandleRegisterIDResultServerMessage(serverMessage as RegisterIdResultServerMessage, peerMessageTransmitter);
                }
                finally
                {
                    _isAuthenticationInProcess = false;
                }
                break;

            case ServerMessageType.SignInResult:
                try
                {
                    IPeerMessageTransmitter peerMessageTransmitter = (serverMessage as SignInResultServerMessage)?.Result ?? false ? clientAppState : null;
                    clientUINotifier.HandleSignInResultServerMessage(serverMessage as SignInResultServerMessage, peerMessageTransmitter);
                }
                finally
                {
                    _isAuthenticationInProcess = false;
                }
                break;

            case ServerMessageType.ClientAvailabilityNotification:
                clientUINotifier.HandleClientAvailabilityNotificationServerMessage(serverMessage as ClientAvailabilityNotificationServerMessage);
                break;

            case ServerMessageType.TransmitToPeerResult:
                clientUINotifier.HandleTransmitToPeerResultServerMessage(serverMessage as TransmitToPeerResultServerMessage);
                break;

            case ServerMessageType.TransmitToPeer:
                clientUINotifier.HandleTransmitToPeerServerMessage(serverMessage as TransmitToPeerServerMessage);
                break;

            default:
                break;
            }
        }