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

Как организовать такую архитектуру?
Желательно называйте классы и методы. Плюсом к описанию архитектуры (многопотоки, сессии, идентификаторы команд, ...)

Можно ли такое организовать с помощью стандартных IdTCPServer/IdTCPClient? Беглый осмотр интерфейса и соответствующих статей привёл к ощущению, что обмен данными происходит через строки. А как же православные байты и биты данных?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534395
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да. Каждая операция должна возвращать результат.

Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534396
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

грамотных методов прибивания потоков нет, увы.
Делай потоки, которые будут гарантированно прибиваться сами, когда нужно.
...
...
...
И вроде как ты описал требования к веб-сервисам. Имхо сие самое простое, хотя порой громоздкое (на серверной стороне) - но не обязательно. Ага, небыстрые они, зато быстро реализуются, вся шняга с распараллеливанием скрыта, но доступна, часто в нее никто и не лезет.

Процесс работы весьма схож с созданием клиент-серверных приложений на основе СОМ: на сервере описываешь и реализуешь методы, потом обращаешься к специальному методу сервера и импортируешь интерфейсы, на клиенте обращаешься к методам сервера.
Биты и байты - тоже можно, если невтерпёж.

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

Можешь посмотреть в сторону TIdCmdTCPClient/TIdCmdTCPServer. Возможно тебе хватит одного TIdCmdTCPServer + множества TIdCmdTCPClient. Я такой режим, правда, не использовал никогда. Ну и да - там строки :) Зато сразу есть параметры, можно сразу сделать множество команд. Как мне видится, TIdCmdTCPServer должен потоки разрулить сам.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534535
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>> Как организовать такую архитектуру?

SOFT FOR YOU,

выбрать правильный протокол

например Socket.IO можно посмотреть, там уже продуманы многие вещи


SOFT FOR YOUДа. Каждая операция должна возвращать результат.

Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения
в Socket.IO для этого используются периодические эхо-запросы от сервера
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534574
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да как удобно, так и делать. Я с свое время использовал named pipes транспорт, до полутора сотен клиентов вполне успешно обслуживает.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534616
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan),

А можно с названием классов и методов
И самое главное - как реализовать соответствующий поток (который не только запускает команду, ждёт результата, но и завершается грамотно в случае чего)
Если не сложно, конечно

makhaon,

Аналогично :)
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534628
DesWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

ИМХО. проще всего взять Indy TCP сервер, там автоматом раскидывается по потокам. Делал как-то сервер сетевого доступа к таблицам(файлам, не через BDE) Paradox. Вроде норм работало.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534691
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Так - а какие там методы? Connect? :) Названия компонент я написал, потоки инди сама разруливает. IOHandler.WriteLn, ReadLn (если нужно назад что-то с сервера утащить). Обычная работа с TCP компонентами Indy, примеров много везде.
На сервере делаешь список команд в CommandHandlers + их обработку. Каждому клиенту будет создан свой поток. Indy лучше обновить, коробочные версии обычно работают так себе.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39534703
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUДолжен быть сервер, поддерживающий много сессий
От каждой сессии могут приходить асинхронные операции
Каждая операция может длиться вечно (условно говоря), дольше периода таймаута

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

Штудирую компоненты Indy, про Web-сервисы читаю, про COM
Везде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient?

Ещё не понятно, как идентифицировать сессии
На сервере фигурирует TIdContext
Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535080
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUРебята, вы не помогаете :)

Штудирую компоненты Indy, про Web-сервисы читаю, про COM
Везде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient?

Ещё не понятно, как идентифицировать сессии
На сервере фигурирует TIdContext
Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?
Чё?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535084
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ещё момент
В Execute сервера надо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535088
Надо создать фиксированный кол во потоков, взаимозависимости от ядер процессора (Распределив ресурсы с другими процессорами). И в них работать уже с данными параллельно. Не удаляя разумеется фиксированные потоки.
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535089
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

TThread.Synchronize(nil, AMethod); ?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535092
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

авторВезде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient?

Если источников команд (сессий) на одном клиенте много - то да - на каждую сессию по клиенту.

авторКак получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?

