
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
11.10.2017, 05:04:35
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
Должен быть сервер, поддерживающий много сессий От каждой сессии могут приходить асинхронные операции Каждая операция может длиться вечно (условно говоря), дольше периода таймаута Как организовать такую архитектуру? Желательно называйте классы и методы. Плюсом к описанию архитектуры (многопотоки, сессии, идентификаторы команд, ...) Можно ли такое организовать с помощью стандартных IdTCPServer/IdTCPClient? Беглый осмотр интерфейса и соответствующих статей привёл к ощущению, что обмен данными происходит через строки. А как же православные байты и биты данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 05:07:55
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
Да. Каждая операция должна возвращать результат. Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 05:20:58
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, грамотных методов прибивания потоков нет, увы. Делай потоки, которые будут гарантированно прибиваться сами, когда нужно. ... ... ... И вроде как ты описал требования к веб-сервисам. Имхо сие самое простое, хотя порой громоздкое (на серверной стороне) - но не обязательно. Ага, небыстрые они, зато быстро реализуются, вся шняга с распараллеливанием скрыта, но доступна, часто в нее никто и не лезет. Процесс работы весьма схож с созданием клиент-серверных приложений на основе СОМ: на сервере описываешь и реализуешь методы, потом обращаешься к специальному методу сервера и импортируешь интерфейсы, на клиенте обращаешься к методам сервера. Биты и байты - тоже можно, если невтерпёж. Гугли "Delphi и Web-сервисы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 09:07:46
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, Можешь посмотреть в сторону TIdCmdTCPClient/TIdCmdTCPServer. Возможно тебе хватит одного TIdCmdTCPServer + множества TIdCmdTCPClient. Я такой режим, правда, не использовал никогда. Ну и да - там строки :) Зато сразу есть параметры, можно сразу сделать множество команд. Как мне видится, TIdCmdTCPServer должен потоки разрулить сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 11:53:02
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
>> Как организовать такую архитектуру? SOFT FOR YOU, выбрать правильный протокол например Socket.IO можно посмотреть, там уже продуманы многие вещи SOFT FOR YOUДа. Каждая операция должна возвращать результат. Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения в Socket.IO для этого используются периодические эхо-запросы от сервера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 12:35:58
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
Да как удобно, так и делать. Я с свое время использовал named pipes транспорт, до полутора сотен клиентов вполне успешно обслуживает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 12:59:55
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
kealon(Ruslan), А можно с названием классов и методов И самое главное - как реализовать соответствующий поток (который не только запускает команду, ждёт результата, но и завершается грамотно в случае чего) Если не сложно, конечно makhaon, Аналогично :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 13:12:45
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, ИМХО. проще всего взять Indy TCP сервер, там автоматом раскидывается по потокам. Делал как-то сервер сетевого доступа к таблицам(файлам, не через BDE) Paradox. Вроде норм работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 14:08:47
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, Так - а какие там методы? Connect? :) Названия компонент я написал, потоки инди сама разруливает. IOHandler.WriteLn, ReadLn (если нужно назад что-то с сервера утащить). Обычная работа с TCP компонентами Indy, примеров много везде. На сервере делаешь список команд в CommandHandlers + их обработку. Каждому клиенту будет создан свой поток. Indy лучше обновить, коробочные версии обычно работают так себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 14:17:15
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOUДолжен быть сервер, поддерживающий много сессий От каждой сессии могут приходить асинхронные операции Каждая операция может длиться вечно (условно говоря), дольше периода таймаута Как организовать такую архитектуру? Желательно называйте классы и методыесли внутрикорп может dcom из коробки устроит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:24:46
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
Ребята, вы не помогаете :) Штудирую компоненты Indy, про Web-сервисы читаю, про COM Везде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient? Ещё не понятно, как идентифицировать сессии На сервере фигурирует TIdContext Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:25:59
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOUРебята, вы не помогаете :) Штудирую компоненты Indy, про Web-сервисы читаю, про COM Везде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient? Ещё не понятно, как идентифицировать сессии На сервере фигурирует TIdContext Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера? Чё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:35:32
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
Да, ещё момент В Execute сервера надо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:40:13
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
Надо создать фиксированный кол во потоков, взаимозависимости от ядер процессора (Распределив ресурсы с другими процессорами). И в них работать уже с данными параллельно. Не удаляя разумеется фиксированные потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:41:38
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, TThread.Synchronize(nil, AMethod); ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:48:39
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, авторВезде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient? Если источников команд (сессий) на одном клиенте много - то да - на каждую сессию по клиенту. авторКак получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера? Сырцы кроме доков полезно смотреть :) AContext.Binding.PeerIP, AContext.Binding.PeerPort, AContext.Binding.Handle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.10.2017, 23:50:47
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
makhaon, Есть такая идея. Но ни разу не использовал, он точно отработает как надо? Правда, это второстепенный вопрос. Ключевой вопрос - асинхронные клиентские запросы и идентификация сессии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 00:22:42
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
makhaonAContext.Binding.PeerIP Окей, на сервере хочется отображать не только IP, но и имя компьютера. Его передать первой командой после коннекта или можно указать при коннекте? Или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 00:36:28
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, У тебя требования нестабильные. Мало говоришь, в смысле. А тебе "в где" работать надо - в локальной сети или в Интернете? Если в локалке, то - библиотечка ZeroMQ. И ввод-вывод синхронный и асинхронный, и встроенные очереди, и пересылка "чисто байт", и встроенная идентификация клиента (которая перекрывается, если надо), и даже механизм для завершения ожидающих завершения нитей. И бесплатно, и документация, и книги, и исходники (на сях, правда, но обозримые), и биндинг для любого языка программирования (а если нет - то очень быстро пишется), и развивается и "сообщество". И быстрая - быстрее некуда. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 00:44:31
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
makhaon, Да, и ты мешаешь в одну кучу разные понятия: сессия и команда На стороне сервера сессия - это отдельная сущность, живущая, например, 1мин с момента последнего обращения. С определённой периодичностью должен посылаться KeepAlive На стороне клиента сессия это в первую очередь состояние: есть коннект/нет. А кроме них должны ходить команды, причём асинхронно, и результаты этих команд тоже должны обрабатываться, в том числе и в случае ошибки. Так я вижу сессии. И пока вообще не понимаю, как это реализовать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 00:46:04
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
чччД, По условиям задачи могу использовать только те библиотеки и технологии, которые входят в поставку Windows/Delphi ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 07:23:17
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
SOFT FOR YOU, делаешь чтоли тестовое задание для устройств на работу?)) Если нужно использовать либы только из стандартной поставки Delphi, то используй Indy, а именно (как говорилось выше) TIdTcpServer/TIdTcpClient. Напрямую с байтами тоже можно работать, если сильно хочется. У TIdTcpServer делаешь обработку контекста, этого достаточно для идентификации сессии клиента. О клиенте напрямую ты сможешь узнать только его IP и порт подключения, все остальные параметры (нетбиос-компа, имя юзера и т.д.) нужно сообщать клиентом серверу самостоятельно. Из приятного - у контекста соединения на сервере есть поле Data, в котором ты сможешь хранить все дополнительные данные по соединению с данным клиентом (создаешь экземпляр своего нужного класс, присваиваешь ссылку на него в Data, потом при разрыве сессии не забудь память освободить). Из приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0). Да, лично я считаю вывод каждого события сразу в TMemo странным решением))) Лучше хранить лог в каком нить TStringList, в UI главного потока лично я вывожу не чаще 1 го раза в секунду ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 09:00:26
|
|||
|---|---|---|---|
|
|||
Клиент-серверное приложение |
|||
|
#18+
asutp2, Ну типа того ) А асинхронные команды с клиента то как слать? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.10.2017, 09:12:11
|
|||
|---|---|---|---|
Клиент-серверное приложение |
|||
|
#18+
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как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?не уверен о чем речь но лично я с каждым вызовом от клиента передаю токен ранее полученный им от сервера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=58&mobile=1&tid=2041718]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
90ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 222ms |
| total: | 396ms |

| 0 / 0 |
