|
Вопрос # 273/ вопрос открыт / |
|
Всем Привет!
Помогите сделать докачку в этом коде.
Спасибо
Приложение: Переключить в обычный режим- procedure TServerForm.IdTCPServer1Execute(AContext: TIdContext);
- var
- s: string;
- AStream: TIDStreamVCL;
- Filename: string;
- FileSize: int64;
- i,n:integer;
- begin
-
- while AContext.Connection.Connected do
- begin
- s := AContext.Connection.IOHandler.ReadLn;
- if S = 'FILE' then
- begin
- Filename := AContext.Connection.IOHandler.ReadLn; // get filename
- FileSize := StrToInt(AContext.Connection.IOHandler.ReadLn); // get filesize
- ForceDirectories(ExtractFilePath(Paramstr(0)) + 'InServerTCP');
- AStream := TIDStreamVCL.Create(TFileStream.Create(ExtractFilePath(Paramstr(0)) +
'InServerTCP' + Filename, fmCreate), True);
- Application.ProcessMessages;
- try
- Memo1.SelAttributes.Color := clBlue;
-
Memo1.Lines.Add('Ïîëó÷åíèå
ôàéëà [
'+AContext.Connection.Socket.Binding.PeerIP + ' ] " ' + Filename
+ ' "
'+'Îáùèé
ðàçìåð: ' +
BytesToStr(Filesize) + '');
- Label2.Caption:= 'Èìÿ
ôàéëà: '+Filename;
-
Label3.Caption:='Ðàçìåð:
'+ BytesToStr(Filesize);
- //----------------------------------------------------------------------------------------------------
- i:=FileSize div (32*1024);//ó
íàñ
áëîêè ïî
16 êá
- n:=filesize mod (32*1024);
- ProgressBar1.max:=i+1;
- ProgressBar1.Position:=0;
- for i:=0 to i-1 do
- begin
- AContext.Connection.IOHandler.ReadStream(AStream, 32*1024, False);
- ProgressBar1.Position:=i;
- Edit1.Text:=BytesToStr(i);
- Application.ProcessMessages;
- end;
- //À
òåïåðü
çàêà÷èâàåì
îñòàòîê
- AContext.Connection.IOHandler.ReadStream(AStream, n, False);
- ProgressBar1.Position:=ProgressBar1.max;
- //------------------------------------------------------------------------------------------------------
- Application.ProcessMessages;
- Memo1.SelAttributes.Color := clOlive;
- Memo1.Lines.Add('C
àäðåññà [
'+AContext.Connection.Socket.Binding.PeerIP + ' ]
Èìÿ
ôàéëà " ' +
Filename + ' "
ïîëó÷åí
!');
- Memo1.Perform(WM_VScroll, SB_LINEDOWN,0);
- TrayIcon1.ShowBalloonHint('" Server TCP "',
- 'Ôàéë
" '+Filename+' "
óñïåøíî
ïîëó÷åí
!', BitWarning, 10);
- ProgressBar1.Position:=0;
- finally
- FreeAndNil(AStream);
- end;
- end
- else if S = 'QUIT' then
- begin
- Memo1.SelAttributes.Color := clRed;
-
Memo1.Lines.Add('Êëèåíò
[ '+AContext.Connection.Socket.Binding.PeerIP + ' ]
îòêëþ÷èëñÿ
!');
- TrayIcon1.ShowBalloonHint('" Server TCP
"',
-
'Êëèåíò [
'+AContext.Connection.Socket.Binding.PeerIP + ' ]
îòêëþ÷èëñÿ
!', BitWarning, 10);
- AContext.Connection.Disconnect;
- Application.ProcessMessages;
- end
- else
- begin
- Memo1.SelAttributes.Color := clRed;
- Memo1.Lines.Add(AContext.Connection.Socket.Binding.PeerIP + '
:Íåèçâåñòíàÿ
êîììàíäà:
' + S);
- AContext.Connection.Disconnect;
- AStream.Free;
- end;
- end;
- end;
 |
Вопрос задал: Vit2 (статус: Посетитель)
Вопрос отправлен: 19 января 2007, 15:51
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Наиболее просто - сделать так, как в HTTP протоколе. А именно, на сервере добавляете возможност, что файл можно запрашивать не весь а часть и для этого его емя нужно задать в виде<имяфайла>?<с какого байта>-<по какой>
Клиент же запрашивает не весь файл, а по кускам. Правда прийдётся добавить комманду запроса размера файла.
Такая система будет совместима сверху вниз и наоборот. Тоесть старый сервер сможет обслуживать новых клиентов (просто не будет докачки) и наоборот
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 19 января 2007, 16:24
Оценка за ответ: 5
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|