![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сколько раз возникнет событие 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);
Не помогает!