Форум: "KOL";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
ВнизПередача файла с использованием KOLICS - KOLWSocket Найти похожие ветки
← →
omegaB © (2004-08-18 15:50) [0]Доброе время суток!
Я переписываю свою приложение под 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 .
Если можно - пример кода.
Заранее Вам благодарен.
← →
SPeller © (2004-08-19 06:59) [1]Напиши как пробовал, и где и что у тебя там не получается.
← →
omegaB © (2004-08-19 15:16) [2]Пробую я так :
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>
← →
omegaB © (2004-08-19 16:32) [3]Файл не передается :(
← →
Gandalf © (2004-08-19 20:42) [4]Мы об KOLICS говорим?
Тогда откуда
fs: TFileStream; // Буфер для файла
?
И с какой стати
CliSocket.Send(fs, fs.Size);
будет работать?
Send шлет данные при условии что fs указатель...
← →
omegaB © (2004-08-20 19:15) [5]А так правильно?
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 );
← →
nicesc (2004-08-21 12:30) [6]omegaB ©
http://kol.mastak.ru/files/art/lessons11.htm
← →
omegaB © (2004-08-24 12:34) [7]Спасибо за помощь!
Попробовал так :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 не получается, но очень хочется разобраться.
Помогите плз.
← →
Gandalf © (2004-08-24 20:04) [8]CliSocket.PeekData(TransmFile.Memory, SizeOf(TransmFile.Data));
Это полная чушь...
//и ак пробовал: CliSocket.Send( TransmFile.Memory, SizeOf(TransmFile.Data));
Пришли мне на мыло клиент и сервер - я посмотрю, самому набивать лень...
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.049 c