|
Вопрос # 1 819/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Никак немогу додуматся как написать функцию типа
<< function inmessage(outmessage:string):string >> которая должна отправить текстовою команду на Tsocketserver, дождаться ответа и принять его.
Использую TsocketClient.
 |
Вопрос задал: Dix (статус: Посетитель)
Вопрос отправлен: 16 августа 2008, 19:16
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Dix!
Хочеться сразу предупредить, что данные компоненты на этот момент являются моральноустаревшими. К тому же они по умолчанию работают в неблокирующем режиме, который с одной стороны якобы упрощает кодирование (не нужно использовать потоки, хотя на самом деле был придуман MS в времена Win3.1, когда в ней не было нормального планировщика потоков и блокирующие сокеты просто бы ложили всю операционную систему. Была проведены "разяснительные работы" среди програмистов, которым рассказали как хороши неблокирующие сокеты. В других операционных системах до сих пор нет неблокирующих сокетов. и проблем, связаных с ними).
Во вторых, под делфи 2006-2007 этих компонентов уже и нет.
Теперь по вопросу ближе. Все зависит от того, какие сокеты вы выбирете. если блокирующие - то тут всё просто. вначале вызывается метод Write. в следующей строке - read. точных имен не помню - использовал эти компоненты последний раз где то в 2002-2003.
В случае с неблокирующими сокетами написать функцию, как вы хотите практически невозможно. Точнее возможно, но это будет не одна функция. С неблокирующими сокетами это выглядит так. Вначале в сокет посылаются данные и с функции прийдётся выйти. а вот когда данные прийдут, сработает событие OnRead. А там надо обрабатывать то, что пришло. и тут начинаются интересные вещи. Во первых, вам самим надо позаботиться, что бы понять, на какой запрос пришли данные. (завести серию флажком и переменных состояния). во вторых, никто не сказал, что если сервер отправил 20 байт, то вы их одной посылкой и споймаете. Можно споймать вначале 12, а потом 8. и надо самостоятельно склеить их. а может быть и на оборот. сервер отправил два пакета по 20 байт, а вы получили за три прихода - первый раз 10, потом 25 и 5 в конце. И это абсолютно реально. Правда на таких малых объемах этот эффект редко проявляется, но уже на нескольких килобайтах и не в локальной сети....
Еще один эффект - данные не обязаны приходить сразу же. то есть, они могут прийти через 0.5 секунды. а может произойти дисконнект - тогда часть данных потеряется. Единственное, что гарантируется, что данные прийдут в том же порядке, в котором они были отправлены.
И на последок несколько ссылок, если вы всё таки хотите изучать эти компоненты.
http://delphi-faq.zoxt.net/100.htm
http://docs.luksian.com/programming/delphi/prsokdelph/
список кодов ошибок
Когда намучитесь с ними, пишите, описывайте более подробно, что вы хотите сделать, научим работать как надо.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 17 августа 2008, 01:35
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|