|
|
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, отправка данных клиентом серверу - IdTCPClient.IOHandler.Write аналогично чтение :-) только я выставляю таймаут на чтение 1 мс, и на всякий случай дополнительно проверяю наличие данных в буфере приема перед чтением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 09:56:21 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2, Так в том и дело Я отправляю команду на сервер, а ответ от него может придти, например, через минуту И в эту минуту может быть послано ещё несколько асинхронных команд А в TIdTCPClient фигурирует LastCmdResult или любое другое синхронное ожидание результата ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:11:17 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, При такой асинхронной работе, тут только сохранять контекст. Как?.. Вариантов много... очередь команд/ответов. Маркировка команд/ответов. Вобщем простор для фантазии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:29:18 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, добавь на клиенте класс-очередь команд, например список типа "[команда][статус_отправки][статус_приема]" отправил команду, установил статус [статус_отправки] получил команду, нашел ее в своем списке очереди, отметил что получил, обработал как надо и потом удалил из очереди На сервере все тоже самое, только там можно данные сессии с клиентом хранить в поле Data контекста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:53:27 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторДа, и ты мешаешь в одну кучу разные понятия: сессия и команда На стороне сервера сессия - это отдельная сущность, живущая, например, 1мин с момента последнего обращения. С определённой периодичностью должен посылаться KeepAlive Откуда я знаю, как оно у тебя в голове там задумано :) Делай, как писали. Клиент подключился - кинул состояние/событие, отключился. Совсем незачем открытое соединение держать и поддерживать. Идентифицировать - токенами/ip/как еще придумаешь. авторИз приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0). Никогда за 15+ лет не видел такой проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:59:05 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторЕсть такая идея. Но ни разу не использовал, он точно отработает как надо? Работает. Тоже, впрочем, не единственный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:00:37 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaonавторИз приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0). Никогда за 15+ лет не видел такой проблемы.Учитывая специфику работы менеджера потоков Indy, весьма странно, что ты не встречался с такой проблемой. Вот тебе пример этой проблемы: http://www.sql.ru/forum/1076998/tidtcpserver-i-100-zagruzka-processora ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:08:24 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
В Indy байты конечно пересылать можно. SOFT, какая у тебя версия Indy? Между 9 и 10 большая разница. В 10 для записи и чтения есть класс TIdIOHandler (по памяти пишу, примерно так), у него много методов, в том числе перегруженных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:14:42 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2SOFT FOR YOU, добавь на клиенте класс-очередь команд, например список типа "[команда][статус_отправки][статус_приема]" отправил команду, установил статус [статус_отправки] получил команду, нашел ее в своем списке очереди, отметил что получил, обработал как надо и потом удалил из очереди На сервере все тоже самое, только там можно данные сессии с клиентом хранить в поле Data контекста Это понятно А на уровне сети это как решить? На каждую команду создавать свой экземпляр IdTcpClient и каждый раз задавать IP/Port? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:22:10 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, нет, TidTcpClient у тебя один перманетный, т.е. в начале работы программы создал, в конце работы уничтожил. Твоя задача периодически вызывать read / write у этого компонента. Я использую его внутри отдельного потока, который содержит как TidTcpClient, так и список команд для выполнения А GUI уже считывает данные не с TidTcpClient, а с этого отдельного потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:49:22 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2, Какой-то ущербный вариант. Если в клиенте пришло несколько ответов, как их лучше идентифицировать? Readln работает со строками. Допустим, первая строка - идентификатор команды, вторая строка - ответ. Но если ответ многострочный, тогда что, на Base64 переходить? Наверное, нужно переходить на бинарный формат и читать/писать стрим целиком. А в стриме уже смотреть заголовок, размер и читать по нескольку команд за раз. Такой вариант прокатит? И, кстати, как опрелелить, пришло в TidTcpClient хоть что-то на ответ или ещё нет? Можно ли повесить ожидание ответа на какой-нибудь Event? Кстати, кто-нибудь пользовался Cmd-вариантами компонент? Я смотрел интерфейс, пока не нашёл, на каком уровне они идентифицируются, отслеживаются возвращаемые значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 14:11:12 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Indy, как сказали на одном форуме - это синхронные блокирующие сокеты, они вообще не вписываются в событийную модель Windows. Соответственно как получить событие о поступлении данных, лично я не знаю :-) И поэтому пользуюсь вариантом, когда в отдельном потоке постоянно проверяю поступление данных. Зато у Indy есть плюс - код работает во всех ОС, включая Linux (компиляция под которые доступны с 10.2 Токио). перед проверяй на наличие данных так: Код: pascal 1. 2. Что касается поступления данных, не забывай - это протокол TCP, поэтому всё приходит исключительно в том порядке, в котором отправлено. Поэтому смело можешь придумать свой формат обмена, например каждая строка может иметь формат, как вариант : {CMD:xxx}{DATA:данные_в_base64}{END}<EOL> Парсируй на {CMD: и {END} , простор для фантазии неограничен :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:20:48 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Чего ты к строкам прицепился. Открой для себя ReadStream|WriteStream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:25:51 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторУчитывая специфику работы менеджера потоков Indy, весьма странно, что ты не встречался с такой проблемой Всегда использовал обновленные, некоробочные версии, может поэтому. Сейчас где-то 4-ю использую. Нахожу стабильную в промежуточных релизах - и лет на 5-6 хватает. Проблем с зависанием не видел, но были другие вопросы. Частично сам исправлял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:36:21 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторКстати, кто-нибудь пользовался Cmd-вариантами компонент? Я о них писал. Ты ответы вообще читаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:40:35 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU... Можно ли повесить ожидание ответа на какой-нибудь Event? ... У меня в нескольких программах клиенты на "чистых" сокетах, т.е. winapi. Вот по этому образцу примерно http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1060#06 (Асинхронный режим, основанный на событиях) Пришли данные во входной буфер сокета, поток их прочитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:50:18 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
s62У меня в нескольких программах клиенты на "чистых" сокетах, т.е. winapi. Вот по этому образцу примерно http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1060#06 (Асинхронный режим, основанный на событиях) У меня - во всех программах. Только режим блокирующий - он мне проще. С тысячами клиентов не работал - не надо было, а до сотен - на каждый клиент свой поток и всё очевидно и просто в блокирующем. Стандартные bind/accept/select/send/recv - больше ничего не требуется. Сделал раз в жизни простейшие обёртки классов (такие, как мне нравятся) сервера и клиента - и всё, просто пользуюсь. Протоколами "обращиваю" при необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:57:01 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Ну а с Cmd-компонентами? В чем там соль? То что я гуглил - сути не увидел ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 17:05:52 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Самый простой сервер http://synapse.ararat.cz/doku.php (но он больше несколькотыс клиентов не потянет, потому как на каждое соединение создает свой поток) Для десятка тысяч клиентов, еще один бесплатный сервер клиент, Internet Component Suite http://www.overbyte.eu/frame_index.html В интеренет куча примеров и описаний http://www.webdelphi.ru/2011/08/rabota-s-internet-component-suite-posle-indy/ Indy не пользуюсь в принципе ... Как организовать постоянный коннект, легко, выставляем тайм аут побольше, а лучше клиент сам поднимает коннект, если произошел обрыв связи с севером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 18:11:59 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
MAndy75, По условию - нельзя использовать сторонние компоненты ) Только стандартные Indy или COM ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 19:01:31 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Доброго времени суток! Не совсем понял, сторонние компоненты, это которые не включены в состав Delphi ??? Это не логично, есть куча примеров когда "сторонние" компоненты включались в состав Delphi следующего выпуска. Думаю в данном случае куда более приоритетно, стабильность, простота и использования, затраченое время на "кодинг" и отладку, есть коненчо и другой вариант это потраченное время на изыски, пробы, поиск ошибок и прочее, прочее (кстати "штатный" компонент, INDY не самый стабильный и быстрый). Однако, Хосяин Барин. Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 19:11:37 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Повторюсь. Соль в том, что можно сделать кучу команд, как на стороне клиента, так и на стороне сервера. Можно к этим командам добавить параметры. Навесить кучу обработчиков. Всё это из коробки, с минимальными правками. У меня на одном приложении так гоняется по 50 команд в две стороны. Если, конечно, так нужно. Если команд 1-2, то, мне кажется, это избыточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 19:46:36 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaon, Покажи пару примеров. А то я че-то не вкурил ещё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 20:10:02 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, В CommandHandlers набиваешь нужные хендлеры, вот, для примера, параметры одного из множества хендлеров у меня (кусок dfm): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Обработчик: Код: pascal 1. Передатчик (псевдо-код): Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 20:39:49 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39535257&tid=2041718]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
200ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 208ms |
| total: | 513ms |

| 0 / 0 |
