![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли заставить TIdTCPConnection сообщать о приходе данных? [D7, Win2k]
Zelius © (2003-04-29 17:28:00)На серверной стороне использую TidTcpServer, на клиенте TidTcpClient, хочу по одному каналау передавать данные как по инициативе клиента, так и сервера. Процедура оброботки TidTcpServer.OnExecute:
with aThread as TEPingConnThread do
begin
while NOT Terminated do
begin
HandleQueue; // отработать очередь данных на отсылку клиенту
if aThread.Connection.IOHandler.Readable(0) then HandleInput; // принять входящие данные
FEvent.WaitFor(500);
end;
end;
Мне не нравится интервал ожидания 500 мс, хочу от этого избавиться, но не знаю как это сделать с помощью Indy.
$hade (2003-05-06 06:02:00) [1]Ну наконец то пришли к какому то выводу...:-) А то развели тут :-)
Reindeer Moss Eater (2003-05-05 16:58:00) [2]Так никто и не говорил, что нельзя обойтись одним.
Не вызвай методов чтения с idTimeOutInfinity а в промежутках проверяй не ли в буфере данных для клиента (сообщений ему).
Zelius (2003-05-05 15:35:00) [3]Имхо, если можно обойтись одним соединением, то и надо им обходиться.
Спасибо $hade, надоумил, как можно работать с Индей.
Reindeer Moss Eater (2003-05-05 11:28:00) [4]а ты не думал что есть всякие прокси,фаирволы и т.д.??
и открывать по 2 порта не всегда возможно...
Это больше относится к динамическим номерам портов, что автору не надо на самом деле
зы: приведи ты пример проги работающей по 2 соединениям...по твоему алгоритму...
Любой ftp клиент, Оракл в dedicated mode, ....
$hade (2003-05-05 11:22:00) [5]Получаем:
1. Бесполезное увеличение трафика
не так уж и на много увеличение...(если павильно выбрать размер блока...)
ну и насчет бесполезности я бы тоже поспорил....
2. Усложнение своего протокола
согласен...есть такое...но опять же если правильно подойти к этому - не так уж это и усложнится....
зато в эти 5б ты можешь засунуть столько команд....
И чем это лучше отдельного соединения?
а ты не думал что есть всякие прокси,фаирволы и т.д.??
и открывать по 2 порта не всегда возможно...
зы: приведи ты пример проги работающей по 2 соединениям...по твоему алгоритму...
Reindeer Moss Eater (2003-05-05 09:04:00) [6]И чем это лучше отдельного соединения?
Reindeer Moss Eater (2003-05-05 09:03:00) [7]А чем хуже?? Вполне хватит заголовка в 5 байт...
Да ничем, кроме того, что этот заголовок надо приклеивать ко всем блокам, пересылаемым по сети. Получаем:
1. Бесполезное увеличение трафика
2. Усложнение своего протокола
$hade (2003-05-05 06:23:00) [8]Reindeer Moss Eater (04.05.03 11:14)
Zelius ©
Представь картину:
Клиент начал качать файл с сервера. Сервер бьет файл на блоки и отдает клиенту. При этом сервер хочет отставить за собой право слать клиенту в ЛЮБОЙ момент времени сообщения (используя то же самое соединение). Что отсюда следует?
То, что КАЖДЫЙ блок пересылаемого файла сервер вынужден снабжать заголовком и маркером конца что бы клиент понял что же это такое он прочитал.
И чем это лучше отдельного соединения?
А чем хуже?? Вполне хватит заголовка в 5 байт...
[команда][размер данных][собсно данные]
Та же ICQ по такому протоколу и работает(только заголовок посложней...)
Zelius (2003-05-04 14:01:00) [9]
> Reindeer Moss Eater (04.05.03 11:14)
Для этого варианта да, лучше отдельное соединение. А вообще, как раз для это и существует в сокетах OOB.
Reindeer Moss Eater (2003-05-04 11:14:00) [10]Zelius ©
Представь картину:
Клиент начал качать файл с сервера. Сервер бьет файл на блоки и отдает клиенту. При этом сервер хочет отставить за собой право слать клиенту в ЛЮБОЙ момент времени сообщения (используя то же самое соединение). Что отсюда следует?
То, что КАЖДЫЙ блок пересылаемого файла сервер вынужден снабжать заголовком и маркером конца что бы клиент понял что же это такое он прочитал.
И чем это лучше отдельного соединения?
Инди (2003-05-03 23:29:00) [11]ой-ей-ей! А давай я на тебе одном чего-нибудь в несколько потоков сделаю! В каждом потоке своя Инди должна быть! Вот.
Zelius (2003-05-03 20:05:00) [12]
> А по поводу "че та мне не нравятся эти Indy" и по поводу
> их глючности...да - есть конечно - но в основном - ты просто
> не умеешь их готовить....:-))
А ты пробовал сделать на Инди скачку файла по HTTP в несколько потоков? Если когда-нибудь попробуешь - тебя ждут сюрпризы :)
Zelius (2003-05-03 20:02:00) [13]
> Reindeer Moss Eater (03.05.03 10:42)
Нет.
Reindeer Moss Eater (2003-05-03 10:42:00) [14]И я тебе про сервер, или ты считаешь, что аськин сервер не отправляет сообщения?
Уверен, что он делает это по своей инициативе, а не по запросу клиента?
$hade (2003-05-02 21:06:00) [15]>Да, действительно там так и сделано... Хотя это странно...
Я тоже вначале сомневался...а сейчас - 5-25 клиентов цепляются к серваку(больше просто не надо)...и никаких проблем нет...и тормозов не замечаю...
>Вобщем, после праздников я попробую такую схему, но немешало бы теорией подкрепиться!
А как бы я хотел найти теорию...но нет у меня 100 евро которые просят авторы за месяц чтения какой то их онлайн книги...:-((
А по поводу "че та мне не нравятся эти Indy" и по поводу их глючности...да - есть конечно - но в основном - ты просто не умеешь их готовить....:-))
Zelius (2003-05-02 19:57:00) [16]
> И почему же через интернет тормоз будет чуствоваться???
> Попробуй отослать от сервера клиенту файл в 1 Mb по модему...выполнение
> Connection.WriteBuffer закончится намного быстрей чем данные
> примет клиент....()
а теперь умножь 1 мб на 10 клиентов!
> кста....посмотри Demos"ы для Indy (можешь скачать на www.nevrona/indy)
> там есть пример чата(клиент/сервер)...как раз там все и
> сделано....
Да, действительно там так и сделано... Хотя это странно... Вобщем, после праздников я попробую такую схему, но немешало бы теорией подкрепиться!
Zelius (2003-05-02 19:54:00) [17]
> Reindeer Moss Eater (30.04.03 20:11)
И я тебе про сервер, или ты считаешь, что аськин сервер не отправляет сообщения?
> Reindeer Moss Eater (30.04.03 20:20)
у меня было два соединения, но мне такая схема не понравилась. Зачем делать два, когда можно обойтись одним?
$hade (2003-05-01 12:05:00) [18]т.е. www.nevrona.com/indy
$hade (2003-05-01 12:02:00) [19]кста....посмотри Demos"ы для Indy (можешь скачать на www.nevrona/indy)
там есть пример чата(клиент/сервер)...как раз там все и сделано....
$hade (2003-05-01 11:38:00) [20]2Reindeer Moss Eater (30.04.03 20:20)
>Делается это в дополнительном соединении, работающем по точно такой же схеме.
ну давай ща сделаем 25 подключений на каждого клиента...:-)
2Zelius © (30.04.03 19:11)
Конечно это будет работать, только вот многопоточности не будет, будут чувствоваться тормоза при больших пересылках ( а если еще и через интернет, то и подавно)
И почему же через интернет тормоз будет чуствоваться??? Попробуй отослать от сервера клиенту файл в 1 Mb по модему...выполнение Connection.WriteBuffer закончится намного быстрей чем данные примет клиент....()
, и потом, есть шанс, что связь оборвется в момент когда ты захочешь что-нибудь послать, в этом случае есть шанс получить ошибку что-то типа Access Violation.
скорее это будет "Socket Error #..."
и не ошибка а исключение...:-)
в обработчике OnDisconnect удаляешь из ActiveClients (в моем случае) указатель и все...
Поток уничтожается только после обработки OnDisconnect...