-
Для клиентов, насколько я понял, существует TIdLogFile, результат работы которого можно позже скормить TIdIOHandlerStream.
Вопрос: что делать с серверами? В частности - с TIdTCPServer. Я нашел, что для серверов существуют логгеры - TIdServerInterceptLogFile. Однако, он выдаёт наружу не чистые байты, а полный лог:
-
Что делать, что бы провести симуляцию у TIdTCPServer? Исправлять/переписывать TIdServerInterceptLogFile? Вообще - какой компонентой позже проводить симуляцию? Тоже TIdIOHandlerStream'ом?
Может кто-то сталкивался - ответьте плиз. Инди 10, Делфи 2010.
-
-
Сорри, выражался в терминах Indy In Depth. Нужно повторить поток байт, приходящих в порт, у себя, локально:
кусок из книги:
14.2 симуляция.
Но иногда требуется симулировать клиента или сервер, если он не доступен ... Симуляция может быть выполнена с помощью TIdIOHandlerStream и назначения...
-
Копай в стророну TIdConnectionIntercept
-
Спасибо, посмотрю.
-
Так TIdConnectionIntercept, как я понял, именно клиентские перехватчики:
TIdLogBase = class(TIdConnectionIntercept) TIdLogFile = class(TIdLogBase)
свойство TIdTCPConnection, от которого наследуются клиенты:
property Intercept: TIdConnectionIntercept read GetIntercept write SetIntercept;
Серверные же перехватчики наследуются от:
TIdServerIntercept = class(TIdBaseComponent)
свойство TIdCustomTCPServer'а:
property Intercept: TIdServerIntercept read FIntercept write SetIntercept;
-
свойство TIdTCPConnection читать: свойство TIdTCPConnection'а
-
Зачем тебе на сервере перехватывать контекст слушающего потока ?
-
Опишу ситуацию: передатчик - некоторый, чужой, прибор. Приёмник - мой TIdTCPServer. Они соединены локальной сетью и расположены в тысяче км от меня, доступ и удалённая отладка невозможна. Мне нужен побайтный лог того, что влилось с прибора в TIdTCPServer в пределах одной сессии (connect-disconnect). Исходящий траффик TIdTCPServer'а пока что не интересует.
-
> удалённая отладка невозможна Ну и зачем для этого нужен интерсепт, да еще и слушающего потока ?
-
Хорошо, как иначе симуляцию сделать?
-
Да какую к лешему "симуляцию" ?!) Что ты зацепился за это слово ? Протоколирование и симуляция - две разных больших разницы !
Сервер твой ? Твой. Изменить его можешь ? Видимо можешь, раз заговорил про интерсепторы. Так зачем мудрить с интерсепторами, если все гораздо проще:
в обработчике OnExecute:
1. Принять от клиента данные 2. Запротоколировать их 3. Обработать принятые данные нужным образом
-
Ну мне не только протоколирование нужно, мне это потом еще воспроизвести у себя нужно.
>в обработчике OnExecute:
Не хочется велосипед изобретать.
Прицепил TIdLogStream к входящему соединению, в OnExecute:
FLogStream.ReceiveStream := LogStream; AIndyConnection.Intercept := FLogStream;
Вроде бы получилось. Спасибо за обсуждение.
-
По хорошему, то еще бы и время поступления данных учесть, но, думаю, и так концы найдутся.
-
> Ну мне не только протоколирование нужно, мне это потом еще > воспроизвести у себя нужно.
что значит воспроизвести? зигота блин...
-
> Palladin (17.08.2010 07:45:15) [15]
Для Инди воспроизведение встроеная возможность.
-
> что значит воспроизвести? зигота блин...
Ну это к Подгорецкому, он напереводил ;)
Вообще, Анатолий, огромное спасибо за перевод. Бывает, сильно помогает. Как в этом случае.
-
> Симулятор (17.08.2010 11:56:17) [17]
Ну вот виноватым я оказался :-)
-
Ни одно благородное дело не окажется безнаказанным ;)
-
Вообще, это я писал :) Сайт сообщение не добавлял - думал из-за ника, поменял - оказалось из-за части сообщения. Амбула. Буду скоро на инди ругаться матом :)
procedure TIdLogBase.Receive(var ABuffer: TIdBytes);
....
s := BytesToStringRaw(ABuffer);
Инди криво конвертят TIdBytes > string, часть данных заменяется на пробелы, я тут уже весь свой код перетряс, ища, что не так. Кака, короче, эта индя. Перелазить на что-то другое не хочу, придётся править. Как бы еще им изменения засабмитить...
-
> Дмитрий Белькевич (18.08.2010 02:10:20) [20]
Ты неправильной стороной ешь бутерброд, ругаться надо начинать до использования.
-
Сильно боюсь, что другое только хуже.
-
Блин, вот уже и на сайте баги - то под одним ником пишет, то под другим... фиг поймёшь.
-
Поправил, может кому интересно будет:
procedure TIdLogBase.Receive(var ABuffer: TIdBytes);
var
s: string;
LMsg: string;
begin
if FActive then begin
inherited Receive(ABuffer);
LMsg := '';
if LogTime then begin
LMsg := DateTimeToStr(Now);
end;
s := TIdTextEncoding.Default.GetString(ABuffer);
if FReplaceCRLF then begin
s := ReplaceCR(S);
end;
LogReceivedData(LMsg, s);
end;
end;
procedure TIdLogStream.LogReceivedData(const AText, AData: string);
begin
if FReceiveStream <> nil then begin
WriteStringToStream(FReceiveStream, AData, TIdTextEncoding.Default);
end;
end;
procedure TIdLogStream.LogSentData(const AText, AData: string);
begin
if FSendStream <> nil then begin
WriteStringToStream(FSendStream, AData, TIdTextEncoding.Default);
end;
end;
-
> Симулятор (18.08.2010 12:47:22) [22]
После Инди, не смеши.
-
> Дмитрий Белькевич (18.08.2010 12:47:23) [23]
Не пиши под разными никами, или меняй их до поста.
|