Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сколько раз возникнет событие TServerSocket.ClientRead? [D6, WinXP]


Calm ©   (2003-10-10 16:21:00) 

В коде клиентского приложения должен выполняться код типа такого:
...
ClientSocket.SendText(str1);
ClientSocket.SendText(str2);
ClientSocket.SendText(str3);
...

Я предполагал, что на сервере трираза возникнет событие чтение. Однако по непонятной мне причине получаю одно"слипшееся" сообщение с принятым текстом str1+str2+str3.
Более всего непонятно то, что глюк наблюдается, когда клиентские программы запущены на нескольких компах.

В чем может быть причина проблемы?
Может я что-то делаю не так? Опыт работы с сокетами у меня маловат :(

Буду признателен за советы :)


Verg   (2003-10-11 14:08:00) [1]


> А в шестых дельфях есть Indy?


Есть.


Basilio   (2003-10-11 13:13:00) [2]

А в шестых дельфях есть Indy? В пятых не было, в седьмых есть...
Там в TIdTCPServer есть CommandHandlers - очень мощная вещь.
Мне даже удалось договорить D5::TClientSocket с Kylix3/D7::TIdTCPServer ;)
Сервер должен был работать под linux/win (без напряга сделалось под D7/Kylix3), а клиент должен был быть написан на D5.


calm   (2003-10-10 17:22:00) [3]

ok, большоеспасибо всем.


Reindeer Moss Eater   (2003-10-10 17:20:00) [4]

Хочется принимать отдельные команды?
Надо внедрять протокол обмена.

Отправил - жди ответа.
Пришел ответ - делай дальше


calm   (2003-10-10 17:15:00) [5]

Вот и мне хотелось бы чего-нибудь поиспользовать, а не огород городить.

P.S. Не сочтите за ленивого, хочется всего и сразу :)


Digitman   (2003-10-10 17:10:00) [6]


> calm


ничего "хренового".
куча протоколов, которыми ты пользуешься каждый день (включая протол http, при помощи которого ты сейчас это читаешь), используют TCP/IP


calm   (2003-10-10 17:02:00) [7]


> Нет :) Все равно придется этот огород городить

Хреново.
Так не хочется верить, что это действительно так :))
Впрочем, хоть надежда и не умерла, пойду вскапывать грядки своего огорода :)


calm   (2003-10-10 16:59:00) [8]


> А чего смешного?
>
> Я ж тебе говорю - никакой это не "глюк". Все так и должно
> быть.

Да все в порядке, я тебя понял.
Просто я не ожидал, что так правильно.


Verg   (2003-10-10 16:58:00) [9]


> calm © (10.10.03 16:42) [5]
>
> > Все нормально
>
> :-)


А чего смешного?

Я ж тебе говорю - никакой это не "глюк". Все так и должно быть.
Кто тебе сказал, что количество принятых OnRead должно равняться количеству Send-ов ???


крот   (2003-10-10 16:55:00) [10]


> Ох... И по-проще нет способа? :((


Нет :) Все равно придется этот огород городить. А если будет большая посылка, а TCP/IP передает данные пакетами не больше 8кБ, как ты будешь определять начало и конец посылки? Нужен еше один уровень над TCP/IP.


calm   (2003-10-10 16:42:00) [11]


> Все нормально

:-)

> при каждом получении строки, сервер будет посылать уведомление
> клиенту, что он уже получил

Ох... И по-проще нет способа? :((


крот   (2003-10-10 16:36:00) [12]

Придется сделать так, при каждом получении строки, сервер будет посылать уведомление клиенту, что он уже получил очередную строку и только тогда клиент будет посылать следующую строку.


Verg   (2003-10-10 16:36:00) [13]

Все нормально. В TCP/IP - как разбивать поток на "блоки" - это его (TCP/IP) личное дело. Ты мог бы получить и шесть OnRead-ов и два.


calm   (2003-10-10 16:27:00) [14]

Быть может беда в том, что я использую на сервере stNonBlocking-сокет, а нужно stThreadBlocking?
Тогда мне нужно использовать в событиях чтения от клиента thread-safe code. Это как? Создавать критическую секцию?


calm   (2003-10-10 16:24:00) [15]

Второй день разбираюсь, не могу понять в чем дело :(

От безысходности пробовал делать так:
ClientSocket.SendText(str1);
sleep(200);
ClientSocket.SendText(str2);
sleep(200);
ClientSocket.SendText(str3);

Не помогает!


Наверх

Титульная страница Поиск, карта сайта Написать письмо