|
|
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Должен быть сервер, поддерживающий много сессий От каждой сессии могут приходить асинхронные операции Каждая операция может длиться вечно (условно говоря), дольше периода таймаута Как организовать такую архитектуру? Желательно называйте классы и методы. Плюсом к описанию архитектуры (многопотоки, сессии, идентификаторы команд, ...) Можно ли такое организовать с помощью стандартных IdTCPServer/IdTCPClient? Беглый осмотр интерфейса и соответствующих статей привёл к ощущению, что обмен данными происходит через строки. А как же православные байты и биты данных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 05:04:35 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Да. Каждая операция должна возвращать результат. Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 05:07:55 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, грамотных методов прибивания потоков нет, увы. Делай потоки, которые будут гарантированно прибиваться сами, когда нужно. ... ... ... И вроде как ты описал требования к веб-сервисам. Имхо сие самое простое, хотя порой громоздкое (на серверной стороне) - но не обязательно. Ага, небыстрые они, зато быстро реализуются, вся шняга с распараллеливанием скрыта, но доступна, часто в нее никто и не лезет. Процесс работы весьма схож с созданием клиент-серверных приложений на основе СОМ: на сервере описываешь и реализуешь методы, потом обращаешься к специальному методу сервера и импортируешь интерфейсы, на клиенте обращаешься к методам сервера. Биты и байты - тоже можно, если невтерпёж. Гугли "Delphi и Web-сервисы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 05:20:58 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Можешь посмотреть в сторону TIdCmdTCPClient/TIdCmdTCPServer. Возможно тебе хватит одного TIdCmdTCPServer + множества TIdCmdTCPClient. Я такой режим, правда, не использовал никогда. Ну и да - там строки :) Зато сразу есть параметры, можно сразу сделать множество команд. Как мне видится, TIdCmdTCPServer должен потоки разрулить сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 09:07:46 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
>> Как организовать такую архитектуру? SOFT FOR YOU, выбрать правильный протокол например Socket.IO можно посмотреть, там уже продуманы многие вещи SOFT FOR YOUДа. Каждая операция должна возвращать результат. Меня устроит создавать на каждую клиентскую операцию свой поток, дожидаться ответа (или обрабатывать ошибку) и делать что-то с этим ответом/ошибкой. Но должен быть грамотный механизм прибивания таких потоков в случае, например, завершения приложения в Socket.IO для этого используются периодические эхо-запросы от сервера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 11:53:02 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Да как удобно, так и делать. Я с свое время использовал named pipes транспорт, до полутора сотен клиентов вполне успешно обслуживает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:35:58 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), А можно с названием классов и методов И самое главное - как реализовать соответствующий поток (который не только запускает команду, ждёт результата, но и завершается грамотно в случае чего) Если не сложно, конечно makhaon, Аналогично :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 12:59:55 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, ИМХО. проще всего взять Indy TCP сервер, там автоматом раскидывается по потокам. Делал как-то сервер сетевого доступа к таблицам(файлам, не через BDE) Paradox. Вроде норм работало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 13:12:45 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Так - а какие там методы? Connect? :) Названия компонент я написал, потоки инди сама разруливает. IOHandler.WriteLn, ReadLn (если нужно назад что-то с сервера утащить). Обычная работа с TCP компонентами Indy, примеров много везде. На сервере делаешь список команд в CommandHandlers + их обработку. Каждому клиенту будет создан свой поток. Indy лучше обновить, коробочные версии обычно работают так себе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 14:08:47 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUДолжен быть сервер, поддерживающий много сессий От каждой сессии могут приходить асинхронные операции Каждая операция может длиться вечно (условно говоря), дольше периода таймаута Как организовать такую архитектуру? Желательно называйте классы и методыесли внутрикорп может dcom из коробки устроит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 14:17:15 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Ребята, вы не помогаете :) Штудирую компоненты Indy, про Web-сервисы читаю, про COM Везде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient? Ещё не понятно, как идентифицировать сессии На сервере фигурирует TIdContext Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:24:46 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUРебята, вы не помогаете :) Штудирую компоненты Indy, про Web-сервисы читаю, про COM Везде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient? Ещё не понятно, как идентифицировать сессии На сервере фигурирует TIdContext Как получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера? Чё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:25:59 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Да, ещё момент В Execute сервера надо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:35:32 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Надо создать фиксированный кол во потоков, взаимозависимости от ядер процессора (Распределив ресурсы с другими процессорами). И в них работать уже с данными параллельно. Не удаляя разумеется фиксированные потоки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:40:13 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, TThread.Synchronize(nil, AMethod); ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:41:38 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, авторВезде пишут о синхронной работе клиента. Для асинхронной работы что, для каждой команды нужно создавать свой TIdTCPClient? Если источников команд (сессий) на одном клиенте много - то да - на каждую сессию по клиенту. авторКак получить IP, имя компьютера, как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера? Сырцы кроме доков полезно смотреть :) AContext.Binding.PeerIP, AContext.Binding.PeerPort, AContext.Binding.Handle ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:48:39 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaon, Есть такая идея. Но ни разу не использовал, он точно отработает как надо? Правда, это второстепенный вопрос. Ключевой вопрос - асинхронные клиентские запросы и идентификация сессии ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.10.2017, 23:50:47 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaonAContext.Binding.PeerIP Окей, на сервере хочется отображать не только IP, но и имя компьютера. Его передать первой командой после коннекта или можно указать при коннекте? Или как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 00:22:42 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, У тебя требования нестабильные. Мало говоришь, в смысле. А тебе "в где" работать надо - в локальной сети или в Интернете? Если в локалке, то - библиотечка ZeroMQ. И ввод-вывод синхронный и асинхронный, и встроенные очереди, и пересылка "чисто байт", и встроенная идентификация клиента (которая перекрывается, если надо), и даже механизм для завершения ожидающих завершения нитей. И бесплатно, и документация, и книги, и исходники (на сях, правда, но обозримые), и биндинг для любого языка программирования (а если нет - то очень быстро пишется), и развивается и "сообщество". И быстрая - быстрее некуда. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 00:36:28 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaon, Да, и ты мешаешь в одну кучу разные понятия: сессия и команда На стороне сервера сессия - это отдельная сущность, живущая, например, 1мин с момента последнего обращения. С определённой периодичностью должен посылаться KeepAlive На стороне клиента сессия это в первую очередь состояние: есть коннект/нет. А кроме них должны ходить команды, причём асинхронно, и результаты этих команд тоже должны обрабатываться, в том числе и в случае ошибки. Так я вижу сессии. И пока вообще не понимаю, как это реализовать ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 00:44:31 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
чччД, По условиям задачи могу использовать только те библиотеки и технологии, которые входят в поставку Windows/Delphi ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 00:46:04 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#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, 07:23:17 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2, Ну типа того ) А асинхронные команды с клиента то как слать? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 09:00:26 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#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как получить/присвоить идентификатор, чтобы связать с сущностью на стороне сервера?не уверен о чем речь но лично я с каждым вызовом от клиента передаю токен ранее полученный им от сервера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 09:12:11 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOUнадо бы делать синхронизированный вывод в мемо, Synchronize надо делать, но где брать текущий TThread?вчера только писал о StaticSynchronize/StaticQueue ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 09:15:16 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, отправка данных клиентом серверу - IdTCPClient.IOHandler.Write аналогично чтение :-) только я выставляю таймаут на чтение 1 мс, и на всякий случай дополнительно проверяю наличие данных в буфере приема перед чтением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 09:56:21 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2, Так в том и дело Я отправляю команду на сервер, а ответ от него может придти, например, через минуту И в эту минуту может быть послано ещё несколько асинхронных команд А в TIdTCPClient фигурирует LastCmdResult или любое другое синхронное ожидание результата ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:11:17 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, При такой асинхронной работе, тут только сохранять контекст. Как?.. Вариантов много... очередь команд/ответов. Маркировка команд/ответов. Вобщем простор для фантазии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:29:18 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, добавь на клиенте класс-очередь команд, например список типа "[команда][статус_отправки][статус_приема]" отправил команду, установил статус [статус_отправки] получил команду, нашел ее в своем списке очереди, отметил что получил, обработал как надо и потом удалил из очереди На сервере все тоже самое, только там можно данные сессии с клиентом хранить в поле Data контекста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:53:27 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторДа, и ты мешаешь в одну кучу разные понятия: сессия и команда На стороне сервера сессия - это отдельная сущность, живущая, например, 1мин с момента последнего обращения. С определённой периодичностью должен посылаться KeepAlive Откуда я знаю, как оно у тебя в голове там задумано :) Делай, как писали. Клиент подключился - кинул состояние/событие, отключился. Совсем незачем открытое соединение держать и поддерживать. Идентифицировать - токенами/ip/как еще придумаешь. авторИз приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0). Никогда за 15+ лет не видел такой проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 10:59:05 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторЕсть такая идея. Но ни разу не использовал, он точно отработает как надо? Работает. Тоже, впрочем, не единственный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:00:37 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaonавторИз приколов Indy это необходимость использования Sleep(0) в обработке контекста на сервере, иначе сервер при 0 кол-ве соединений может занимать 100% процессорного времени (это происходит, когда хотя бы один клиент подключается, потом отключается, и по факту соединений становится 0). Никогда за 15+ лет не видел такой проблемы.Учитывая специфику работы менеджера потоков Indy, весьма странно, что ты не встречался с такой проблемой. Вот тебе пример этой проблемы: http://www.sql.ru/forum/1076998/tidtcpserver-i-100-zagruzka-processora ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:08:24 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
В Indy байты конечно пересылать можно. SOFT, какая у тебя версия Indy? Между 9 и 10 большая разница. В 10 для записи и чтения есть класс TIdIOHandler (по памяти пишу, примерно так), у него много методов, в том числе перегруженных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:14:42 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2SOFT FOR YOU, добавь на клиенте класс-очередь команд, например список типа "[команда][статус_отправки][статус_приема]" отправил команду, установил статус [статус_отправки] получил команду, нашел ее в своем списке очереди, отметил что получил, обработал как надо и потом удалил из очереди На сервере все тоже самое, только там можно данные сессии с клиентом хранить в поле Data контекста Это понятно А на уровне сети это как решить? На каждую команду создавать свой экземпляр IdTcpClient и каждый раз задавать IP/Port? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:22:10 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, нет, TidTcpClient у тебя один перманетный, т.е. в начале работы программы создал, в конце работы уничтожил. Твоя задача периодически вызывать read / write у этого компонента. Я использую его внутри отдельного потока, который содержит как TidTcpClient, так и список команд для выполнения А GUI уже считывает данные не с TidTcpClient, а с этого отдельного потока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 11:49:22 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
asutp2, Какой-то ущербный вариант. Если в клиенте пришло несколько ответов, как их лучше идентифицировать? Readln работает со строками. Допустим, первая строка - идентификатор команды, вторая строка - ответ. Но если ответ многострочный, тогда что, на Base64 переходить? Наверное, нужно переходить на бинарный формат и читать/писать стрим целиком. А в стриме уже смотреть заголовок, размер и читать по нескольку команд за раз. Такой вариант прокатит? И, кстати, как опрелелить, пришло в TidTcpClient хоть что-то на ответ или ещё нет? Можно ли повесить ожидание ответа на какой-нибудь Event? Кстати, кто-нибудь пользовался Cmd-вариантами компонент? Я смотрел интерфейс, пока не нашёл, на каком уровне они идентифицируются, отслеживаются возвращаемые значения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 14:11:12 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Indy, как сказали на одном форуме - это синхронные блокирующие сокеты, они вообще не вписываются в событийную модель Windows. Соответственно как получить событие о поступлении данных, лично я не знаю :-) И поэтому пользуюсь вариантом, когда в отдельном потоке постоянно проверяю поступление данных. Зато у Indy есть плюс - код работает во всех ОС, включая Linux (компиляция под которые доступны с 10.2 Токио). перед проверяй на наличие данных так: Код: pascal 1. 2. Что касается поступления данных, не забывай - это протокол TCP, поэтому всё приходит исключительно в том порядке, в котором отправлено. Поэтому смело можешь придумать свой формат обмена, например каждая строка может иметь формат, как вариант : {CMD:xxx}{DATA:данные_в_base64}{END}<EOL> Парсируй на {CMD: и {END} , простор для фантазии неограничен :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:20:48 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Чего ты к строкам прицепился. Открой для себя ReadStream|WriteStream ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:25:51 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторУчитывая специфику работы менеджера потоков Indy, весьма странно, что ты не встречался с такой проблемой Всегда использовал обновленные, некоробочные версии, может поэтому. Сейчас где-то 4-ю использую. Нахожу стабильную в промежуточных релизах - и лет на 5-6 хватает. Проблем с зависанием не видел, но были другие вопросы. Частично сам исправлял. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:36:21 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
авторКстати, кто-нибудь пользовался Cmd-вариантами компонент? Я о них писал. Ты ответы вообще читаешь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:40:35 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU... Можно ли повесить ожидание ответа на какой-нибудь Event? ... У меня в нескольких программах клиенты на "чистых" сокетах, т.е. winapi. Вот по этому образцу примерно http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1060#06 (Асинхронный режим, основанный на событиях) Пришли данные во входной буфер сокета, поток их прочитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:50:18 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
s62У меня в нескольких программах клиенты на "чистых" сокетах, т.е. winapi. Вот по этому образцу примерно http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=1060#06 (Асинхронный режим, основанный на событиях) У меня - во всех программах. Только режим блокирующий - он мне проще. С тысячами клиентов не работал - не надо было, а до сотен - на каждый клиент свой поток и всё очевидно и просто в блокирующем. Стандартные bind/accept/select/send/recv - больше ничего не требуется. Сделал раз в жизни простейшие обёртки классов (такие, как мне нравятся) сервера и клиента - и всё, просто пользуюсь. Протоколами "обращиваю" при необходимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 15:57:01 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Ну а с Cmd-компонентами? В чем там соль? То что я гуглил - сути не увидел ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 17:05:52 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Самый простой сервер 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 не пользуюсь в принципе ... Как организовать постоянный коннект, легко, выставляем тайм аут побольше, а лучше клиент сам поднимает коннект, если произошел обрыв связи с севером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 18:11:59 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
MAndy75, По условию - нельзя использовать сторонние компоненты ) Только стандартные Indy или COM ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 19:01:31 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Доброго времени суток! Не совсем понял, сторонние компоненты, это которые не включены в состав Delphi ??? Это не логично, есть куча примеров когда "сторонние" компоненты включались в состав Delphi следующего выпуска. Думаю в данном случае куда более приоритетно, стабильность, простота и использования, затраченое время на "кодинг" и отладку, есть коненчо и другой вариант это потраченное время на изыски, пробы, поиск ошибок и прочее, прочее (кстати "штатный" компонент, INDY не самый стабильный и быстрый). Однако, Хосяин Барин. Успехов! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 19:11:37 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, Повторюсь. Соль в том, что можно сделать кучу команд, как на стороне клиента, так и на стороне сервера. Можно к этим командам добавить параметры. Навесить кучу обработчиков. Всё это из коробки, с минимальными правками. У меня на одном приложении так гоняется по 50 команд в две стороны. Если, конечно, так нужно. Если команд 1-2, то, мне кажется, это избыточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 19:46:36 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaon, Покажи пару примеров. А то я че-то не вкурил ещё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 20:10:02 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
SOFT FOR YOU, В CommandHandlers набиваешь нужные хендлеры, вот, для примера, параметры одного из множества хендлеров у меня (кусок dfm): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Обработчик: Код: pascal 1. Передатчик (псевдо-код): Код: pascal 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 20:39:49 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Там можно и авто-ответы сделать и так - всяко-разно. Смотри хендлеры. Мне то это всё не нужно было. Но, возможно, часть твоей функциональности можно переложить на компоненты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.10.2017, 20:47:32 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
makhaon, Спасибо Все эти парсинги, дело конечно дело простое, но через текст и символы разделителя Попытаюсь сделать сложнее, заодно поучу матчасть ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2017, 10:32:30 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Космоса там особого нет - со своей задачей справляются, и ладно. Смотри сам, какие тебе протоколы нужнее ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2017, 10:48:54 |
|
||
|
Клиент-серверное приложение
|
|||
|---|---|---|---|
|
#18+
Короче, всё сделал Поделка оказалась так себе https://cloud.mail.ru/public/2sxu/atvBtx6hd Initialize и SendCmd должны выполняться по 30 секунд GetStatus должен сразу возвращать результат НО GetStatus не отрабатывает, пока не отработает Initialize/SendCmd Если есть у кого какие идеи, как это можно исправить - пишите идеи, так, чисто для расширения кругозора Собирал под XE8 За код стайл и логику сильно не бейте ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.10.2017, 12:34:12 |
|
||
|
|

start [/forum/topic.php?all=1&fid=58&tid=2041718]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
183ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
87ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 529ms |

| 0 / 0 |
