Я также использую Indy и ICS.
Большую часть времени я предпочитаю Indy, потому что реализация последовательных типов протоколов с ним очень проста (запрос выполняется в своем собственном потоке, так что вы просто читаете / пишете в соединение, очень просто). Использование Indy требует глубоких знаний о потоках и синхронизации. В отличие от Runner, мне нравится, как Indy использует исключения для обработки «исключительных» вещей, потому что это позволяет мне сконцентрироваться на нормальном потоке протокола (я использую блоки try-finally, чтобы убедиться, что я освобождаю ресурсы).
Я также использовал ICS в приложении, где Indy просто не удался: я использовал его для приложения, которое реализует прокси TCP / IP. Использование ICS было проще из-за его неблокирующей природы. Мне удалось «прокси» протоколы TCP / IP, о которых я ничего не знаю, поэтому я понятия не имею, как байты будут перетекать с одного конца на другой. Indy потерпел неудачу в этом сценарии, потому что в Indy вы читаете эфир или пишете, вы не можете делать и то и другое одновременно. Использование ICS для реализации протокола последовательного типа представляет собой небольшую боль: вам, по сути, нужно использовать логику конечного автомата, разбивать протокол на мелкие биты, постоянно устанавливать флаги, чтобы вы знали, где вы находитесь в протоколе. Большой плюс: Франсуа Пиетт, автор ICS, активен и очень полезен на многих форумах и в списках рассылки, и очень быстро поможет со всем, что связано с ICS.
Для меня, если мне нужно что-то сделать с TCP / IP, путь решения очень прост: это можно сделать с помощью Indy? Тогда это Инди. Если это не может быть сделано с Indy, то это будет сделано с ICS!