Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#121: 2015-04-19 21:15:58 ЛС | профиль | цитата
Не происходит отключение у клиента. Сервер клиента отключает, но onDisconnect у клиента не происходит.
Ну и повторно нельзя подключиться к серверу пока вручную у клиента не сделаешь disoconnect. Как бороть?

code_35510.txt
карма: 0

0
файлы: 1code_35510.txt [1.2KB] [588]
Ответов: 4621
Рейтинг: 746
#122: 2015-04-20 10:29:37 ЛС | профиль | цитата
Событие отключения может сработать только если включено ожидание данных (AutoReceiving=True или doStartReceiving) или отключение обнаружено по ошибке при отправке данных.

Конкретно в данном случае там в коде стоит такая заглушка: если событие onReceive не подключено, то и ожидание данных нет смысла включать. Вот и получился такой побочный эффект. То-есть, достаточно вцепить Memory/DoData на выход onReceive. То же самое касается сервера.
карма: 26

0
Ответов: 655
Рейтинг: 18
#123: 2015-04-20 11:08:52 ЛС | профиль | цитата
Netspirit, так в схеме же как раз AutoReceiving=True.

п.с. а почему после отключения клиента сервером клиент повторно не подключается?
------------ Дoбавленo в 11.08:
Все разобрался.
карма: 0

0
Ответов: 655
Рейтинг: 18
#124: 2015-04-30 22:29:16 ЛС | профиль | цитата
В шапке последняя версия компонентов?
карма: 0

0
Ответов: 4621
Рейтинг: 746
#125: 2015-05-01 10:25:12 ЛС | профиль | цитата
Публичная - да. Сейчас тестирую новую, полностью переработанную версию.
карма: 26

0
Ответов: 4621
Рейтинг: 746
#126: 2015-05-04 11:56:01 ЛС | профиль | цитата
Видео для затравки:
http://depositfiles.com/files/rejsru6zl

Редактировалось 1 раз(а), последний 2018-09-05 11:40:24
карма: 26

1
Голосовали:halt
Ответов: 2059
Рейтинг: 131
#127: 2015-05-04 14:52:04 ЛС | профиль | цитата
Сейчас тестирую новую, полностью переработанную версию.

Очень ждём!
code_35560.txt

карма: 6

0
файлы: 1code_35560.txt [1.8KB] [434]
Ответов: 4621
Рейтинг: 746
#128: 2015-05-04 14:54:55 ЛС | профиль | цитата
[offtop]flint2, ну ты прям целую лекцию прочитал Музыка - предполагалось, можно в плеере отключить. Файлообменник - rghost.net что-то не хочет принимать, а из платных dfiles - не самый геморройный.[/offtop]
карма: 26

0
Ответов: 2059
Рейтинг: 131
#129: 2015-05-04 15:47:02 ЛС | профиль | цитата
[offtop]Не сердись.
Я так, к слову.
Меня 21 год дрессировали этому, вот и замечаю всё.
Даже "Магазин на диване" и подобное на телевидении критикую, когда они не профессионально делают.
Издержки бывшей профессии.
А компоненты хорошие. Ничего не скажешь.
P.S.
Любая критика полезна, как и все трудности в жизни, которые нас не убивают.[/offtop]
карма: 6

0
Ответов: 209
Рейтинг: 1
#130: 2015-05-05 17:42:30 ЛС | профиль | цитата
Netspirit, не умею сливать из таких сервисов. Расскажи в вкратце какие ништяки ждут публику ? ))
карма: 0

0
Ответов: 4621
Рейтинг: 746
#131: 2015-05-05 18:07:11 ЛС | профиль | цитата
Пробуй отсюда: http://www.uafile.org/539532
карма: 26

1
Голосовали:Net2Com
Ответов: 4621
Рейтинг: 746
#132: 2015-05-06 18:18:38 ЛС | профиль | цитата
Выложена обновленная версия компонентов

Изменения
1) Более экономное использование параллельных потоков сервером и клиентом
2) Убраны свойства параметров задержки приема, точка Socket
3) Добавлено свойство OverSend
4) Убран 3 пункт из свойства AsyncEvents. Свойство может принимать значения True, False.
Внимание: перед установкой компонентов в существующих схемах, в которых AsyncEvents=All, нужно установить это свойство в значение AsyncEvents=Receive. Либо после установки открыть схему блокнотом и заменить AsyncEvents=2 на AsyncEvents=1. Иначе будет ошибка среды при работе со схемой.
5) В сервере точка CurIPAddress заполняется только на момент событий onClientConnect и onEnumClients
6) onDisconnect происходит также при отключении клиента по doDisconnect/doClose/doCloseAll
7) Полностью переработан внутренний код компонентов, по ходу могли быть исправлены ошибки (или добавлены новые )


