Как пользоваться сокетами?

MiRacLe

просто Чудо
Sending and loading variables to and from a remote source

что за непроходимая тупость,ты про клиент-сервер почитал? почему просветления не наступило?

Сервер ничего не может сам по себе "передавать другим флэшкам",но "другие флэшки" могут опрашивать сервер на предмет новых данных.
 

nucer

Guest
ты хоть(про за грубость) хоть уписайся,но ничего не передашь, а вот во "флешке" можно устроить в цикле getUrl и периодически опрашивать сервер на предмет новых данных
Я так и делал до сих пор. А теперь нужен быстрый отклик на действия других юзеров. Но ведь нагрузка на сервер получается огромная: каждые секунд 10 от каждого юзера идёт запрос, и каждые 10 секунд PHP должен проверять, например, БД на предмет поступления данных от остальных. Этож геморно как.

-~{}~ 16.05.04 20:35:

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

MiRacLe

просто Чудо
ты понимаешь как работает HTTP ? сервер ничего не знает о клиентах,он получил запрос,тихо,скрипя стареньким винчестером,вежливо ответил и тихо помёр,чтобы знать всё о клиенте,нужно с ним постоянно держать связь (да ты можешь написать свой сервер и реализовать свой простенький протокол аля irc, для этого нужен доступ на сервере(вероятно рутовый),с которым клиенты будут постоянно держать связь,в этом случае "время отклика" ты уменьшить сможешь,но снизишь ли нагрузку на сервер? кол-во траффика(серверного и клиентов) ? )

по поводу данных в БД - можешь попробовать (если данных не "много") хранить их в Shared Memory

-~{}~ 16.05.04 20:45:

по поводу игр - приведи пример
 

nucer

Guest
А IP клиента и номера порта не достаточно чтобы установить с ним соединение?
 

Фанат

oncle terrible
Команда форума
а с чего ты взял, родной, что по тому порту, С которого пришел запрос, тебе кто-то будет отвечать?
И кто же?

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

MiRacLe

просто Чудо
я чесно-чесно уже плакаю.
Рассказываю - вот сейчас у меня $_SERVER['REMOTE_ADDR'] = 'xxx.xx.xx.xx'; $_SERVER['REMOTE_PORT'] = 'xxxx'; ты же эти данные имел ввиду,правда?

ну так вот, чтобы "сервер" смог передать мне данные,без моего на то ведома(без лишних действий с моей стороны),у меня на машине должен быть установлен сервер,который слушает определенный порт ( $_SERVER['REMOTE_PORT'] никаким боком к этому не относиться - он не LISTEN)
Далее выясниться что даже если я заведу у себя на машине сервер который будет слушать порт xxxxx ,ты всё равно не сможешь к нему(серверу) приконектиться,потому что :
1) я за проксей
2) я за NAT-ом
3) да у меня firewall стоит
4) и на раутере тоже firewall стоит

Ну прям напасти какие,правда? Всё против тебя.
И как тут быть?
 

nucer

Guest
Так чего, я могу со спокойной совестью делать вышеописанным способом, не думая о том что там всё лагает жутко?
 

MiRacLe

просто Чудо
скажем так - у тебя выхода другого нету.
Оптимизируй базу,скрипты .. попробуй данные которые нужно передавать клиентам хранить в SHM , чтобы не дёргать базу из-за одной строчки текста,тысячами коннектов...

-~{}~ 16.05.04 21:11:

З.Ы. я рад что ты начинаешь понимать что web не предназначен для подобных задач.
 

nucer

Guest
Ладно, тогда скоро здесь появиться тема про SharedMemory ;-)
 

Фанат

oncle terrible
Команда форума
такая же бессмысленная.
SharedMemory надо использовать не тогда, когда про нее случайно узнал, а когда она действительно нужна.

а когда "лагает жутко", надо выяснять - в каком именно месте. и это место оптимизировать
 

Игорёк

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

nucer

Guest
2 Игорёк Можешь поподробней рассказать об этом?
 

whirlwind

TDD infected, paranoid
Можно со всеми клиентами держать постоянное HTTP-
соединение, тогда задержек не будет.
Вроде бы местный чат так сделан.
Но не все хостеры разрешают такое, у большинства
есть ограничение на время выполнения скрипта.
Держать соединение открытым не сложно - просто передать клиенту соответствующий заголовок Connection. Но вот только будет ли в этом смысл? Следующий запрос все так же приведет к выполнению всей работы. Здесь без демона не обойтись. Вот если бы на порту сидел сервер уже с готовым подключением к БД (или какие там еще средства используются), то каждый запрос клиента не сопровождался бы накладными расходами на коннект.
 

Игорёк

Новичок
Автор оригинала: whirlwind
Держать соединение открытым не сложно - просто передать клиенту соответствующий заголовок Connection. Но вот только будет ли в этом смысл? Следующий запрос все так же приведет к выполнению всей работы. Здесь без демона не обойтись. Вот если бы на порту сидел сервер уже с готовым подключением к БД (или какие там еще средства используются), то каждый запрос клиента не сопровождался бы накладными расходами на коннект.
Автор оригинала: nucer
2 Игорёк Можешь поподробней рассказать об этом?
Я конечно сам этим не занимался, но теоретически никакой проблемы не вижу. Не знаю как это во flash делается, а на php/javascript можно было бы открыть два фрейма, в одном установить постоянное соединение, а во втором - соединение по запросу, ну и javascript'ами все разруливать. Вместо демона использовать циклический php-скрипт с неограниченным временем выполнения.

Надо поспрашивать у разработчиков чата, там примерно такая же задача стоит, они же ее как-то решили, зайди сюда:
http://php.spb.ru/chat/

Основной разработчик вроде DiMA.
 
Сверху