Сырцы кроме доков полезно смотреть :)

AContext.Binding.PeerIP, AContext.Binding.PeerPort, AContext.Binding.Handle
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535094
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Есть такая идея. Но ни разу не использовал, он точно отработает как надо?

Правда, это второстепенный вопрос. Ключевой вопрос - асинхронные клиентские запросы и идентификация сессии
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535100
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaonAContext.Binding.PeerIP

Окей, на сервере хочется отображать не только IP, но и имя компьютера.
Его передать первой командой после коннекта или можно указать при коннекте?
Или как?
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535101
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

У тебя требования нестабильные. Мало говоришь, в смысле.

А тебе "в где" работать надо - в локальной сети или в Интернете?

Если в локалке, то - библиотечка ZeroMQ. И ввод-вывод синхронный и асинхронный, и встроенные очереди, и пересылка "чисто байт", и встроенная идентификация клиента (которая перекрывается, если надо), и даже механизм для завершения ожидающих завершения нитей.
И бесплатно, и документация, и книги, и исходники (на сях, правда, но обозримые), и биндинг для любого языка программирования (а если нет - то очень быстро пишется), и развивается и "сообщество".

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

Да, и ты мешаешь в одну кучу разные понятия: сессия и команда
На стороне сервера сессия - это отдельная сущность, живущая, например, 1мин с момента последнего обращения. С определённой периодичностью должен посылаться KeepAlive

На стороне клиента сессия это в первую очередь состояние: есть коннект/нет. А кроме них должны ходить команды, причём асинхронно, и результаты этих команд тоже должны обрабатываться, в том числе и в случае ошибки.

Так я вижу сессии. И пока вообще не понимаю, как это реализовать )
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535104
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

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

делаешь чтоли тестовое задание для устройств на работу?))

Если нужно использовать либы только из стандартной поставки Delphi, то используй Indy, а именно (как говорилось выше) TIdTcpServer/TIdTcpClient. Напрямую с байтами тоже можно работать, если сильно хочется.

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

Да, лично я считаю вывод каждого события сразу в TMemo странным решением))) Лучше хранить лог в каком нить TStringList, в UI главного потока лично я вывожу не чаще 1 го раза в секунду
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535163
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2,

Ну типа того )
А асинхронные команды с клиента то как слать? )
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535166
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUчитаю, про COM
Везде пишут о синхронной работе клиента. Для асинхронной работы чтоеще читай, он необъятен. например про CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream и вообще разные потоковые модели кома и про Making and Processing Asynchronous Calls ибо "With the release of Microsoft® Windows® 2000, COM objects can support asynchronous calling. When a client makes an asynchronous call, control returns to the client immediately"
SOFT FOR YOUКак получить IP, имя компьютераесли речь опять же о коме то где-то от CoQueryClientBlanket и вокруг
SOFT FOR YOUкак идентифицировать сессииSOFT FOR YOUкак получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?не уверен о чем речь но лично я с каждым вызовом от клиента передаю токен ранее полученный им от сервера
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535171
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUнадо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread?вчера только писал о StaticSynchronize/StaticQueue
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #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
Клиент-серверное приложение
    #39535854
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

Спасибо
Все эти парсинги, дело конечно дело простое, но через текст и символы разделителя
Попытаюсь сделать сложнее, заодно поучу матчасть )
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535863
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Космоса там особого нет - со своей задачей справляются, и ладно. Смотри сам, какие тебе протоколы нужнее )
...
Рейтинг: 0 / 0
Клиент-серверное приложение
    #39535940
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, всё сделал
Поделка оказалась так себе
https://cloud.mail.ru/public/2sxu/atvBtx6hd

Initialize и SendCmd должны выполняться по 30 секунд
GetStatus должен сразу возвращать результат
НО
GetStatus не отрабатывает, пока не отработает Initialize/SendCmd

Если есть у кого какие идеи, как это можно исправить - пишите идеи, так, чисто для расширения кругозора
Собирал под XE8
За код стайл и логику сильно не бейте )
...
Рейтинг: 0 / 0
53 сообщений из 53, показаны все 3 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент-серверное приложение
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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