using System; using System.IO; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace Client_shahmadurstvo { public partial class Form1 : Form { private TcpClient client; private string serverIP = "192.168.0.36"; // Замените на IP адрес сервера private int port = 5000; // Тот же порт, что и на сервере private OpenFileDialog openFileDialog; // Определение OpenFileDialog public Form1() { InitializeComponent(); openFileDialog = new OpenFileDialog(); // Инициализация OpenFileDialog } private void Form1_Load(object sender, EventArgs e) { } private async void ConnectButton_Click(object sender, EventArgs e) { try { // Асинхронное подключение к серверу client = await Task.Run(() => new TcpClient(serverIP, port)); ConnectButton.Enabled = false; DisconnectButton.Enabled = true; // Запускаем поток для чтения данных от сервера Thread readThread = new Thread(ReadFromServer); readThread.IsBackground = true; // Запуск в фоновом режиме readThread.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при подключении к серверу"); // Сброс состояния кнопок, если подключение не удалось ConnectButton.Enabled = true; DisconnectButton.Enabled = false; } } private async void ReadFromServer() { NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; while (client.Connected) { try { int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); if (bytesRead > 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); if (message.StartsWith("FILE:")) { string[] fileInfo = message.Substring(5).Split('|'); string fileName = fileInfo[0]; int fileSize = int.Parse(fileInfo[1]); await ReceiveFile(stream, fileName, fileSize); } else { ReceivedMessagesListBox.Invoke((MethodInvoker)delegate { ReceivedMessagesListBox.Items.Add(message); }); } } } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при чтении с сервера"); DisconnectButton_Click(null, null); // Отключить клиента break; } } } private async Task ReceiveFile(NetworkStream stream, string fileName, int fileSize) { byte[] fileBuffer = new byte[fileSize]; int bytesRead = 0, totalBytesRead = 0; while (totalBytesRead < fileSize) { bytesRead = await stream.ReadAsync(fileBuffer, totalBytesRead, fileSize - totalBytesRead); totalBytesRead += bytesRead; } File.WriteAllBytes(fileName, fileBuffer); ReceivedMessagesListBox.Invoke((MethodInvoker)delegate { ReceivedMessagesListBox.Items.Add($"Файл получен: {fileName}"); }); } private void DisconnectButton_Click(object sender, EventArgs e) { try { client.Close(); ConnectButton.Enabled = true; DisconnectButton.Enabled = false; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при отключении"); } } private async void SendFileButton_Click(object sender, EventArgs e) { if (openFileDialog.ShowDialog() == DialogResult.OK) { try { string filePath = openFileDialog.FileName; string fileName = Path.GetFileName(filePath); byte[] fileData = File.ReadAllBytes(filePath); int fileSize = fileData.Length; // Создаем сообщение о файле string fileMessage = $"FILE:{fileName}|{fileSize}"; byte[] messageData = Encoding.UTF8.GetBytes(fileMessage); NetworkStream stream = client.GetStream(); // Отправляем метаданные файла await stream.WriteAsync(messageData, 0, messageData.Length); await stream.FlushAsync(); // Убедимся, что данные записаны в сеть // Отправляем сам файл await stream.WriteAsync(fileData, 0, fileData.Length); await stream.FlushAsync(); // Убедимся, что данные записаны в сеть // Информируем пользователя о том, что файл был отправлен ReceivedMessagesListBox.Items.Add($"Файл отправлен: {fileName}"); } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при отправке файла"); } } } private void SendButton_Click(object sender, EventArgs e) { try { // Проверка подключения if (client == null || !client.Connected) { MessageBox.Show("Не удалось подключиться к серверу.", "Ошибка"); return; // Выход из метода, если нет подключения } // Установка таймаута для отправки client.SendTimeout = 5000; // Извлечение сообщения из текстового поля string message = MessageTextBox.Text; // Преобразование сообщения в байты byte[] data = Encoding.UTF8.GetBytes(message); // Отправка сообщения на сервер NetworkStream stream = client.GetStream(); stream.Write(data, 0, data.Length); // Добавление отправленного сообщения в текстовое поле ReceivedMessagesListBox.Invoke((MethodInvoker)delegate { ReceivedMessagesListBox.Items.Add("Вы: " + message); }); // Очистка текстового поля для ввода сообщения MessageTextBox.Text = ""; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при отправке сообщения"); } } private void label1_Click(object sender, EventArgs e) { } } }