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; } }