Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
Должен быть сервер, поддерживающий много сессий
От каждой сессии могут приходить асинхронные операции
Каждая операция может длиться вечно (условно говоря), дольше периода таймаута

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

Можно ли такое организовать с помощью стандартных IdTCPServer/IdTCPClient? Беглый осмотр интерфейса и соответствующих статей привёл к ощущению, что обмен данными происходит через строки. А как же православные байты и биты данных?
11 окт 17, 05:04    [20859522]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
Да. Каждая операция должна возвращать результат.

Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения
11 окт 17, 05:07    [20859524]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
чччД
Guest
SOFT FOR YOU,

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

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

Гугли "Delphi и Web-сервисы".
11 окт 17, 05:20    [20859525]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 1871
SOFT FOR YOU,

Можешь посмотреть в сторону TIdCmdTCPClient/TIdCmdTCPServer. Возможно тебе хватит одного TIdCmdTCPServer + множества TIdCmdTCPClient. Я такой режим, правда, не использовал никогда. Ну и да - там строки :) Зато сразу есть параметры, можно сразу сделать множество команд. Как мне видится, TIdCmdTCPServer должен потоки разрулить сам.
11 окт 17, 09:07    [20859632]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2149
>> Как организовать такую архитектуру?

SOFT FOR YOU,

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

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


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

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

в Socket.IO для этого используются периодические эхо-запросы от сервера
11 окт 17, 11:53    [20860116]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
schi
Member

Откуда: Москва
Сообщений: 2225
Да как удобно, так и делать. Я с свое время использовал named pipes транспорт, до полутора сотен клиентов вполне успешно обслуживает.
11 окт 17, 12:35    [20860419]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
kealon(Ruslan),

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

makhaon,

Аналогично :)
11 окт 17, 12:59    [20860538]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
DesWind
Member

Откуда:
Сообщений: 49
SOFT FOR YOU,

ИМХО. проще всего взять Indy TCP сервер, там автоматом раскидывается по потокам. Делал как-то сервер сетевого доступа к таблицам(файлам, не через BDE) Paradox. Вроде норм работало.
11 окт 17, 13:12    [20860597]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 1871
SOFT FOR YOU,

Так - а какие там методы? Connect? :) Названия компонент я написал, потоки инди сама разруливает. IOHandler.WriteLn, ReadLn (если нужно назад что-то с сервера утащить). Обычная работа с TCP компонентами Indy, примеров много везде.
На сервере делаешь список команд в CommandHandlers + их обработку. Каждому клиенту будет создан свой поток. Indy лучше обновить, коробочные версии обычно работают так себе.
11 окт 17, 14:08    [20860930]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
vavan
Member

Откуда: Казань
Сообщений: 2852
SOFT FOR YOU
Должен быть сервер, поддерживающий много сессий
От каждой сессии могут приходить асинхронные операции
Каждая операция может длиться вечно (условно говоря), дольше периода таймаута

Как организовать такую архитектуру?
Желательно называйте классы и методы
если внутрикорп может dcom из коробки устроит?
11 окт 17, 14:17    [20860974]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
Ребята, вы не помогаете :)

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

Ещё не понятно, как идентифицировать сессии
На сервере фигурирует TIdContext
Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?
11 окт 17, 23:24    [20862453]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
чччД
Guest
SOFT FOR YOU
Ребята, вы не помогаете :)

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

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

Чё?
11 окт 17, 23:25    [20862455]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
Да, ещё момент
В Execute сервера надо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread?
11 окт 17, 23:35    [20862474]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
Вриолайснериудинейринтлаймус
Guest
Надо создать фиксированный кол во потоков, взаимозависимости от ядер процессора (Распределив ресурсы с другими процессорами). И в них работать уже с данными параллельно. Не удаляя разумеется фиксированные потоки.
11 окт 17, 23:40    [20862486]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 1871
SOFT FOR YOU,

TThread.Synchronize(nil, AMethod); ?
11 окт 17, 23:41    [20862491]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 1871
SOFT FOR YOU,

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


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

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


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

AContext.Binding.PeerIP, AContext.Binding.PeerPort, AContext.Binding.Handle
11 окт 17, 23:48    [20862506]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
makhaon,

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

Правда, это второстепенный вопрос. Ключевой вопрос - асинхронные клиентские запросы и идентификация сессии
11 окт 17, 23:50    [20862514]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
makhaon
AContext.Binding.PeerIP


Окей, на сервере хочется отображать не только IP, но и имя компьютера.
Его передать первой командой после коннекта или можно указать при коннекте?
Или как?
12 окт 17, 00:22    [20862549]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
чччД
Guest
SOFT FOR YOU,

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

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

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

И быстрая - быстрее некуда. :)
12 окт 17, 00:36    [20862554]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
makhaon,

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

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

Так я вижу сессии. И пока вообще не понимаю, как это реализовать )
12 окт 17, 00:44    [20862559]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
чччД,

По условиям задачи могу использовать только те библиотеки и технологии, которые входят в поставку Windows/Delphi )
12 окт 17, 00:46    [20862560]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 156
SOFT FOR YOU,

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

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

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

Да, лично я считаю вывод каждого события сразу в TMemo странным решением))) Лучше хранить лог в каком нить TStringList, в UI главного потока лично я вывожу не чаще 1 го раза в секунду
12 окт 17, 07:23    [20862642]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
SOFT FOR YOU
Member

Откуда:
Сообщений: 2292
asutp2,

Ну типа того )
А асинхронные команды с клиента то как слать? )
12 окт 17, 09:00    [20862725]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
vavan
Member

Откуда: Казань
Сообщений: 2852
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
как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?
не уверен о чем речь но лично я с каждым вызовом от клиента передаю токен ранее полученный им от сервера
12 окт 17, 09:12    [20862736]     Ответить | Цитировать Сообщить модератору
 Re: Клиент-серверное приложение  [new]
vavan
Member

Откуда: Казань
Сообщений: 2852
SOFT FOR YOU
надо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread?
вчера только писал о StaticSynchronize/StaticQueue
12 окт 17, 09:15    [20862748]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Delphi Ответить