Технические подробности

Предыдущие версии использовали следующий подход при работе с соединениями: на каждое входящее подключение сервер создавал один поток для приема данных. При асинхронной отправке для каждого соединения также создавались по одному потоку, отправляющему данные. Если к примеру у сервера есть 500 подключений, то у приложения было запущено 502 потока (на каждое соединение + поток, ожидающий новых подключений, и главный поток).
Если пользователь выполнил бы метод doSendAllAsync, создавалось ещё 500 потоков для отправки. Это был самый простой способ реализации компонентов, но неэффективный.

В новой версии используются менеджеры прослушивания и отправки. Теперь для приема входящих данных создаётся один поток на каждые 64 соединения. Тогда на 6400 соединений будет всего 100 потоков.
Для отправки данных также используется один поток на группу соединений. Максимальное количество потоков отправки жестко задано в коде (в данный момент 5).
Таким образом независимо от количества соединений в сервере методы doSendAllAsync и doSendAsync запустят не более 5 потоков. Небольшой минус - поскольку каждый поток отправляет данные своим соединениям последовательно в цикле, то задержка отправки в одном из соединений затормозит отправку и остальным из данного потока.
Все экземпляры серверов и клиентов в одном приложении пользуются общими потоками приема и отправки.

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

карма: 26

3
Голосовали:flint2, Konst, Net2Com
Ответов: 655
Рейтинг: 18
#133: 2015-05-06 22:18:47 ЛС | профиль | цитата
Netspirit,
5) В сервере точка CurIPAddress заполняется только на момент событий onClientConnect и onEnumClients -а при поступлении данных от клиента??
6) onDisconnect происходит также при отключении клиента по doDisconnect/doClose/doCloseAll т.е. теперь не нужно вешать Memo на onReceive?


В новой версии используются менеджеры прослушивания и отправки. Теперь для приема входящих данных создаётся один поток на каждые 64 соединения. Тогда на 6400 соединений будет всего 100 потоков.
Для отправки данных также используется один поток на группу соединений. Максимальное количество потоков отправки жестко задано в коде (в данный момент 5).

можно для себя сделать 20 соединений на 1 поток и количество потоков увеличить с 5 до 15? или в "жестко при жестко зашито в коде"?



карма: 0

0
Ответов: 4621
Рейтинг: 746
#134: 2015-05-07 08:10:42 ЛС | профиль | цитата
Gunnman писал(а):
а при поступлении данных от клиента?
IP адрес - это только справочная информация и при "поступлении данных", как и при других событиях, роли не играет. Для любой серьёзной программы все равно нужно вести учет соединений (в таблице, как в примере TCPServer, или в динамическом мультике) для хранения специфичных данных. Там же можно сохранить адрес.

Gunnman писал(а):
т.е. теперь не нужно вешать Memo на onReceive?
Не понял, какая связь между событием onDisconnect и onReceive. Основной смысл был в том, что по onDisconnect обычно выполняется некоторая очистка всего связанного с соединением и при ручном doDisconnect нужно было тянуть вторую связь к этой очистке (особенно это неудобно, когда соединение уже было отключено).

Gunnman писал(а):
можно для себя сделать 20 соединений
Там в TCPClientServer.pas есть константы с описанием. Можно править.

Редактировалось 2 раз(а), последний 2018-11-12 12:20:52
карма: 26

0
Ответов: 655
Рейтинг: 18
#135: 2015-05-07 15:27:39 ЛС | профиль | цитата
Netspirit, по CurIpAdress я понял) перепутал с CurClientID, ночная работа, мозги заплыли)


По поводу onDisconnect чуть выше на данной странице я спрашивал почему не происходит onDisconnect (схема там тоже имеется), вы сказали:

Netspirit писал(а):
Конкретно в данном случае там в коде стоит такая заглушка: если событие onReceive не подключено, то и ожидание данных нет смысла включать. Вот и получился такой побочный эффект. То-есть, достаточно вцепить Memory/DoData на выход onReceive. То же самое касается сервера.


Вот я и спросил, требуется ли на обновленных компонентах "Memory/DoData на выход onReceive" или нет?
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)