// Режим отправки файла. public static void StartUploadClient(ListView a) { a.Items.Clear(); // Выделение переменных. byte[] bytes = new Byte[1024]; // Выделение потока для получения списка файлов. NetworkStream stream = clnt.GetStream(); // Сообщение о типе клиента. Inform_of_Down_Message mes = new Inform_of_Down_Message("Down"); // Оправка уведомления о типе клиента. NW.Send(mes, stream); // Представление файлов клиента в виде списка. a.Items.Clear(); string[] dirs = Directory.GetFiles(Folder); foreach (string dir in dirs) { ListViewItem item1 = new ListViewItem(Path.GetFileName(dir), 0); a.Items.AddRange(new ListViewItem[] { item1 }); } }
// Протокол отправки файла. 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 Message Decrypt(byte[] b) { // Возвращаемое значение. Message mes; // Строка, полученная из полученного массива байт. string str = Encoding.ASCII.GetString(b); // Тип сообщений. if (str[0] != '\0') { int type = int.Parse(str[0].ToString()); int border = str.IndexOf('\0'); if (border==(-1)) { border = str.Length; } if (type != -1) { // Строка данных. string assis = str.Substring(1, border - 1); // Определение типа сообщения. switch (type) { case 0: mes = new Inform_of_Down_Message(assis); break; case 1: mes = new Inform_of_Rec_Message(assis); break; case 2: mes = new ListMessage(assis); break; case 3: mes = new RequestMessage(assis); break; case 4: mes = new FilePartMessage(assis); break; case 5: mes = new EndMessage(assis); break; case 6: mes = new ResponseMessage(assis); break; case 7: mes = new ErrorMessage(assis); break; case 8: mes = new HubInformMessage(assis); break; default: mes = new Message(assis); break; } } else mes = new Message(string.Empty); return mes; } else return new Message(string.Empty); }