2010-06-02 3 views
0

Как отправить двоичные данные с компонентами Indy? Какой из них наиболее подходит для этой задачи? Я попытался использовать TIdTcpClient, но он позволяет только отправлять строки.Отправка двоичных данных с помощью Indy через TCP IP, как?

Я нашел один reponce для этой проблемы here, но я не понимаю. Он говорит о методе Write(TIdBytes), но ответ не ясен для меня. Он имел в виду Write для какого-то экземпляра TIdBytes и как подключить этот экземпляр с помощью TIdTcpClient?

Спасибо за любую помощь.

ответ

4

Страница, которую вы цитируете, не очень хорошо воспроизводит сообщения. Вот что Реми действительно написал:

SendCmd() предназначен только для текстовых команд/параметров. У вас было бы для отправки двоичных данных после выхода SendCmd(), и сервер должен был бы читать двоичные данные после отправки ответа клиенту. Для Например:

--- клиента ---

begin 
    IdTCPClient1.SendCmd('DoIt', 200); 
    // send binary data, such as with Write(TStream) or Write(TIdBytes)... 
end; 

В Write методах о которых он говорил, являются членами TIdIOHandler класса. Ваш объект TIdTCPConnection имеет экземпляр этого класса в свойстве IOHandler, и действительно, это то, что функция SendCmd использует для отправки своей строки.

Обозначение Write(TIdBytes) означает использование метода Write, который принимает входной параметр TIdBytes.

Если двоичные данные уже находятся в потоке или динамическом массиве байтов, вы можете передать один из них непосредственно методу Write. Существует также метод WriteFile, который отправит весь внешний файл, если вы укажете имя файла. Если вы используете версию потока, у вас есть возможность автоматически включать длину потока.

Если у вас еще нет данных в одной из этих структур, вы можете либо написать данные по частям с помощью методов Write, которые принимают различные типы целочисленного размера, либо вы можете скопировать данные в TMemoryStream, а затем пройти это до Write.

+0

Спасибо, Роб, страница путала меня из-за ее формирования. Спасибо за помощь. – Wodzu

0

Write - это метод (или что бы он ни называл в Delphi) TCPClient. Вот рабочий код того, что вы хотите сделать: http://delphi.about.com/od/internetintranet/l/aa012004a.htm. Должен вас поднять &, работающий в кратчайшие сроки :)

+0

Фактически, это * не * рабочий код. По крайней мере, не для Indy 10. 'Write' больше не является методом' TIdTCPClient'. –

+0

Спасибо, Майк, проблема в том, что у меня нет такого метода в моей версии Indy для TIdTcpClient ... также документация для Indy doest говорит об этих методах ... Я верю, что пример, который вы дали, довольно старый и не обновляется. – Wodzu

+0

Я не имел в виду, что вы могли бы скопировать и вставить код, но мне лично было очень полезно написать собственный код (C++ Builder 2009). Ну что ж. –

Смежные вопросы