Конференция "Сети" » Как получить сигнал от сервера [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
 
Конференция "Сети" » Как получить сигнал от сервера [D7, WinXP]
Есть новые Нет новых   [119118   +117][b:0][p:0.001]