powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент-серверное приложение
25 сообщений из 53, страница 2 из 3
Клиент-серверное приложение
    #39535191
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

отправка данных клиентом серверу - IdTCPClient.IOHandler.Write
аналогично чтение :-) только я выставляю таймаут на чтение 1 мс, и на всякий случай дополнительно проверяю наличие данных в буфере приема перед чтением
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535199
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

Так в том и дело
Я отправляю команду на сервер, а ответ от него может придти, например, через минуту
И в эту минуту может быть послано ещё несколько асинхронных команд

А в TIdTCPClient фигурирует LastCmdResult или любое другое синхронное ожидание результата
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535218
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

При такой асинхронной работе, тут только сохранять контекст. Как?.. Вариантов много... очередь команд/ответов. Маркировка команд/ответов. Вобщем простор для фантазии.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535234
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

добавь на клиенте класс-очередь команд, например список типа "[команда][статус_отправки][статус_приема]"
отправил команду, установил статус [статус_отправки]
получил команду, нашел ее в своем списке очереди, отметил что получил, обработал как надо и потом удалил из очереди

На сервере все тоже самое, только там можно данные сессии с клиентом хранить в поле Data контекста
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535237
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДа, и ты мешаешь в одну кучу разные понятия: сессия и команда
На стороне сервера сессия - это отдельная сущность, живущая, например, 1мин с момента последнего обращения. С определённой периодичностью должен посылаться KeepAlive

Откуда я знаю, как оно у тебя в голове там задумано :) Делай, как писали. Клиент подключился - кинул состояние/событие, отключился. Совсем незачем открытое соединение держать и поддерживать. Идентифицировать - токенами/ip/как еще придумаешь.

авторИз приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0).

Никогда за 15+ лет не видел такой проблемы.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535240
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсть такая идея. Но ни разу не использовал, он точно отработает как надо?

Работает. Тоже, впрочем, не единственный вариант.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535245
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonавторИз приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0).

Никогда за 15+ лет не видел такой проблемы.Учитывая специфику работы менеджера потоков Indy, весьма странно, что ты не встречался с такой проблемой. Вот тебе пример этой проблемы: http://www.sql.ru/forum/1076998/tidtcpserver-i-100-zagruzka-processora
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535252
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Indy байты конечно пересылать можно. SOFT, какая у тебя версия Indy? Между 9 и 10 большая разница. В 10 для записи и чтения есть класс TIdIOHandler (по памяти пишу, примерно так), у него много методов, в том числе перегруженных.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535257
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2SOFT FOR YOU,

добавь на клиенте класс-очередь команд, например список типа "[команда][статус_отправки][статус_приема]"
отправил команду, установил статус [статус_отправки]
получил команду, нашел ее в своем списке очереди, отметил что получил, обработал как надо и потом удалил из очереди

На сервере все тоже самое, только там можно данные сессии с клиентом хранить в поле Data контекста

Это понятно
А на уровне сети это как решить?
На каждую команду создавать свой экземпляр IdTcpClient и каждый раз задавать IP/Port?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535278
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

нет, TidTcpClient у тебя один перманетный, т.е. в начале работы программы создал, в конце работы уничтожил.
Твоя задача периодически вызывать read / write у этого компонента. Я использую его внутри отдельного потока, который содержит как TidTcpClient, так и список команд для выполнения
А GUI уже считывает данные не с TidTcpClient, а с этого отдельного потока
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535381
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

Какой-то ущербный вариант. Если в клиенте пришло несколько ответов, как их лучше идентифицировать? Readln работает со строками. Допустим, первая строка - идентификатор команды, вторая строка - ответ. Но если ответ многострочный, тогда что, на Base64 переходить? Наверное, нужно переходить на бинарный формат и читать/писать стрим целиком. А в стриме уже смотреть заголовок, размер и читать по нескольку команд за раз. Такой вариант прокатит? И, кстати, как опрелелить, пришло в TidTcpClient хоть что-то на ответ или ещё нет? Можно ли повесить ожидание ответа на какой-нибудь Event?

Кстати, кто-нибудь пользовался Cmd-вариантами компонент? Я смотрел интерфейс, пока не нашёл, на каком уровне они идентифицируются, отслеживаются возвращаемые значения
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535446
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Indy, как сказали на одном форуме - это синхронные блокирующие сокеты, они вообще не вписываются в событийную модель Windows. Соответственно как получить событие о поступлении данных, лично я не знаю :-) И поэтому пользуюсь вариантом, когда в отдельном потоке постоянно проверяю поступление данных. Зато у Indy есть плюс - код работает во всех ОС, включая Linux (компиляция под которые доступны с 10.2 Токио).

