-
Предварительно надумали отказаться от Indy, посмотреть на что-то стороннее. Смотрел на ICS и Synapse, не понравилось то, что последние релизы от 2008-го и 2009 года. Нашел вот такое: Clever Internet Suite http://www.clevercomponents.com/products/inetsuite/index.aspВ Indy используем TIdHTTPServer, TIdTCPServer, TIdCmdTCPServer. Интересуюсь - будут ли аналоги в Clever Internet Suite? Да и вообще - как эти библиотеки в работе?
-
> Synapse, не понравилось то, что последние релизы от 2008-го и 2009 года
Но работает вполне надежно. И код гораздо проще и читабельней.
-
Нас платность, в общем, не особенно смущает. Скорее даже наоборот - хочется что-то надежное, платное, обновляемое, с саппортом.
-
TTcpClient/Server :)
-
> TTcpClient/Server :)
сэнк ю вери мач :)
-
> [0] Дмитрий Белькевич (12.01.12 17:56)
чем Indy то не надежный?
-
> чем Indy то не надежный?
Грешили на один критический глюк из-за него, оказалось, что всё таки не они. Так что пока что останемся на них, смотрю, что нормальной альтернативы всё равно нет.
Насчет надежности. Пришлось допиливать уже где-то в 10-ти местах, а в остальном - всё нормально :)
-
Да, и еще,
Как им допиленное в svn свалить, я так и не нашел (и возьмут ли вообще)? Может им куда отписать можно, что бы обновили версию. Из svn'а ж ничего не заберешь - приходится потом руками синхронизировать...
-
> Дмитрий Белькевич (15.01.12 18:51) [7]
> Как им допиленное в svn свалить
А что допиливали, может куда выложите допиленную версию с комментариями так сказать в общественное достояние?
-
> А что допиливали, может куда выложите допиленную версию > с комментариями так сказать в общественное достояние?
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).
Могу выложить остальные исправления сюда, либо себе на сайт, если есть интерес.
-
> [9] Дмитрий Белькевич (16.01.12 12:18)
эх, не стал бы я такие вещи вообще с пом. компонент для работы в сети делать. там конечно есть для работы со строками, кодировками и т.п. мощные средства, но это не основное направление. все таки, Indy это, в первую очередь, компоненты для передачи данных по сети.
-
> все таки, Indy это, в первую очередь, компоненты для передачи > данных по сети.
ну так если я отдаю им строчку байт, а они половину байт заменяют вопросами - то что с этим делать?
-
> [11] Дмитрий Белькевич (16.01.12 22:05)
не нужно им строчки байт отдавать, это вредная практика. Нужно отдавать блок данных.
-
> не нужно им строчки байт отдавать, это вредная практика. > Нужно отдавать блок данных.
Уточняю. Проблема не с записью в порт, но со чтением:
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;
тоже пришлось править
-
Забудь ты про Инди, пока сделаешь нормально и надежно, поседеть успеешь, а поскольку тебе именно заменую Инди, то конечно Synapse, если синхронность не важна, то ICS, на сайте архив 2010 года, в SVN 2012 есть смысл брать в SVN. У ICS направленость событийно-ориентированая, как у компонент Дельфи, многим это не по нраву, но есть и синхронные методы, для маргиналов.
|