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 { ******* TcpClient client; ******* string serverIP = "192.168.2.36"; // IP адрес сервера ******* int port = 5000; // Порт сервера ******* OpenFileDialog openFileDialog; // Окно выбора файла public Form1() { InitializeComponent(); openFileDialog = new OpenFileDialog(); // Инициализация OpenFileDialog } ******* void Form1_Load(object sender, EventArgs e) { } ******* 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; } } ******* 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; } } } ******* 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}"); }); } ******* void DisconnectButton_Click(object sender, EventArgs e) { try { client.Close(); ConnectButton.Enabled = true; DisconnectButton.Enabled = false; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при отключении"); } } ******* void label1_Click(object sender, EventArgs e) { } ******* 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, "Ошибка при отправке сообщения"); } } ******* 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, "Ошибка при отправке файла"); } } } // Добавлен обработчик для сохранения файла ******* void SaveFileButton_Click(object sender, EventArgs e) { if (ReceivedMessagesListBox.SelectedItem != null) { string fileName = ReceivedMessagesListBox.SelectedItem.ToString().Substring(15); SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.FileName = fileName; if (saveFileDialog.ShowDialog() == DialogResult.OK) { try { File.Copy(fileName, saveFileDialog.FileName); MessageBox.Show("Файл успешно сохранен.", "Сохранение файла"); } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка при сохранении файла"); } } } else { MessageBox.Show("Выберите файл для сохранения.", "Ошибка"); } } } }