Конференция "Сети" » Сервер на TIdTCPServer из Indy10 [D7, WinXP]
 
  • RGV © (08.09.11 11:19) [20]

    > У сервера нет никакой инициативы.

    т.е. сервер должен посылать только тому, чей запрос он в данный момент обслуживает и никому другому?

    Неужели у клиентской программы добавлять таймер и по таймеру узнавать для него сообщения (от клиента, от сервера например об отключении какого то клиента и т.д), а на сервере для каждого клиента делать буфер сообений ?
  • Anatoly Podgoretsky © (08.09.11 11:29) [21]

    > Медвежонок Пятачок ©   (08.09.11 11:08) [17]

    Иначе это не сервер, а спамер.
  • Anatoly Podgoretsky © (08.09.11 11:31) [22]

    > RGV ©   (08.09.11 11:19) [20]

    Надо сменить идеологию, надо что бы клиент стал сервером, а сервер клиентом и всего делов. И никаких таймеров
  • RGV © (08.09.11 11:41) [23]

    > Anatoly Podgoretsky ©   (08.09.11 11:31) [22]


    Издеваетесь?
    А можно по подробней про идеологию?

    Вот бы на исходничек взглянуть "правильного" клиента, и "правильного" сервера, разумеется на Indy.
  • RGV © (08.09.11 11:56) [24]

    > Anatoly Podgoretsky ©   (08.09.11 11:31) [22]

    Я понимаю, что ломать парадигму задача не тривиальная,  все ж таки попробуйте мне объяснить эту вашу идеологию.
  • Anatoly Podgoretsky © (08.09.11 12:03) [25]
    > RGV  (08.09.2011 11:41:23)  [23]

    Считай сам как хочешь, желание что либо отвечать совсем пропало.
  • RGV © (08.09.11 12:06) [26]

    > Anatoly Podgoretsky ©   (08.09.11 12:03) [25]


    Я прошу прощения, если чем вас обидел.
  • DVM © (08.09.11 23:18) [27]

    > Для начала можно попробовать свыкнуться с мыслью, что сервер
    > - это обслуживатель запросов клиента.
    >
    > Нет клиентского запроса - сервер курит.

    Не всегда так. В ряде случаев долбать сервер постоянным опросом со стороны клиентов - накладно слишком, поэтому сервер может уведомлять клиентов сам по собственной инициативе о событиях. Стандартная практика.
    Например, видел такое в интерфейсе Asterisk, в Mailru тоже вроде.


    > Клиент что-то отправил серверу и ждет ответ на посылку.
    > Сервер в это самое время решил что -то наотправлять клиентам.
    >
    >
    > И клиент вместо ответа на одну конкретную команду получает
    > от сервера ответ, никак не связанный с отправленным запросом.
    >

    Каждая посылка серверу должна снабжаться неким уникальным идентификатором, сервер в своих ответах тоже должен приводить тот же идентификатор. Тогда будет ясно какой ответ на какой запрос был.
    Необходимость в последовательной обработке команд отпадает.
    Такой асинхронный протокол обмена тоже часто используется. Для разного рода чатов подходит идеально.
  • DVM © (08.09.11 23:24) [28]
    Т.е в такой асинхронной схеме существует 3 типа посылок:

    1. Команды клиента. Требуют ответа сервера.
    2. Ответы сервера. Высылаются в ответ на команды клиента.
    3. События сервера. Высылаются клиенту. Ответ на них не требуется.
  • DVM © (08.09.11 23:25) [29]
    Да, и Indy для описанного мной не очень подходит. Нужно что-то асинхронное и неблокирующее в идеале. Событийная модель используется.
  • RGV © (09.09.11 04:23) [30]

    > DVM ©   (08.09.11 23:25) [29]

     Спасибо.
     TServerSocket, TClientSocket для этих целей может подойти?
     synapse?
  • DVM © (09.09.11 10:38) [31]

    > RGV ©   (09.09.11 04:23) [30]

    ICS лучше всего
  • Медвежонок Пятачок © (09.09.11 10:47) [32]
    Не всегда так. В ряде случаев долбать сервер постоянным опросом со стороны клиентов - накладно слишком,

    Чем накладно-то?
    У него постоянный коннект клиента и сервер держит его сессию все время пока клиент не выйдет.
    Вся накладность - в количестве байтов гоняемых по сети.
  • DVM © (09.09.11 10:56) [33]

    > Медвежонок Пятачок ©   (09.09.11 10:47) [32]


    > Чем накладно-то?


    > Вся накладность - в количестве байтов гоняемых по сети.

    Сам же ответил. Данные будут гоняться, даже если нет для клиента никаких сообщений. Если клиентов мало - это ерунда конечно, но представь если таким образом сервер будет обслуживать 1000 клиентов. Значительная часть процессорного времени будет уходить только на ответы клиентам что данных нет (причем в большинстве случаев бестолковые). Туда же будет уходить и трафик (иногда критично, например, в случае GPRS). Зачем это все? Не проще ли переломить себя и наделить небольшой инициативой сервер?

    Да, это несколько отличается от поведения классического сервера, но этам модель классического сервера пришла из юникс среды, где все в основном синхронное и блокирующее, так там проще было и прижилось и стало догмой.
  • DVM © (09.09.11 11:01) [34]
    Собственно не зря же придумано множество расширений к стандартным серверам для поддержки так называемых push технологий, когда данные высылаются клиентам по мере их появления, а не по запросам. Типичный пример почта на смартфонах Blackberry. Смартфон всегда на связи с сервером, но постоянных запросов не делает ибо накладно - трафик, сервер сам уведомляет клиента когда данные пришли.
  • Медвежонок Пятачок © (09.09.11 11:18) [35]
    но представь если таким образом сервер будет обслуживать 1000 клиентов.

    Прикинь, не могу.
    В этом кокретном случае.
    Я даже не могу представить, что на предприятии автора когда-то внедрят эту подпорку (если он таки сделает первую альфу)
    Так что ни о каких тысячах речь не идет.
    Речь идет об обмене с его младшей сестрой.
    Пять минут после написания проги.
    Затем сестра снова уйдет во вконтакт со словами "не приставай ко мне со своей ерундой".

    Но так как чел "хочет научиться" - то здесь как раз тот самый случай когда сервер не должен ничего делать кроме обслуживания запросов.
  • DVM © (09.09.11 11:35) [36]

    > Медвежонок Пятачок ©   (09.09.11 11:18) [35]


    > Но так как чел "хочет научиться" - то здесь как раз тот
    > самый случай когда сервер не должен ничего делать кроме
    > обслуживания запросов.

    В данном конкретном случае - это чат. Их делают в 99% случаях так как я описал, достаточно посмотреть на протоколы известных чатов. Почему бы ему не пойти по тому же пути (очевидно более рациональному изначально для этого применения). Чат - это взаимодействие с человеком в основном, поэтому тут событийная модель самое то.

    В другой ситуации возможно надо придерживаться схемы запрос-ответ.
  • Anatoly Podgoretsky © (09.09.11 11:57) [37]
    > DVM  (09.09.2011 10:56:33)  [33]

    Да и постоянное подключение тоже в некоторых случаях накладно, когда
    почасовое подключение.
  • Anatoly Podgoretsky © (09.09.11 11:58) [38]
    > DVM  (09.09.2011 11:01:34)  [34]

    Так делается это методом замены ролей, клиент становится сервером и
    наоборот, но автор это не воспринимает.
  • RGV © (10.09.11 03:46) [39]

    > Anatoly Podgoretsky ©   (09.09.11 11:58) [38]


    Да. Действительно не понимаю как это должно выглядеть не то чтобы на практике, но как это выглядит хотябы схематично.

    В моем понимании сервер - это некая программа которая в ожидании входящих соединений, клиент - это программа которая "подключается" к серверу, и весь обмен информацией между клиентами идет через сервер.
 
Конференция "Сети" » Сервер на TIdTCPServer из Indy10 [D7, WinXP]
Есть новые Нет новых   [134435   +13][b:0][p:0.001]