// Протокол отправки файла. public void Sending() { // Сообщение для коммуникации с клиентом. Message file_part = new FilePartMessage(string.Empty); // Сообщение для обработки подтверждения. Message response = new ResponseMessage("resp"); // Уведомление о типе трансляции хаба. Inform_of_Down_Message down = new Inform_of_Down_Message(Path.GetFileName(flname)); // Поток общения с хабом. NetworkStream Cur_Hub; Files.TryGetValue(flname, out Cur_Hub); NW.Send(down, Cur_Hub); using (NetworkStream stream = new NetworkStream(client)) { NW.Send(response, Cur_Hub); do { mes = NW.Recieve(Cur_Hub); if (mes != null) { if (!(mes is EndMessage)) { // Отправка сообщения клиенту. NW.Send(mes, stream); // Ожидание ответа. do { response = NW.Recieve(stream); } while (response.Get_Data() == string.Empty); // Отправка уведомления хабу. NW.Send(response, Cur_Hub); } else { mes = new EndMessage("End of file."); NW.Send(mes, stream); } } } while (!(mes is EndMessage)); // Уведомление об окончании операции. Console.WriteLine("Downloading is complete!"); } }
// Протокол получения файла. public void Receiving() { // Уведомление о получении. Message response = new ResponseMessage("Response"); // Выделение пути к файлу. string path = Path.Combine(@"D:\DFS", flname); // Уведомление о типе трансляции хаба. Inform_of_Rec_Message rec = new Inform_of_Rec_Message(Path.GetFileName(flname)); NW.Send(rec, Hubs[0]); using (NetworkStream stream = new NetworkStream(client)) { // Отправка уведомления клиенту. NW.Send(response, stream); do { mes = NW.Recieve(stream); if (mes != null) { if (!(mes is EndMessage)) { // Отправка сообщения хабу. NW.Send(mes, Hubs[0]); // Ожидание ответа. do { response = NW.Recieve(Hubs[0]); } while (response.Get_Data() == string.Empty); // Отправка уведомления клиенту. NW.Send(response, stream); } else { mes = new EndMessage("End of file."); NW.Send(mes, Hubs[0]); } } } while (!(mes is EndMessage)); // Уведомление об окончании операции. Console.WriteLine("Transmisson is complete!"); } }
// Отправка файла. public void Send(object income) { stream = (NetworkStream)income; // Строка для хранения необработанного ответа. string assis = string.Empty; // Строка для хранения обработанного ответа. string decrypted = string.Empty; // Буффер для хранения полученного ответа. byte[] bytes = new byte[1024]; // Объем буффера передаваемых данных. const int buffersz = 1022; // Буффер содержащий передаваемый пакет данных. byte[] buffer = new byte[buffersz]; //Количество считанных байт. int btscpd = 0; // Строка для отправки уведомлений. byte[] message = new byte[1024]; // Сообщение для коммуникации с клиентом. Message file_part = new FilePartMessage(string.Empty); // Сообщение для обработки подтверждения. Message response = new ResponseMessage(string.Empty); // Выделение пути к запрашиваемому файлу. string path = Path.Combine(@"D:\DFS", name); // Провека существования запрашиваемого файла. if (File.Exists(path)) { // Начало передачи. using (FileStream inFile = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)) { // Ожидание ответа. do { response = NW.Recieve(stream); } while (response.Get_Data() == string.Empty); do { // Считывание данных из файла. btscpd = inFile.Read(buffer, 0, buffersz); file_part = new FilePartMessage(Encoding.ASCII.GetString(buffer)); // Проверка на наличие неотправленных данных. if (btscpd > 0) { // Отправка пакета. NW.Send(file_part, stream); // Получение подтверждения. while (true) { response = NW.Recieve(stream); if (response.Get_Data() != string.Empty) { response = new ResponseMessage(string.Empty); break; } } } } while (btscpd > 0); // Отправка уведомления о конце файла. file_part = new EndMessage("End of file"); NW.Send(file_part, stream); // Уведомление о завершении процесса. Console.WriteLine("Translation thread: File has been sent."); } } }