![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача файла с использованием 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]Напиши как пробовал, и где и что у тебя там не получается.