Вы используете неправильный класс IOHandler.
TIdIOHandlerStream
выполняет ввод / вывод с использованием TStream
объектов.Обычно он используется для воспроизведения ранее записанных сеансов в целях отладки, без необходимости физического подключения к реальному серверу.
Вместо этого необходимо использовать TIdIOHandlerStack
, который выполняет ввод-вывод с использованием сокетного соединения TCP / IP,Это стандартный класс IOHandler для Indy, поэтому вам даже не нужно создавать его экземпляр 1 , TIdTCPClient::Connect()
создаст его для вас, если вы не назначите свой собственный.
1: если вам не требуется более сложное использование, например, подключение к серверу через прокси-сервер и т. Д., Вам нужен собственный экземпляр, чтобы вы могли настроить его по мере необходимости.
Для чего выпытаетесь, позвольте TIdTCPClient
использовать TIdIOHandlerStack
и затем вы можете вызвать метод TIdIOHandler::ReadStream()
после подключения к серверу.Передайте в TFileStream
значение для чтения и установите для параметра AByteCount
значение -1, а для параметра AReadUntilDisconnect
- значение True, чтобы оно продолжало считываться до тех пор, пока не будет закрыто соединение с сокетом.
Кроме того, какВ большинстве операций в Indy ReadStream()
блокирует вызывающий поток до завершения, поэтому, чтобы избежать блокировки вашего пользовательского интерфейса, вы должны вызывать ReadStream()
в рабочем потоке.Но, если вы не хотите использовать поток, вы можете поочередно поместить компонент TIdAntiFreeze
в форму.