C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как организовать очередь приёма файлов ?  (Прочитано 1564 раз)
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


Как организовать очередь приёма файлов ?
« : 20 Октябрь 2011, 20:58:30 »

Извеняюсь ...

Клиент  (отправляю )

Код
          // Перехват сообщений об ошибках соединения и передачи
 try
 {
 try
 {
 // Соединяемся с сервером. Параметры компонента IdTCPClient1:
 // Host: localhost, Port: 6001
 Client->Host = Settings->EHost->Text;  // Сервер
 Client->Port = StrToInt(Settings->Port->Text); // Порт
 Client->Connect(); // Подключаемся
 Screen->Cursor = crHourGlass;//Курсор
 Logg->Lines->Add(ExtractFileName(FileName));//Имя передаваемого файла покажим юзеру
 int fh=FileOpen(FileName,Sysutils::fmOpenRead);
 int fl=FileSeek(fh,0,2); //Размер файла
 FileClose(fh);
 Logg->Lines->Add("Размер: "+IntToStr(fl));//Размер файла
 
 //Client->IOHandler->WriteLn(CompName); // запишим в поток имя Станции
 Client->IOHandler->WriteLn(ExtractFileName(FileName)); // запишим в поток имя файла
 Client->IOHandler->WriteLn(IntToStr(fl)); // запишим в поток размер файла
 //Передаём выбранный  файл
 Client->IOHandler->WriteFile(FileName); // Этот метод передаёт только данные имя и путь нужно указать
 
 // ПРИСТУПАЕМ К ПЕРЕДАЧИ ИНФОРМАЦИИ ДЛЯ Memo(Protocol) СЕРВЕРА
 // ИМЯ ФАЙЛА МЫ УЖЕ ПЕРЕДАЛИ В СТРОКЕ Client->IOHandler->WriteLn(ExtractFileName(FileName));
 // Передаём информацию о размере переданного файла
 Logg->Lines->Add("Отправлен файл: (" +ExtractFileName(FileName)+")"+Times);
 
 }
 catch(...)
 {
 // В случае ошибки выводим сообщение
 Logg->Lines->Add("Ошибка соединения или передачи данных");
 }
 }
 __finally
 {
 // Закрываем соединение с сервером
 Client->Disconnect();
 Screen->Cursor = crDefault;//Нормальный курсор
 OutProgress->Position = 0;
 
 }
 

Сервер (принимаю)

Код
void __fastcall TForm1::ServerPExecute(TIdContext *AContext)
{
 
AnsiString C_Path = ExtractFilePath(Application->ExeName)+ "\Incom\\"; // ExtractFileName(AContext->Connection->IOHandler->ReadLn()); // "C:\\Incom"+ ExtractFileName(AContext->Connection->IOHandler->ReadLn());
AnsiString Names = AContext->Connection->IOHandler->ReadLn(); // Считаем имя файла из потока
AnsiString fsize = AContext->Connection->IOHandler->ReadLn(); // Считываем размер файла из потока
C_Path = C_Path + Names;
Protocol->Clear();
ArcName = Names;
 
 
  // Создаём поток для чтения байтов файла
TFileStream *SF ;
 
if(!FileExists(C_Path)){
SF = new TFileStream(C_Path,Classes::fmCreate);
}
else
{
SF = new TFileStream(C_Path,Sysutils::fmOpenWrite); ///Sysutils::fmOpenWrite
}
SF->Position = 0;
  // Принимаем файл из сетевого потока
 
 // первый параметр - поток, второй - кол-во байт, которые нужно прочитать (-1 - весь поток), третий - читать до разъединения.
AContext->Connection->IOHandler->ReadStream(SF, -1, true);
 
// Очищаем файловый поток
SF->Free();
 
// СЧИТЫВАЕМ ИНФОРМАЦИЮ О ФАЙЛЕ
if ( Application->MainForm->WindowState!=wsMinimized ) /// (Application->MainForm->WindowState=wsNormal)
{
Show();
//Если форма свёрнута(или на весь экран) показываем сообщение из трэя
TrayIcon1->BalloonTitle="Принят файл";
TrayIcon1->BalloonHint="От: ["+AContext->Connection->Socket->Binding->PeerIP+":"+StrToInt(AContext->Connection->Socket->Binding->PeerPort)+"] \n\rИмя:"+Name+" размер: "+fsize+" кб";
TrayIcon1->BalloonFlags=bfInfo;
TrayIcon1->ShowBalloonHint();
}
// Переменные Names и fsize передаются клиентом перед передачей самого файла
Protocol->Lines->Add("Принят файл: " + Names +" (размер: " + fsize +" байт)");
Protocol->Lines->Add("От: IP ["+AContext->Connection->Socket->Binding->PeerIP+":"+StrToInt(AContext->Connection->Socket->Binding->PeerPort)+"]");
UnpackFiles();
}
//--------------------------------------------------------------------------
 


По одному файлу принимает хорошо но когда одновременно с двух компов тогда ошибка вылетает необяснимая

Помогите пожалуйста  
« Последнее редактирование: 23 Октябрь 2011, 23:35:05 от Bugs » Записан
Leex
Участник


Сказали спасибо: +132/-1
Offline

Сообщений: 577


Re: Как организовать очередь приёма файлов ?
« Ответ #1 : 22 Октябрь 2011, 18:02:15 »

а что за зверь ServerPExecute, какого он класса?
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


Re: Как организовать очередь приёма файлов ?
« Ответ #2 : 23 Октябрь 2011, 11:26:48 »

Цитата: Leex от 22 Октябрь 2011, 18:02:15
а что за зверь ServerPExecute, какого он класса?

Это компанент IdServer Indy10

Как зделать понять не могу
Записан
Zor
Глобальный модератор


Сказали спасибо: +158/-30
Offline

Сообщений: 2946


Re: Как организовать очередь приёма файлов ?
« Ответ #3 : 23 Октябрь 2011, 19:58:58 »

для начала научись выкладывать весь проект и алгоритм получения бага, а не обрывки кода.
Записан
Bugs
Участник


Сказали спасибо: +25/-20
Offline

Сообщений: 389


Re: Как организовать очередь приёма файлов ?
« Ответ #4 : 04 Ноябрь 2011, 03:09:07 »

Выложил )
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Как организовать очередь приёма файлов ?
« Ответ #5 : 04 Ноябрь 2011, 10:00:12 »

Цитировать
Выложил )
Ну, и где проект, который можно скачать, откомпилировать, запустить и посмотреть что не так? Ах, надо взять твои кусочки, потом обеспечить то же самое, что у тебя есть на форме, потом - догадаться, как настроены компоненты, потом - протелепатировать, как вообще написан остальной код и только потом можно будет проверить и сказать, в чем дело? Извини, у меня, к примеру, есть более интересные занятия, чем делать заново то, что уже было тобой сделано. Будет проект - будет разговор. Нет - так нет...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.064 секунд. Запросов: 22.