-
Здравствуйте.
Есть такая задача:
Надо сделать сервер который будет являться клиентом к другим серверам.
Тоесть один клиент может передавать данные через сервер другим серверам(нечто вроде свитча), протокол текстовый.
Получиться ли с помощью компонентов Indy 10 реализовать такую схему и как правильно это сделать?
Я вижу ее примерно так:
TIdTCPServer принимает клиентов и с помощью TIdTCPClient коммутирует то что передает клиент в соответствии с тем кому предназначен пакет.
-
Для такой задачи лучше подойдут компоненты IdcmdTcpServer и IdcmdTcpClient.
Эти компоненты работают в паре, т.е. на клиенте и сервере размещаем по одному компоненту.
Насчет как именно клиент будет взаимодействовать с другими клиентами через сервер, стоит подумать.
Вариант1
клиент авторизуется на сервере и получает список адресов (клиентов онлайн) . Если возникает необходимость отправить сообщение, то оно посылается напрямую клиенту, минуя "главный" сервер.
С таким подходом придется через определенный интервал опрашивать сервер, чтобы получить актуальный IP лист.
Т.е. список тех клиентов с которыми вы работаете, чтобы удостоверится в их доступности. Если возникает необходимость запросить весь список, лучше это реализвать в отдельной команде.
Плюсы такой организации:
1) клиент передает контент (сообщения, файлы) напрямую клиенту. Это избавит от ненужной загруженности главного сервера.
Вариант2
Клиент авторизуется на сервере и запрашивает доступность "ников" (клиентов), которые ему необходимы.
Сервер обрабатывает запрос и посылает ответ.
Плюсы:
1)Сервер полностью контролирует переписку и транспортировку файлов.
(Ничего не скроется от всевидящего ока админа).
Сервер вправе не пропустить сообщение или файл, если оно (он) выходит за рамки цензуры...
Недостатки:
1)Сервер более загружен. Оптимизация кода потребует более тщательного анализа.
-
> Как правильно реализовать сервер одновременно являющимся
> клиентом
Критерии "правильности" как всегда не озвучены.
Browser - WebSnap - WebService - DB-Server
это "правильно"?
-
Это называется прокси-сервер...
-
Уточню задачу:
есть 30-50 клиентов и 10 серверов(провайдеров), между ними сервер который должен обеспечить доступ каждому клиенту к каждому провайдеру.
Чтоб не делать для каждого клиента соединение с каждым сервером, думаю надо делать для каждого сервера стек входящих сообщений и исходящих, чтоб можно было пользоваться одним соединением. Вот только как правильно обрабатывать этот стэк в свете поточности сервера.
И еще в свете того что по Indy 10 мало инфы поясните кто-нибудь TIdTCPServer сам создает потоки для новых соединений или же у него нити(в терминологии книжки погружение в инди)?
-
2 Slym:
Я бы все таки сказал что это маршрутизатор.
-
маршрутизатор работает на более низком уровне OSI чем TCP...
кроме того термины сервер и провайдер очень разные
сервер - устройство с уникальным адресом обслуживающее остальное адресное пространство (многие к одному)
провайдер - сеть со своим локальным адресным пространством предоставляющее доступ к остальному адресному пространству... дырочка пользователя к множеству серверов (один ко многим)
маршрутизировать можно 10 провайдеров при условии что их внутренняя адресация различна, а вот глобал просто на 10 не разделить
мутная задача.
-
> в свете того что по Indy 10 мало инфы
Дальше можно не продолжать, совершенно не интересный базар пошёл..
PS. Зачем оно тебе, это программирование? Найми лучше программиста.
-
То то я смотрю весь инет завален вопросами где взять инфу по 10 инди, примеров и тех нет. Я скомпилил те что с сайте их, так вот ставишь у клиента больше одного потока и приложение виснет. С одним потоком работает, чудеса.
Ковырять исходники библиотеки конечно можно, но больно долго получиться.
Я смотрю нынче все с пеленок мега-программисты, сразу все знают.
2 Slym: Что вы так к терминам зациклились, маршрутизатор это не только Cisco, я же сказал на подобие. провайдер - тоже не более чем условный термин, имелось ввиду провайдер каких то услуг подключаться надо к его серверу.
-
Посоветуйте хотя бы книжку именно по 10 инди с примерами.
А то чувствую теория будет расходиться с практической реализацией.
-
> ставишь у клиента больше одного потока и приложение виснет
дедлоки, может? критических секций не хватает где-то?
-
> Я смотрю нынче все с пеленок мега-программисты, сразу все
> знают.
Да, тяжело вам, дворникам, да сантехникам, пробить в непыльные производства. Все так и норовят багов в свои компоненты навстраивать, а ваши провильные суперпроги потом не работают.
-
> DaGuTa (20.02.2011 11:14:08) [8]
Примеров не просто много, а очень много, а толку мало.
Кроме у тебя вообще проблема не с Инди, а с потоками.
-
2 clickmaker:
Пример скачан с сайта проекта Indy !!!
2 Плохиш:
Да я то разберусь и напишу, и работать будет! Благо мозги на месте. А вам смотрю чисто пописать хочется? Когда нечего сказать лучше промолчать.
-
2 Anatoly Podgoretsky:
Подскажите тогда примеры по использованию TIdNitify и TIdLogFile?
-
> Пример скачан с сайта проекта Indy !!!
а там марсиане пишут? Такие же люди, тоже могут лажануться. На то ты и программер, чтоб не тупо копипастить примеры
-
> есть 30-50 клиентов и 10 серверов(провайдеров), между ними
> сервер который должен обеспечить доступ каждому клиенту
> к каждому провайдеру.
Сервера-провайдеры можно править? Или нужно именно вот такую проксю делать?
На каждое входящее соединение TIdTCPServer создаёт отдельный поток.
Если все исходящие потоки на провайдеров заняты - ждём освобождения, придерживая входящий поток (если по тайм-ауту отвалиться - ну то не судьба).
Как только какой-то исходящий поток освободился - 'берём на обслуживание' очередной входящий, перенаправляя информацию в обе стороны.
Всю обработку вести в OnExecute. Там можно придерживать потоки (не выходя из обработчика OnExecute). Чем? Не знаю. С синхронизацией нужно что-то думать.
Я обращаюсь к потокам так: TIdYarnOfThread(AContext.Yarn).Thread. Можно список активных где-то запоминать.
> Подскажите тогда примеры по использованию TIdNitify и TIdLogFile?
Гугл в помощь. Я с TIdLogFile по сырцам разбирался - там немного.