Конференция "Сети" » Как сделать симуляцию в индиевских серверах?
 
  • Симулятор (14.08.10 13:02) [0]
    Для клиентов, насколько я понял, существует TIdLogFile, результат работы которого можно позже скормить TIdIOHandlerStream.

    Вопрос: что делать с серверами? В частности - с TIdTCPServer. Я нашел, что для серверов существуют логгеры - TIdServerInterceptLogFile. Однако, он выдаёт наружу не чистые байты, а полный лог:
  • Симулятор (14.08.10 13:03) [1]
    Что делать, что бы провести симуляцию у TIdTCPServer?
    Исправлять/переписывать TIdServerInterceptLogFile?
    Вообще - какой компонентой позже проводить симуляцию? Тоже TIdIOHandlerStream'ом?

    Может кто-то сталкивался - ответьте плиз. Инди 10, Делфи 2010.
  • Сергей М. © (16.08.10 09:23) [2]
    Причем здесь "симуляция" ?

    http://www.google.com/search?hl=ru&client=firefox&hs=gVD&rls=org.mozilla:ru:official&defl=ru&q=define: %D0%A1%D0%B8%D0%BC%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F+&sa=X&ei=EctoTNyHCsGUOJf4qLkF&ved=0CBUQkAE
  • Симулятор (16.08.10 11:50) [3]
    Сорри, выражался в терминах Indy In Depth. Нужно повторить поток байт, приходящих в порт, у себя, локально:

    кусок из книги:

    14.2 симуляция.

    Но иногда требуется симулировать клиента или сервер, если он не доступен
    ...
    Симуляция может быть выполнена с помощью TIdIOHandlerStream и назначения...
  • Сергей М. © (16.08.10 11:58) [4]
    Копай в стророну TIdConnectionIntercept
  • Симулятор (16.08.10 13:48) [5]
    Спасибо, посмотрю.
  • Симулятор (16.08.10 14:39) [6]
    Так 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;
  • Симулятор (16.08.10 14:40) [7]
    свойство TIdTCPConnection читать: свойство TIdTCPConnection'а
  • Сергей М. © (16.08.10 14:48) [8]
    Зачем тебе на сервере перехватывать контекст слушающего потока ?
  • Симулятор (16.08.10 14:58) [9]
    Опишу ситуацию: передатчик - некоторый, чужой, прибор. Приёмник - мой TIdTCPServer. Они соединены локальной сетью и расположены в тысяче км от меня, доступ и удалённая отладка невозможна. Мне нужен побайтный лог того, что влилось с прибора в TIdTCPServer в пределах одной сессии (connect-disconnect). Исходящий траффик TIdTCPServer'а пока что не интересует.
  • Сергей М. © (16.08.10 15:12) [10]
    > удалённая отладка невозможна
    Ну и зачем для этого нужен интерсепт, да еще и слушающего потока  ?
  • Симулятор (16.08.10 15:40) [11]
    Хорошо, как иначе симуляцию сделать?
  • Сергей М. © (16.08.10 15:46) [12]
    Да какую к лешему "симуляцию" ?!)
    Что ты зацепился за это слово ?
    Протоколирование и симуляция - две разных больших разницы !

    Сервер твой ? Твой.
    Изменить его можешь ? Видимо можешь, раз заговорил про интерсепторы.
    Так зачем мудрить с интерсепторами, если все гораздо проще:

    в обработчике OnExecute:

    1. Принять от клиента данные
    2. Запротоколировать их
    3. Обработать принятые данные нужным образом
  • Симулятор (16.08.10 18:20) [13]
    Ну мне не только протоколирование нужно, мне это потом еще воспроизвести у себя нужно.

    >в обработчике OnExecute:

    Не хочется велосипед изобретать.

    Прицепил TIdLogStream к входящему соединению, в OnExecute:

    FLogStream.ReceiveStream := LogStream;
    AIndyConnection.Intercept := FLogStream;

    Вроде бы получилось. Спасибо за обсуждение.
  • Симулятор (16.08.10 18:23) [14]
    По хорошему, то еще бы и время поступления данных учесть, но, думаю, и так концы найдутся.
  • Palladin © (17.08.10 07:45) [15]

    > Ну мне не только протоколирование нужно, мне это потом еще
    > воспроизвести у себя нужно.

    что значит воспроизвести? зигота блин...
  • Anatoly Podgoretsky © (17.08.10 08:49) [16]
    > Palladin  (17.08.2010 07:45:15)  [15]

    Для Инди воспроизведение встроеная возможность.
  • Симулятор (17.08.10 11:56) [17]

    > что значит воспроизвести? зигота блин...


    Ну это к Подгорецкому, он напереводил ;)

    Вообще, Анатолий, огромное спасибо за перевод. Бывает, сильно помогает. Как в этом случае.
  • Anatoly Podgoretsky © (17.08.10 22:23) [18]
    > Симулятор  (17.08.2010 11:56:17)  [17]

    Ну вот виноватым я оказался :-)
  • Симулятор (18.08.10 02:01) [19]
    Ни одно благородное дело не окажется безнаказанным ;)
  • Дмитрий Белькевич (18.08.10 02:10) [20]
    Вообще, это я писал :) Сайт сообщение не добавлял - думал из-за ника, поменял - оказалось из-за части сообщения.

    Амбула.

    Буду скоро на инди ругаться матом :)


    procedure TIdLogBase.Receive(var ABuffer: TIdBytes);
    ....
    s := BytesToStringRaw(ABuffer);



    Инди криво конвертят TIdBytes > string, часть данных заменяется на пробелы, я тут уже весь свой код перетряс, ища, что не так.
    Кака, короче, эта индя. Перелазить на что-то другое не хочу, придётся править. Как бы еще им изменения засабмитить...
  • Anatoly Podgoretsky © (18.08.10 10:58) [21]
    > Дмитрий Белькевич  (18.08.2010 02:10:20)  [20]

    Ты неправильной стороной ешь бутерброд, ругаться надо начинать до
    использования.
  • Симулятор (18.08.10 12:47) [22]
    Сильно боюсь, что другое только хуже.
  • Дмитрий Белькевич (18.08.10 12:47) [23]
    Блин, вот уже и на сайте баги - то под одним ником пишет, то под другим... фиг поймёшь.
  • Дмитрий Белькевич (18.08.10 13:59) [24]
    Поправил, может кому интересно будет:


    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;

  • Anatoly Podgoretsky © (19.08.10 10:08) [25]
    > Симулятор  (18.08.2010 12:47:22)  [22]

    После Инди, не смеши.
  • Anatoly Podgoretsky © (19.08.10 10:09) [26]
    > Дмитрий Белькевич  (18.08.2010 12:47:23)  [23]

    Не пиши под разными никами, или меняй их до поста.
 
Конференция "Сети" » Как сделать симуляцию в индиевских серверах?
Есть новые Нет новых   [134436   +26][b:0][p:0.002]