![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать симуляцию в индиевских серверах?
Симулятор © (2010-08-14 13:02:00)Для клиентов, насколько я понял, существует TIdLogFile, результат работы которого можно позже скормить TIdIOHandlerStream.
Вопрос: что делать с серверами? В частности - с TIdTCPServer. Я нашел, что для серверов существуют логгеры - TIdServerInterceptLogFile. Однако, он выдаёт наружу не чистые байты, а полный лог:
Anatoly Podgoretsky (2010-08-19 10:09:00) [1]> Дмитрий Белькевич (18.08.2010 12:47:23) [23]
Не пиши под разными никами, или меняй их до поста.
Anatoly Podgoretsky (2010-08-19 10:08:00) [2]> Симулятор (18.08.2010 12:47:22) [22]
После Инди, не смеши.
Дмитрий Белькевич (2010-08-18 13:59:00) [3]Поправил, может кому интересно будет:
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 := BytesToStringRaw(ABuffer);
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;
Дмитрий Белькевич (2010-08-18 12:47:00) [4]Блин, вот уже и на сайте баги - то под одним ником пишет, то под другим... фиг поймёшь.
Симулятор (2010-08-18 12:47:00) [5]Сильно боюсь, что другое только хуже.
Anatoly Podgoretsky (2010-08-18 10:58:00) [6]> Дмитрий Белькевич (18.08.2010 02:10:20) [20]
Ты неправильной стороной ешь бутерброд, ругаться надо начинать до
использования.
Дмитрий Белькевич (2010-08-18 02:10:00) [7]Вообще, это я писал :) Сайт сообщение не добавлял - думал из-за ника, поменял - оказалось из-за части сообщения.
Амбула.
Буду скоро на инди ругаться матом :)
procedure TIdLogBase.Receive(var ABuffer: TIdBytes);
....
s := BytesToStringRaw(ABuffer);
Инди криво конвертят TIdBytes > string, часть данных заменяется на пробелы, я тут уже весь свой код перетряс, ища, что не так.
Кака, короче, эта индя. Перелазить на что-то другое не хочу, придётся править. Как бы еще им изменения засабмитить...
Симулятор (2010-08-18 02:01:00) [8]Ни одно благородное дело не окажется безнаказанным ;)
Anatoly Podgoretsky (2010-08-17 22:23:00) [9]> Симулятор (17.08.2010 11:56:17) [17]
Ну вот виноватым я оказался :-)
Симулятор (2010-08-17 11:56:00) [10]
> что значит воспроизвести? зигота блин...
Ну это к Подгорецкому, он напереводил ;)
Вообще, Анатолий, огромное спасибо за перевод. Бывает, сильно помогает. Как в этом случае.
Anatoly Podgoretsky (2010-08-17 08:49:00) [11]> Palladin (17.08.2010 07:45:15) [15]
Для Инди воспроизведение встроеная возможность.
Palladin (2010-08-17 07:45:00) [12]
> Ну мне не только протоколирование нужно, мне это потом еще
> воспроизвести у себя нужно.
что значит воспроизвести? зигота блин...
Симулятор (2010-08-16 18:23:00) [13]По хорошему, то еще бы и время поступления данных учесть, но, думаю, и так концы найдутся.
Симулятор (2010-08-16 18:20:00) [14]Ну мне не только протоколирование нужно, мне это потом еще воспроизвести у себя нужно.
>в обработчике OnExecute:
Не хочется велосипед изобретать.
Прицепил TIdLogStream к входящему соединению, в OnExecute:
FLogStream.ReceiveStream := LogStream;
AIndyConnection.Intercept := FLogStream;
Вроде бы получилось. Спасибо за обсуждение.
Сергей М. (2010-08-16 15:46:00) [15]Да какую к лешему "симуляцию" ?!)
Что ты зацепился за это слово ?
Протоколирование и симуляция - две разных больших разницы !
Сервер твой ? Твой.
Изменить его можешь ? Видимо можешь, раз заговорил про интерсепторы.
Так зачем мудрить с интерсепторами, если все гораздо проще:
в обработчике OnExecute:
1. Принять от клиента данные
2. Запротоколировать их
3. Обработать принятые данные нужным образом
Симулятор (2010-08-16 15:40:00) [16]Хорошо, как иначе симуляцию сделать?
Сергей М. (2010-08-16 15:12:00) [17]> удалённая отладка невозможна
Ну и зачем для этого нужен интерсепт, да еще и слушающего потока ?
Симулятор (2010-08-16 14:58:00) [18]Опишу ситуацию: передатчик - некоторый, чужой, прибор. Приёмник - мой TIdTCPServer. Они соединены локальной сетью и расположены в тысяче км от меня, доступ и удалённая отладка невозможна. Мне нужен побайтный лог того, что влилось с прибора в TIdTCPServer в пределах одной сессии (connect-disconnect). Исходящий траффик TIdTCPServer'а пока что не интересует.
Сергей М. (2010-08-16 14:48:00) [19]Зачем тебе на сервере перехватывать контекст слушающегопотока ?
Симулятор (2010-08-16 14:40:00) [20]свойство TIdTCPConnection читать: свойство TIdTCPConnection'а