} // GetResponse // Проверяет сериализуемость объекта private bool ValidateBinary(MemoryStream memoryStream) { try { ChatMessage.FromArray(memoryStream.ToArray()); return true; } catch (Exception) { return false; } // try-catch } // ValidateBinary
} // ValidateBinary private void ServerDoListen(object client) { // Получить поток для передачи информации using (NetworkStream netStream = (client as TcpClient)?.GetStream()) { while (true) { if (netStream.CanRead) { byte[] response; try { // Получаем ответ от клиента response = GetResponse(netStream); // Десериализуем сообщение ChatMessage msg = ChatMessage.FromArray(response); // Определяем тип сообщения switch (msg.Type) { // Если был отправлен текст - выводим его в окно чата case MessageType.Text: SendTextToListBox($"{msg.UserFrom}: {msg.Message}"); break; // Если был отправлен файл - предлагаем его сохранить case MessageType.File: // Получаем данные о файле NetFile f = msg.File; // Предлагаем сохранить его DialogResult saveFile = MessageBox.Show($"The client sent a file.\n\"{f.FileName}{f.Extension}\"\nSave it?", "File from the client", MessageBoxButtons.YesNo); // Если да - сохраняем if (saveFile == DialogResult.Yes) SaveFile(f); break; } // switch } catch (Exception ex) { MessageBox.Show($"The server will be stopped\n{ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); listViewConnectedClients.Items.Clear(); _listener.Stop(); break; } // try-catch } // if } // while } // using } // ServerDoListen
} // ValidateBinary void ClientDoListen(object client) { SendTextToListBox($"Connection with server {textBoxHostName.Text}:{textBoxPort.Text} opened"); using (NetworkStream netStream = (client as TcpClient)?.GetStream()) { while (true) { if (netStream.CanRead) { byte[] response; try { // Получаем ответ от клиента response = GetResponse(netStream); // Десериализуем сообщение ChatMessage msg = ChatMessage.FromArray(response); // Определяем тип сообщения switch (msg.Type) { // Если был отправлен текст - выводим его в окно чата case MessageType.Text: SendTextToListBox($"{msg.UserFrom}: {msg.Message}"); break; // Если был отправлен файл - предлагаем его сохранить case MessageType.File: // Получаем данные о файле. NetFile f = msg.File; // Предлагаем сохранить его. DialogResult saveFile = MessageBox.Show($"You have been sent a file. \"{f.FileName}{f.Extension}\"\nSave it?", "File from the server", MessageBoxButtons.YesNo); // Если да - сохраняем if (saveFile == DialogResult.Yes) SaveFile(f); break; } // switch } catch (Exception) { SendTextToListBox($"Connection with server {textBoxHostName.Text}:{textBoxPort.Text} closed"); break; } // try-catch } // if } // while } // using } // ClientDoListen