Конференция "Сети" » Посоветуйте замену Indy
 
  • Дмитрий Белькевич (12.01.12 17:56) [0]
    Предварительно надумали отказаться от Indy, посмотреть на что-то стороннее.

    Смотрел на ICS и Synapse, не понравилось то, что последние релизы от 2008-го и 2009 года.

    Нашел вот такое:

    Clever Internet Suite

    http://www.clevercomponents.com/products/inetsuite/index.asp

    В Indy используем TIdHTTPServer, TIdTCPServer, TIdCmdTCPServer. Интересуюсь - будут ли аналоги в Clever Internet Suite? Да и вообще - как эти библиотеки в работе?
  • Сергей М. © (12.01.12 18:00) [1]
    > Synapse, не понравилось то, что последние релизы от 2008-го и 2009 года

    Но работает вполне надежно. И код гораздо проще и читабельней.
  • Дмитрий Белькевич (12.01.12 18:07) [2]
    Нас платность, в общем, не особенно смущает. Скорее даже наоборот - хочется что-то надежное, платное, обновляемое, с саппортом.
  • Dennis I. Komarov © (12.01.12 19:20) [3]
    TTcpClient/Server :)
  • Дмитрий Белькевич (12.01.12 22:24) [4]

    > TTcpClient/Server :)


    сэнк ю вери мач :)
  • Eraser © (13.01.12 02:52) [5]
    > [0] Дмитрий Белькевич   (12.01.12 17:56)

    чем Indy то не надежный?
  • Дмитрий Белькевич (15.01.12 18:48) [6]

    > чем Indy то не надежный?


    Грешили на один критический глюк из-за него, оказалось, что всё таки не они.
    Так что пока что останемся на них, смотрю, что нормальной альтернативы всё равно нет.

    Насчет надежности. Пришлось допиливать уже где-то в 10-ти местах, а в остальном - всё нормально :)
  • Дмитрий Белькевич (15.01.12 18:51) [7]
    Да, и еще,

    Как им допиленное в svn свалить, я так и не нашел (и возьмут ли вообще)? Может им куда отписать можно, что бы обновили версию. Из svn'а ж ничего не заберешь - приходится потом руками синхронизировать...
  • DVM © (15.01.12 19:04) [8]

    > Дмитрий Белькевич   (15.01.12 18:51) [7]


    > Как им допиленное в svn свалить

    А что допиливали, может куда выложите допиленную версию с комментариями так сказать в общественное достояние?
  • Дмитрий Белькевич (16.01.12 12:18) [9]

    > А что допиливали, может куда выложите допиленную версию
    > с комментариями так сказать в общественное достояние?


    procedure TIdCmdTCPClientListeningThread.Run;

    1. Синхронизация HandleCommand с тредом.
    2. Обработка разбитых строк - ReadLnSplit вместо ReadLn.

    procedure TIdCmdTCPServer.DoConnect(AContext: TIdContext);

    1. В моём случае не всегда нужно было возвращать статусы успешности команд - дописал if Greeting.ReplyExists > Greeting.ReplyExists and CommandHandlers.PerformReplies

    Несколько мест - были проблемы с русским языком. Русские буквы менялись на знаки вопросов.

    Исправлялось так:

    1. function TIdCmdTCPServer.ReadCommandLine(AContext: TIdContext): string;

    Было: Result := AContext.Connection.IOHandler.ReadLn
    Стало: Result := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default);

    2. procedure TIdLogBase.Send(var ABuffer: TIdBytes);

    Было: s := BytesToStringRaw(ABuffer);
    Стало: s := TIdTextEncoding.Default.GetString(ABuffer);

    3. class function TIdURI.URLDecode(ASrc: string; AByteEncoding: TIdTextEncoding = nil {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}): string;

    Было: AppendByte(LBytes, Byte(IndyStrToInt('$' + ESC)));
    Стало: AppendByte(LBytes, Byte(StrToInt('$' + ESC)));

    Ну и procedure SplitColumns в IdGlobal с пяток исправлений - из-за русского языка, насколько я помню.

    Не знаю, насколько эти исправления применимы и нужны, да и тестовых кейсов никаких нет, что бы либу потестить нормально. У нас сейчас  всё нормально работает (TIdHTTPServer, TIdTCPServer, TIdCmdTCPServer, TIdTCPClient).

    Могу выложить остальные исправления сюда, либо себе на сайт, если есть интерес.
  • Eraser © (16.01.12 20:43) [10]
    > [9] Дмитрий Белькевич   (16.01.12 12:18)

    эх, не стал бы я такие вещи вообще с пом. компонент для работы в сети делать. там конечно есть для работы со строками, кодировками и т.п. мощные средства, но это не основное направление. все таки, Indy это, в первую очередь, компоненты для передачи данных по сети.
  • Дмитрий Белькевич (16.01.12 22:05) [11]

    > все таки, Indy это, в первую очередь, компоненты для передачи
    > данных по сети.


    ну так если я отдаю им строчку байт, а они половину байт заменяют вопросами - то что с этим делать?
  • Eraser © (19.01.12 13:32) [12]
    > [11] Дмитрий Белькевич   (16.01.12 22:05)

    не нужно им строчки байт отдавать, это вредная практика. Нужно отдавать блок данных.
  • Дмитрий Белькевич (21.01.12 21:52) [13]

    > не нужно им строчки байт отдавать, это вредная практика.
    >  Нужно отдавать блок данных.


    Уточняю. Проблема не с записью в порт, но со чтением:

    1. function TIdCmdTCPServer.ReadCommandLine(AContext: TIdContext): string;

    Было: Result := AContext.Connection.IOHandler.ReadLn
    Стало: Result := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default);

    Пишу то я как раз блоком. Читаю как строку.

    Здесь же - только строчные данные (насколько я помню):

    2. procedure TIdLogBase.Send(var ABuffer: TIdBytes);

    (использую TIdLogBase для побайтного логирования соединения)

    Здесь урл криво перекодировался:

    3. class function TIdURI.URLDecode(ASrc: string; AByteEncoding: TIdTextEncoding = nil {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}): string;

    тоже пришлось править
  • Anatoly Podgoretsky © (23.01.12 09:54) [14]
    Забудь ты про Инди, пока сделаешь нормально и надежно, поседеть успеешь, а поскольку тебе именно заменую Инди, то конечно Synapse, если синхронность не важна, то ICS, на сайте архив 2010 года, в SVN 2012 есть смысл брать в SVN. У ICS направленость событийно-ориентированая, как у компонент Дельфи, многим это не по нраву, но есть и синхронные методы, для маргиналов.
 
Конференция "Сети" » Посоветуйте замену Indy
Есть новые Нет новых   [134435   +15][b:0][p:0.001]