Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент-серверное приложение / 25 сообщений из 53, страница 1 из 3
11.10.2017, 05:04:35
    #39534394
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент-серверное приложение
Должен быть сервер, поддерживающий много сессий
От каждой сессии могут приходить асинхронные операции
Каждая операция может длиться вечно (условно говоря), дольше периода таймаута

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

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

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

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

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

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

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

SOFT FOR YOU,

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

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


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

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

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

makhaon,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

По условиям задачи могу использовать только те библиотеки и технологии, которые входят в поставку Windows/Delphi )
...
Рейтинг: 0 / 0
12.10.2017, 07:23:17
    #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
12.10.2017, 09:00:26
    #39535163
SOFT FOR YOU
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент-серверное приложение
asutp2,

Ну типа того )
А асинхронные команды с клиента то как слать? )
...
Рейтинг: 0 / 0
12.10.2017, 09:12:11
    #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
12.10.2017, 09:15:16
    #39535171
vavan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Клиент-серверное приложение
SOFT FOR YOUнадо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread?вчера только писал о StaticSynchronize/StaticQueue
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Клиент-серверное приложение / 25 сообщений из 53, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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