Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача файла с использованием KOLICS - KOLWSocket [Delphi, Windows]


omegaB ©   (2004-08-18 15:50:00) 

Доброе время суток!
Я переписываю свою приложение под KOL.
Произошел затык в передаче файла от Сервера к клиенту.

Старый код :

 -- На Сервере:
  ...
   fs:=TFileStream.Create('C:\SKLAD\Sklad.exe', fmOpenRead);
  try
   fs.Position:= 0;
   Socket.SendText('Size:'+IntToStr(fs.Size) + #0);
   Socket.SendStream(fs);
  finally
  end;
 ...

 -- На Клиенте :

procedure TForm1.ClientSocket1Read(Sender: TObject;
 Socket: TCustomWinSocket);
var
s, sl: string;
begin
s:= Socket.ReceiveText;

 if Reciving = False then
 begin
  sMemo1.Lines.Add( s );
 end;

if Reciving then
 begin
  fs.Write(s[1], length(s));
  if fs.Size=DataSize then
   begin
    fs.Free;
    Reciving:=false;
    Application.MessageBox('Обновление загружено', 'Внимание!!!');
   end;
  exit;
 end;

if copy(s, 1, 5)='Size:' then
 begin
  sl:=copy(s, 6, Pos(#0, s)-6);
  DataSize:= StrToInt(sl);//Str2Int(s1);
  Delete(s, 1, Pos(#0, s));
  Reciving:=true;
  fs:=TFileStream.Create('Sklad.new',fmCreate);
  fs.Write(s[1], length(s));
 end;

end;

  Работает прекрасно, подскажите, как мне передать файл если я использую KOLWSocket .

Если можно - пример кода.

Заранее Вам благодарен.


Gandalf   (2004-08-24 20:04:00) [1]

CliSocket.PeekData(TransmFile.Memory, SizeOf(TransmFile.Data));
Это полная чушь...

//и ак пробовал:  CliSocket.Send(  TransmFile.Memory, SizeOf(TransmFile.Data));

Пришли мне на мыло клиент и сервер - я посмотрю, самому набивать лень...


omegaB   (2004-08-24 12:34:00) [2]

Спасибо за помощь!

Попробовал так :

TransmFile := NewMemoryStream; //создаем поток
  Resource2Stream(TransmFile,HInstance,'C:\SKLAD\Sklad.exe',RT_RCDATA);
  TransmFile.Position := 0;
  CliSocket.SendStr('Size:'+IntToStr(SizeOf(TransmFile.Data)) + #0);
   CliSocket.PeekData(TransmFile.Memory, SizeOf(TransmFile.Data));

 //и ак пробовал:  CliSocket.Send(  TransmFile.Memory, SizeOf(TransmFile.Data));

  TransmFile.free;


Нифига не работает.... :(

Потом сделал так :

procedure FastFileSend(Const fname: String );
Var
 hmem, hFile : THandle;
 size : LongInt;
 p : Pointer;
Begin
 hFile := FileOpen( fname, fmOpenRead );
   try
    size := FileSeek( hFile, 0, 2 );
    FileSeek( hfile, 0, 0 );

     If size > 0 Then
      Begin

       hmem := GlobalAlloc( GHND, size );

   If hMem <> 0 Then
   Begin

    p := GlobalLock( hMem );

    If p <> Nil Then
     Begin
     _hread( hFile, p, size );
      GlobalUnlock( hMem );

      CliSocket.SendStr('Size:'+IntToStr(size) + #0);
      CliSocket.Send( p, size );

     End
    Else
     GlobalFree( hMem );

   End;

      End;

   finally
   FileClose( hFile );
   end;

end;


Наконец-то РАБОТАЕТ !!!

Люди добрые!!! Подскажите минусы моего способа.
А со STREAM не получается, но очень хочется разобраться.
Помогите плз.


nicesc   (2004-08-21 12:30:00) [3]

omegaB ©
http://kol.mastak.ru/files/art/lessons11.htm


omegaB   (2004-08-20 19:15:00) [4]

А так правильно?

Var
 vFile : TMemoryStream;
  ....
   vFile := TMemoryStream.Create;
   vFile.LoadFromFile('C:\SKLAD\Sklad.exe');
   
   CliSocket.SendStr('Size:'+IntToStr(vFile.Size) + #0);
   CliSocket.Send( vFile.Memory ,vFile.Size );


Gandalf   (2004-08-19 20:42:00) [5]

Мы об KOLICS говорим?

Тогда откуда
fs: TFileStream; // Буфер для файла
?
И с какой стати
CliSocket.Send(fs, fs.Size);
будет работать?
Send шлет данные при условии что fs указатель...


omegaB   (2004-08-19 16:32:00) [6]

Файл не передается :(


omegaB   (2004-08-19 15:16:00) [7]

Пробую я так :

Var    fs: TFileStream; // Буфер для файла
      CliSocket : PWSocket;
.....

fs:=TFileStream.Create('C:\SKLAD\Sklad.exe', fmOpenRead);
try
   fs.Position:= 0;
   CliSocket.SendStr('Size:'+IntToStr(fs.Size) + #0);
   CliSocket.Send(fs, fs.Size);

   CliSocket.SendStr(#13 + #10+ 'Файл отправлен.' + #13 + #10);
  finally
    CliSocket.SendStr(#13 + #10+'ERROR - ошибка отправки файла!!!' + #13 + #10);
  end;
U>


SPeller   (2004-08-19 06:59:00) [8]

Напиши как пробовал, и где и что у тебя там не получается.


Наверх

Титульная страница Поиск, карта сайта Написать письмо