перед проверяй на наличие данных так:
Код: pascal
1.
2.
if not IOHandler.InputBufferIsEmpty then
  LText := IOHandler.Read



Что касается поступления данных, не забывай - это протокол TCP, поэтому всё приходит исключительно в том порядке, в котором отправлено. Поэтому смело можешь придумать свой формат обмена, например каждая строка может иметь формат, как вариант :
{CMD:xxx}{DATA:данные_в_base64}{END}<EOL>
Парсируй на {CMD: и {END} , простор для фантазии неограничен :-)
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535450
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,
Чего ты к строкам прицепился.
Открой для себя ReadStream|WriteStream
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535462
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторУчитывая специфику работы менеджера потоков Indy, весьма странно, что ты не встречался с такой проблемой

Всегда использовал обновленные, некоробочные версии, может поэтому. Сейчас где-то 4-ю использую. Нахожу стабильную в промежуточных релизах - и лет на 5-6 хватает. Проблем с зависанием не видел, но были другие вопросы. Частично сам исправлял.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535467
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКстати, кто-нибудь пользовался Cmd-вариантами компонент?

Я о них писал. Ты ответы вообще читаешь?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535473
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU... Можно ли повесить ожидание ответа на какой-нибудь Event?
...
У меня в нескольких программах клиенты на "чистых" сокетах, т.е. winapi. Вот по этому образцу примерно
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1060#06 (Асинхронный режим, основанный на событиях)
Пришли данные во входной буфер сокета, поток их прочитал.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535480
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62У меня в нескольких программах клиенты на "чистых" сокетах, т.е. winapi. Вот по этому образцу примерно
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1060#06 (Асинхронный режим, основанный на событиях)
У меня - во всех программах. Только режим блокирующий - он мне проще. С тысячами клиентов не работал - не надо было, а до сотен - на каждый клиент свой поток и всё очевидно и просто в блокирующем. Стандартные bind/accept/select/send/recv - больше ничего не требуется. Сделал раз в жизни простейшие обёртки классов (такие, как мне нравятся) сервера и клиента - и всё, просто пользуюсь. Протоколами "обращиваю" при необходимости.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535536
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а с Cmd-компонентами?
В чем там соль?
То что я гуглил - сути не увидел )
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535595
MAndy75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Самый простой сервер 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 не пользуюсь в принципе ...

Как организовать постоянный коннект, легко, выставляем тайм аут побольше, а лучше клиент сам поднимает коннект, если произошел обрыв связи с севером.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535620
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAndy75,

По условию - нельзя использовать сторонние компоненты )
Только стандартные Indy или COM )
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535623
MAndy75
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU, Доброго времени суток!

Не совсем понял, сторонние компоненты, это которые не включены в состав Delphi ???
Это не логично, есть куча примеров когда "сторонние" компоненты включались в состав Delphi следующего выпуска. Думаю в данном случае куда более приоритетно, стабильность, простота и использования, затраченое время на "кодинг" и отладку, есть коненчо и другой вариант это потраченное время на изыски, пробы, поиск ошибок и прочее, прочее (кстати "штатный" компонент, INDY не самый стабильный и быстрый).

Однако, Хосяин Барин.
Успехов!
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535641
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Повторюсь. Соль в том, что можно сделать кучу команд, как на стороне клиента, так и на стороне сервера. Можно к этим командам добавить параметры. Навесить кучу обработчиков. Всё это из коробки, с минимальными правками. У меня на одном приложении так гоняется по 50 команд в две стороны. Если, конечно, так нужно. Если команд 1-2, то, мне кажется, это избыточно.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535652
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Покажи пару примеров. А то я че-то не вкурил ещё
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535668
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

В CommandHandlers набиваешь нужные хендлеры, вот, для примера, параметры одного из множества хендлеров у меня (кусок dfm):

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
      item
        CmdDelimiter = #1
        Command = 'SetTrayHint'
        Disconnect = False
        Name = 'TIdCommandHandler12'
        ParamDelimiter = #1
        ParseParams = True
        Tag = 0
        OnCommand = IdCmdTCPClient1CommandHandlers12Command
      end



Обработчик:

Код: pascal
1.
 CoolTrayIcon1.Hint := ASender.Params[0];



Передатчик (псевдо-код):

Код: pascal
1.
2.
 s := 'SetTrayHint' + #1 + 'Test'
 FCurrContext.Connection.IOHandler.WriteLn(s);
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535673
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там можно и авто-ответы сделать и так - всяко-разно. Смотри хендлеры. Мне то это всё не нужно было. Но, возможно, часть твоей функциональности можно переложить на компоненты.
...
Рейтинг: 0 / 0
25 сообщений из 53, страница 2 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент-серверное приложение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]