Конференция "Сети" » Как получить сигнал от сервера [D7, WinXP]
 
  • Иван Сараев (18.11.12 12:05) [0]
    Я новичок помогите.. На пхп сервере имеется чат в который клиенты на Дельфи добавляют сообщения. Количество сообщений записывается в файл на сервере. Клиенты каждую секунду проверяют этот файл и если количество сообщений изменилось загружают новые сообщения. Но из за частых проверок идет много трафика. Как заставить чтобы сервер сам слал  клиентам сигнал о изменений количества сообщений, и как реализовать на Дельфи прием этого сигнала. Чтобы трафик не шел особо пока нет сигнала от сервера, и чтобы это было надежно
  • brother © (18.11.12 12:51) [1]
    бред а не про сети...
  • Anatoly Podgoretsky © (18.11.12 12:54) [2]
    > Иван Сараев  (18.11.2012 12:05:00)  [0]

    То есть ты хочешь превратить сервер в клиента?
  • brother © (18.11.12 12:56) [3]
    там вообще все на файле)
  • RWolf © (18.11.12 13:23) [4]
    выкинуть всё и поставить Jabber-сервер.
  • DVM © (18.11.12 13:49) [5]

    > Иван Сараев   (18.11.12 12:05) 
    >

    вот в этом направлении можно копать, правда сервер должен поддержку иметь
    http://habrahabr.ru/post/145077/
  • Иван Сараев (18.11.12 15:05) [6]
    Я имел ввиду как сделать чтобы открылся какой то порт у клиента на компьютере и как его прослушивать. Сервер при изменений количества сообщений отправлял бы на этот порт сообщение и все. Мне нужен только пример ожидания сообщения от сервера, слушания порта. На пхп я сам разберусь как подсоединиться к открытому порту и послать сообщение. А вот как реализовать ожидание сообщения на дельфи не знаю. Не ругайтесь сильно все ведь когда то с чего то начинают.
  • Иван Сараев (18.11.12 15:17) [7]
    Насчет АSР не подходит. У меня обычный пхп хостинг. В принципе вся система прекрасно работает единственное что угнетает это постоянные проверки количества сообщений. Я вот думаю сделать так чтобы клиент посылал при подключении свой айпи адрес, а сервер записывал его себе в список а когда клиент отключается удалял из списка. И при изменений количества сообщений чтобы сервер отправлял всем клиентам из списка сигнал через сокеты. А клиенты должны слушать порт на который приходит этот сигнал. По сути клиенты тут становятся мини серверами. Но мне бы кусочек кода как реализовать слушание порта и узнавания пришло ли на него что нибудь или нет
  • DVM © (18.11.12 15:59) [8]

    > Иван Сараев   (18.11.12 15:17) [7]
    > Насчет АSР не подходит. У меня обычный пхп хостинг.

    Причем тут ASP? Я тебе о технологии WebSockets хотел сказать. Это как раз возможность уведомлять клиента о событиях.


    > По сути клиенты тут становятся мини серверами. Но мне бы
    > кусочек кода как реализовать слушание порта и узнавания
    > пришло ли на него что нибудь или нет

    Почти все клиенты сидят за NAT и прокси. Чтобы эта идея работала, надо будет клиентам пробрасывать порты на натах и это далеко не всегда возможно.
  • Иван Сараев (18.11.12 17:03) [9]
    Блин. Я только что нашел кусочки кода, и понял что действительно не получается просто так послать сообщение. Оно попросту не доходит хотя при тестировании на локальном адресе локалхост все нормально. Вы правы просто так это не получится сделать. Печально. Хорошо буду копать в сторону Вебсокетс, или Джабера как советуют
  • Иван Сараев (18.11.12 17:23) [10]
    Хм.. В конце ноября 2010 Adam Barth опубликовал результаты исследования надежности используемого протокола. По его результатам выяснилось, что в случае использования прозрачныхпрокси-серверов, возможна подмена кеша передаваемых данных с тем, что пользователи вместо реальных данных будут получать версию данных от злоумышленника. Проблема оказалась достаточно серьёзной для того, чтобы разработчики Firefox и Opera объявили о том, что в будущих версиях их браузеров поддержка веб-сокетовбудет по умолчанию отключена вплоть до устранения проблемы небезопасности данного протокола (хотя осталась возможность их включить).

    Надеюсь технология не заглохнет

    хотя я так и не понял как ее реализовать на обычном пхп сервере. Продолжаю курить манускрипты
  • Иван Сараев (18.11.12 18:41) [11]
    Сейчас нашел вот точное описание проблемы моей - клиент за натом. а значит сервер не может инициировать соединение с клиентом. а это значит, что клиент должен постоянно опрашивать сервер иначе сервер не сможет"как бы по своей инициативе" отправить сообщение клиенту
  • DVM © (18.11.12 19:28) [12]

    > а это значит, что клиент должен постоянно опрашивать сервер
    > иначе сервер не сможет"как бы по своей инициативе" отправить
    > сообщение клиенту

    или клиент держит соединение постоянно
  • Anatoly Podgoretsky © (18.11.12 19:38) [13]
    > Иван Сараев  (18.11.2012 18:41:11)  [11]

    Неверно, клиент должен обратиться к серверу, а потом сам стать сервером.
    Ты подумай сам как же работают такие штуки как SCYPE, ICQ, торренты из за
    ната
  • Сергей М. © (18.11.12 19:45) [14]

    > Иван Сараев   (18.11.12 12:05)  


    Клиент посылает ajax-запрос (не исключено что с таймайтом ожидания ответа) "жду новые сообщения" и продолжает заниматься своим делом.
    Сервер получает запрос и,  если новые сообщения есть, тут же отвечает на запрос инф-цией о них, иначе ставит запрос в очередь запросов ожидающих ответ. Как только появятся новые сообщения, сервер бежит извлекает из очереди запросы и отвечает на них.
  • Иван Сараев (18.11.12 19:47) [15]
    А можно с этого места поподробнее.. Действительно как они работают из за ната. Я вот создал сервер на основе ТсокетСервер и включил его чтобы он ждал пока в него данные пришлют. Я пробовал открыть сокет на пхп и послать данные на айпишник клиента где был тсокетсервер но данные тупо не пришли. Вот мне тоже интересно. Работает же как то агент аська Итд
  • Иван Сараев (18.11.12 19:53) [16]
    Клиент посылает ajax-запрос (не исключено что с таймайтом ожидания ответа) "жду новые сообщения" и продолжает заниматься своим делом.
    Сервер получает запрос и,  если новые сообщения есть, тут же отвечает на запрос инф-цией о них,иначе ставит запрос в очередь запросов ожидающих ответ. Как только появятся новые сообщения, сервер бежит извлекает из очереди запросы и отвечает на них.

    Отлично. Я это и хочу но проблема что не могу установить сокетное соединение между клиентом и сервером по инициативе сервера. Или что вы имели ввиду под аякс запросом с таймаутом?. Через какие компоненты реализовать подобный запрос и как сделать чтобы клиент ждал ответа сервера какое то время а не сразу возвращал значение, а сервер отвечал чтобы не сразу а только тогда когда нужно уведомить клиента. Я принцип то понял вы хотите чтобы клиент слал сообщение и начинал ожидать ответа а сервер отвечал не сразу а только когда нужно. А как примерно это реализовать подскажите
  • Anatoly Podgoretsky © (18.11.12 19:53) [17]
    > DVM  (18.11.2012 19:28:12)  [12]

    Не всегда возможно. Но в этом случае трафик минимален.
  • Сергей М. © (18.11.12 19:56) [18]

    > Работает же как то агент аська Итд


    В режимах не-P2P они через серверы-посредники работают, для этого серверная часть попросту не нужна.

    А в p2p-режимах и они тоже нихрена не работают, если не позволяет NAT и им запрещены премудрости а-ля UPnP.
  • Сергей М. © (18.11.12 20:01) [19]

    > это и хочу но проблема что не могу установить сокетное соединение
    > между клиентом и сервером по инициативе сервера


    Для этого инициатива сервера вообще не нужна.
    Клиент по своей инициативе либо соединяется с сервером по разовой необходимости либо держит постоянно открытым единожды установленное  соединение.


    > что вы имели ввиду под аякс запросом с таймаутом?


    На примере jQuery
    http://jquery.page2page.ru/index.php5/Ajax-%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81
  • DVM © (18.11.12 20:03) [20]
    Icq точно устанавливает обычное TCP соединение и держит его в течение всего сеанса. Можно снифером поглядеть.
  • Иван Сараев (18.11.12 20:07) [21]
    > DVM  (18.11.2012 19:28:12)

    Постоянное соединение нагрузит сервер.. Но как вариант... :) . Можно попробовать. Спасибо
  • Anatoly Podgoretsky © (18.11.12 20:07) [22]

    > Иван Сараев   (18.11.12 19:47) [15]

    читай
    Сергей М. ©   (18.11.12 20:01) [19]
    При подключение к серверу уже известно куда отвечать
  • Сергей М. © (18.11.12 20:08) [23]

    > Постоянное соединение нагрузит сервер


    С чего бы вдруг ?
  • Иван Сараев (18.11.12 20:19) [24]
    То есть клиент инициализирует соединение.. Периодически отправляет запрос.. И.. Ждет ответа от сервера? А сервер отвечает только когда нужно. Так?
  • Сергей М. © (18.11.12 20:27) [25]
    Cервер отвечает либо сразу, если нет резона напрягать клиента ожиданием, либо отвечает когда ему есть что ответить.
  • DVM © (18.11.12 20:31) [26]

    > Иван Сараев

    если у тебя обычный хостинг то там вряд ли можно запустить сервер
  • Иван Сараев (18.11.12 20:36) [27]
    если у тебя обычный хостинг то там вряд ли можно запустить сервер

    Мда.. Им не резон тратить ресурсы на поддержание кучи соединений с клиентами.. :) вы правы

    придется оставить все как есть
  • Иван Сараев (18.11.12 20:42) [28]
    сервер - это непрерывно выполняющийся скрипт , который просто ждёт подключения клиентов. На хостингах обычно стоит ограничение на время выполнения скрипта :(
  • DVM © (18.11.12 20:46) [29]

    > На хостингах обычно стоит ограничение на время выполнения
    > скрипта :(

    Я об этом и говорю. Надо выделенный виртуальный сервер покупать. Там можешь устраивать какой угодно карнавал.
  • Иван Сараев (18.11.12 20:53) [30]
    А если сделать клиенты серверами а на хостинге скрипт который дает им запрос как клиент только тогда когда есть новые сообщения. Но тут мешает Нат блин
  • Иван Сараев (18.11.12 20:57) [31]
    То есть например изменилось количество сообщений и пхп скрипт посылает клиентам по очереди каждому сообщение об этом. А на клиентах стоят сервера которые ждут это сообщение.. Да только сообщение до них не доходит из за Ната. Бред.. В общем понял что выхода тут нет
  • DVM © (18.11.12 21:10) [32]

    > Иван Сараев

    Как вариант можно не покупать выделенный сервер а запустить его у себя дома. 10 мбит канала если он есть хватит для большого числа клиентов. Но большинство провайдеров не дают выделенный IP  вместе с безлимитом, в этом случае можно воспользоваться DynDNS
  • DVM © (18.11.12 21:14) [33]

    > Иван Сараев

    вообще можно поискать хостинги с поддержкой сокетов и где нет ограничения на время работы скрипта. Думаю заграничные такие есть.
  • Сергей М. © (18.11.12 21:14) [34]

    > На хостингах обычно стоит ограничение на время выполнения
    > скрипта


    Тогда без таймайта в ajax-запросе точно не обойтись.
  • Anatoly Podgoretsky © (18.11.12 22:33) [35]

    > То есть например изменилось количество сообщений и пхп скрипт
    > посылает клиентам по очереди каждому сообщение об этом.
    > А на клиентах стоят сервера которые ждут это сообщение..
    >  Да только сообщение до них не доходит из за Ната.

    Тут НАТ не мешает, мешает сисадмин с файрволом
 
Конференция "Сети" » Как получить сигнал от сервера [D7, WinXP]
Есть новые Нет новых   [119141   +30][b:0][p:0.001]