Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.02.2016, 14:11   #1
UbeiBobra
Пользователь
 
Регистрация: 03.09.2014
Сообщений: 39
По умолчанию Передача файла от клиента серверу

Помогите пожалуйста сделать передачу файла от клиента к серверу, ничего не получается
Вложения
Тип файла: rar Клиент.rar (358.2 Кб, 12 просмотров)
Тип файла: rar Сервер.rar (369.0 Кб, 12 просмотров)
UbeiBobra вне форума Ответить с цитированием
Старый 17.02.2016, 16:22   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Функции отправки/получения файлов выложите.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 17.02.2016, 22:27   #3
UbeiBobra
Пользователь
 
Регистрация: 03.09.2014
Сообщений: 39
По умолчанию

Отправка
Код:
   TMemoryStream *MS = new TMemoryStream ; 
   void *P;
   int Size;
   if( OpenDialog1->Execute() )
   {
      MS->LoadFromFile( OpenDialog1->FileName );
     
   }
   ClientSocket->Socket->SendText( "file#" + OpenDialog1->FileName + "#" + IntToStr( MS->Size ) + "#" );
   MS->Position = 0 ;
   P = MS->Memory ;
   Size=ClientSocket->Socket->SendBuf( P , MS->Size );

Последний раз редактировалось UbeiBobra; 17.02.2016 в 22:30.
UbeiBobra вне форума Ответить с цитированием
Старый 17.02.2016, 22:29   #4
UbeiBobra
Пользователь
 
Регистрация: 03.09.2014
Сообщений: 39
По умолчанию

Получение
Код:
void Write( AnsiString Text );
TMemoryStream *MS = new TMemoryStream ;
int Size ;
bool Receive ;
AnsiString FileName ;


void Write( AnsiString Text )
{
 if(MS->Size < Size)
 {
  MS->Write( Text.c_str() , Text.Length() );
 }
 if(MS->Size == Size)
 {
  Receive = false;
  MS->Position = 0;
  FormMain->ServerSocket->Socket->Connections[0]->SendText("end");
  CreateDir( "Downloads" );
  MS->SaveToFile( "Downloads\\"+FileName );
  MS->Clear() ;
  Size = 0 ;
  }
}

void __fastcall TFormMain::ServerSocketClientRead(TObject *Sender,
      TCustomWinSocket *Socket) //Обработчик читающий сообщения
{
//       SendingMessages(Socket->ReceiveText()); //Читаем сообщния и рассылаем их через функцию SendingMessages()
       AnsiString Rtext ;
       Rtext = ServerSocket->Socket->ReceiveText() ;
       if( Receive == true )
       {
          Write( Rtext );
       }
       else
       {
          
          if(Rtext.SubString( 0,Rtext.Pos("#")-1) == "file" )
          {
             Rtext.Delete( 1 , Rtext.Pos( "#" ) ) ;
             Name = Rtext.SubString( 0 , Rtext.Pos( "#" ) -1 );
             FileName = Name.SubString( Name.LastDelimiter( "\\" ) + 1 , Name.Length() );
             Rtext.Delete( 1 , Rtext.Pos( "#" ) );
             Size = StrToInt( Rtext.SubString( 0 , Rtext.Pos( "#" ) - 1) ) ;
             Rtext.Delete( 1 , Rtext.Pos( "#" ) );
             Receive = true;
          }
       }
}

Последний раз редактировалось UbeiBobra; 17.02.2016 в 22:31.
UbeiBobra вне форума Ответить с цитированием
Старый 18.02.2016, 10:12   #5
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

В этом примере, кот. используешь, там же все расписано.
При отправке так же используй TFileStream
Код:


   void *P;
   int Size;
   TFileStream* FS = 0; 
   if( OpenDialog1->Execute() )
   {
       FS = new TFileStream(OpenDialog1->FileName, fmOpenRead);
      //  MS->LoadFromFile( OpenDialog1->FileName );
     
   }
   ClientSocket->Socket->SendText( "file#" + OpenDialog1->FileName + "#" + IntToStr( FS->Size ) + "#" );
   FS->Position = 0 ;
  // P = MS->Memory ;
   Size=ClientSocket->Socket->SendStream(FS);
   delete FS;
   FS = 0;
Получение:
Код:
    bool Receive  = false;
    

void Write( AnsiString Text )
{
   // проверить, есть ли папка Downloads, если нет, то создать

  TFileStream *FS = new TFileStream(FileName, fmCreate);
   FS->Write( Text.c_str() , Text.Length() );

 if(FS->Size == Size)
 {
    
   delete FS;
    FS = 0;
  }
}
Приблизительно так. Отладкой не занимался, так что это на твоей совести.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 18.02.2016, 10:43   #6
UbeiBobra
Пользователь
 
Регистрация: 03.09.2014
Сообщений: 39
По умолчанию

Ничего не получается
Ошибка
Изображения
Тип файла: jpg Безымянный.JPG (14.4 Кб, 94 просмотров)
UbeiBobra вне форума Ответить с цитированием
Старый 19.02.2016, 08:44   #7
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

http://www.programmersforum.ru/showthread.php?t=256788
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача файлов в цикле от клиента серверу Indy Aigulka Работа с сетью в Delphi 10 19.08.2015 09:34
Передача данных между StringGrid'ами от клиента к серверу GrabbeR Работа с сетью в Delphi 6 18.07.2014 15:48
Передача файла от Клиента к Серверу aank10 C++ Builder 2 05.10.2012 18:02
Передача Print Screen'а от клиента к серверу (через сокеты) valdys Работа с сетью в Delphi 5 25.08.2011 12:46
Передача файла от клиента к серверу TFileStream rombler69 Работа с сетью в Delphi 1 30.03.2010 17:45