Indy запись пропускает одну команду
Добавлено: 16.11.2019 08:16:45
Преветствую.
В чем ошибаюсь? Ниже код передачи файла. Клиент отправляет команду, сервер подтверждает что можно передавать. Клиент записывает место куда сохранить файл и передает сам файл.
Сервер принимает файл и отправляет подтверждение что принял. Но клиент упорно не принимает подтверждение. Методом "дурака" поставил две записи подряд. В итоге ответ "FILEOK1" не приходит, а "FILEOK2" приходит.
Клиент:
Сервер:
В чем ошибаюсь? Ниже код передачи файла. Клиент отправляет команду, сервер подтверждает что можно передавать. Клиент записывает место куда сохранить файл и передает сам файл.
Сервер принимает файл и отправляет подтверждение что принял. Но клиент упорно не принимает подтверждение. Методом "дурака" поставил две записи подряд. В итоге ответ "FILEOK1" не приходит, а "FILEOK2" приходит.
Клиент:
- Код: Выделить всё
IdCmdTCPClient1.ReadTimeout:=7000;
iCmdResult:=403;
iCmdResult:=IdCmdTCPClient1.SendCmd(sCmd,-1,cmdEncoding);
if iCmdResult=101 then
begin
IdCmdTCPClient1.IOHandler.WriteLn(sServerFilePath,cmdEncoding);
mClientLog.Lines.Add('101; Начинаю передачу файла');
try
FileStream := TFileStream.Create(sFilePath, fmOpenRead or fmShareDenyWrite);
iSize := FileStream.Size;
IdCmdTCPClient1.IOHandler.LargeStream := True;
IdCmdTCPClient1.IOHandler.WriteBufferOpen;
IdCmdTCPClient1.IOHandler.Write(iSize);
IdCmdTCPClient1.IOHandler.Write(FileStream, iSize);
IdCmdTCPClient1.IOHandler.WriteBufferClose;
sCmdResult:='0';
try
sCmdResult:=IdCmdTCPClient1.IOHandler.ReadLn();
except
end;
if StrToInt(sCmdResult)=StrToInt('200') then
begin
mClientLog.Lines.Add(Format('200; Файл отправлен. Передано %d байт',[iSize]));
end
else begin
mClientLog.Lines.Add('507; Ошибка отправки файла');
end;
FileStream.Free;
except
FileStream.Free;
mClientLog.Lines.Add('500; Ошибка получения файла');
end;
end
else begin
mClientLog.Lines.Add(Format('%d; Нет разрешения на передачу файлов',[iCmdResult]));
end;
Сервер:
- Код: Выделить всё
if NetDirectoryCreate(ExtractFilePath(sFilePath)) then
begin
sFilePath:=UTF8ToSys(sFilePath);
FileStream:=TMemoryStream.Create;
FileStream.Position:=0;
try
ASender.Context.Connection.IOHandler.LargeStream:=True;
iSize:=ASender.Context.Connection.IOHandler.ReadInt64();
ASender.Context.Connection.IOHandler.ReadStream(FileStream,iSize);
if FileStream.Size=iSize then
FileStream.SaveToFile(sFilePath);
FileStream.Free;
iCmdResult:=MRNSERVERREPLY_GREETING;
ThreadSafeLogAdd(format('%d; %s; File saved',[iCmdResult,tmpClientItem.Login]));
except
FileStream.Free;
SysUtils.DeleteFile(sFilePath);
iCmdResult:=MRNSERVERREPLY_ERROR;
ThreadSafeLogAdd(format('%d; %s; Error save file',[iCmdResult,tmpClientItem.Login]));
end;
if iCmdResult=MRNSERVERREPLY_GREETING then
begin
ASender.Context.Connection.IOHandler.WriteLn('FILEOK1');
ASender.Context.Connection.IOHandler.WriteLn('FILEOK2');
end;
//Запись атрибутов файлов
end
else begin
ThreadSafeLogAdd(format('%d; %s; Error get directory path',[iCmdResult,tmpClientItem.Login]));
end;