Конференция "Сети" » Как правильно реализовать сервер одновременно являющимся клиентом
 
  • DaGuTa (19.02.11 13:46) [0]
    Здравствуйте.
    Есть такая задача:
    Надо сделать сервер который будет являться клиентом к другим серверам.
    Тоесть один клиент может передавать данные через сервер другим серверам(нечто вроде свитча), протокол текстовый.
    Получиться ли с помощью компонентов Indy 10 реализовать такую схему и как правильно это сделать?
    Я вижу ее примерно так:
    TIdTCPServer принимает клиентов и с помощью TIdTCPClient коммутирует то что передает клиент в соответствии с тем кому предназначен пакет.
  • salik © (19.02.11 16:01) [1]
    Для такой задачи лучше подойдут компоненты IdcmdTcpServer и IdcmdTcpClient.
    Эти компоненты работают в паре, т.е. на клиенте и сервере размещаем по одному компоненту.
    Насчет как именно клиент будет взаимодействовать с другими клиентами через сервер, стоит подумать.

    Вариант1
    клиент авторизуется на сервере и получает список адресов (клиентов онлайн) . Если возникает необходимость отправить сообщение, то оно посылается напрямую клиенту, минуя "главный" сервер.
    С таким подходом придется через определенный интервал опрашивать сервер, чтобы получить актуальный IP лист.
    Т.е. список тех клиентов с которыми вы работаете, чтобы удостоверится в их доступности. Если возникает необходимость запросить весь список, лучше это реализвать в отдельной команде.
    Плюсы такой организации:
    1) клиент передает контент (сообщения, файлы) напрямую клиенту. Это избавит от ненужной загруженности главного сервера.

    Вариант2
    Клиент авторизуется на сервере и запрашивает доступность "ников" (клиентов), которые ему необходимы.
    Сервер обрабатывает запрос и посылает ответ.
    Плюсы:
    1)Сервер полностью контролирует переписку и транспортировку файлов.
    (Ничего не скроется от всевидящего ока админа).
    Сервер вправе не пропустить сообщение или файл, если оно (он) выходит за рамки цензуры...
    Недостатки:
    1)Сервер более загружен. Оптимизация кода потребует более тщательного анализа.
  • Плохиш © (19.02.11 19:05) [2]

    > Как правильно реализовать сервер одновременно являющимся
    > клиентом

    Критерии "правильности" как всегда не озвучены.

    Browser - WebSnap - WebService - DB-Server



    это "правильно"?
  • Slym © (19.02.11 19:23) [3]
    Это называется прокси-сервер...
  • DaGuTa (19.02.11 19:24) [4]
    Уточню задачу:
    есть 30-50 клиентов и 10 серверов(провайдеров), между ними сервер который должен обеспечить доступ каждому клиенту к каждому провайдеру.
    Чтоб не делать для каждого клиента соединение с каждым сервером, думаю надо делать для каждого сервера стек входящих сообщений и исходящих, чтоб можно было пользоваться одним соединением. Вот только как правильно обрабатывать этот стэк в свете поточности сервера.
    И еще в свете того что по Indy 10 мало инфы поясните кто-нибудь TIdTCPServer сам создает потоки для новых соединений или же у него нити(в терминологии книжки погружение в инди)?
  • DaGuTa (19.02.11 19:26) [5]
    2 Slym:
    Я бы все таки сказал что это маршрутизатор.
  • Slym © (19.02.11 20:40) [6]
    маршрутизатор работает на более низком уровне OSI чем TCP...
    кроме того термины сервер и провайдер очень разные
    сервер - устройство с уникальным адресом обслуживающее остальное адресное пространство (многие к одному)
    провайдер - сеть со своим локальным адресным пространством предоставляющее доступ к остальному адресному пространству... дырочка пользователя к множеству серверов (один ко многим)

    маршрутизировать можно 10 провайдеров при условии что их внутренняя адресация различна, а вот глобал просто на 10 не разделить

    мутная задача.
  • Плохиш © (19.02.11 21:02) [7]

    > в свете того что по Indy 10 мало инфы

    Дальше можно не продолжать, совершенно не интересный базар пошёл..

    PS. Зачем оно тебе, это программирование? Найми лучше программиста.
  • DaGuTa (20.02.11 11:14) [8]
    То то я смотрю весь инет завален вопросами где взять инфу по 10 инди, примеров и тех нет. Я скомпилил те что с сайте их, так вот ставишь у клиента больше одного потока и приложение виснет. С одним потоком работает, чудеса.
    Ковырять исходники библиотеки конечно можно, но больно долго получиться.
    Я смотрю нынче все с пеленок мега-программисты, сразу все знают.

    2 Slym: Что вы так к терминам зациклились, маршрутизатор это не только Cisco, я же сказал на подобие. провайдер - тоже не более чем условный термин, имелось ввиду провайдер каких то услуг подключаться надо к его серверу.
  • DaGuTa (20.02.11 12:09) [9]
    Посоветуйте хотя бы книжку именно по 10 инди с примерами.
    А то чувствую теория будет расходиться с практической реализацией.
  • clickmaker © (20.02.11 13:29) [10]
    > ставишь у клиента больше одного потока и приложение виснет

    дедлоки, может? критических секций не хватает где-то?
  • Плохиш © (20.02.11 13:51) [11]

    > Я смотрю нынче все с пеленок мега-программисты, сразу все
    > знают.

    Да, тяжело вам, дворникам, да сантехникам, пробить в непыльные производства. Все так и норовят багов в свои компоненты навстраивать, а ваши провильные суперпроги потом не работают.
  • Anatoly Podgoretsky © (20.02.11 14:17) [12]
    > DaGuTa  (20.02.2011 11:14:08)  [8]

    Примеров не просто много, а очень много, а толку мало.

    Кроме у тебя вообще проблема не с Инди, а с потоками.
  • DaGuTa (20.02.11 18:00) [13]
    2 clickmaker:
    Пример скачан с сайта проекта Indy !!!

    2 Плохиш:
    Да я то разберусь и напишу, и работать будет! Благо мозги на месте. А вам смотрю чисто пописать хочется? Когда нечего сказать лучше промолчать.
  • DaGuTa (20.02.11 18:18) [14]
    2 Anatoly Podgoretsky:
    Подскажите тогда примеры по использованию TIdNitify и TIdLogFile?
  • clickmaker © (20.02.11 19:17) [15]
    > Пример скачан с сайта проекта Indy !!!

    а там марсиане пишут? Такие же люди, тоже могут лажануться. На то ты и программер, чтоб не тупо копипастить примеры
  • Дмитрий Белькевич (20.02.11 19:32) [16]

    > есть 30-50 клиентов и 10 серверов(провайдеров), между ними
    > сервер который должен обеспечить доступ каждому клиенту
    > к каждому провайдеру.


    Сервера-провайдеры можно править? Или нужно именно вот такую проксю делать?

    На каждое входящее соединение TIdTCPServer создаёт отдельный поток.
    Если все исходящие потоки на провайдеров заняты - ждём освобождения, придерживая входящий поток (если по тайм-ауту отвалиться - ну то не судьба).
    Как только какой-то исходящий поток освободился - 'берём на обслуживание' очередной входящий, перенаправляя информацию в обе стороны.

    Всю обработку вести в OnExecute. Там можно придерживать потоки (не выходя из обработчика OnExecute). Чем? Не знаю. С синхронизацией нужно что-то думать.
    Я обращаюсь к потокам так: TIdYarnOfThread(AContext.Yarn).Thread. Можно список активных где-то запоминать.


    > Подскажите тогда примеры по использованию TIdNitify и TIdLogFile?


    Гугл в помощь. Я с TIdLogFile по сырцам разбирался - там немного.
 
Конференция "Сети" » Как правильно реализовать сервер одновременно являющимся клиентом
Есть новые Нет новых   [134436   +26][b:0][p:0.001]