Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реализация приём/отправка сообщений как Вконтакте, работа с сокетами 
:(
    Опции темы
numerovan
Дата 11.10.2013, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: 0
Всего: 2



Здравствуйте, предлогаю сделать один пост, где нормально будет описан метод реалиции отправки/получения сообщений в реальном времени с их уведомлением ... в общем как Вконтакте. Сидел вот целый день сегодня , читал разные статьи, пробывал, тестировал ... мало к чему пришёл, последняя надежда наверно на этот форум.
В общем вот что есть:
В HTML-е делаю следующее, через яваскрипт
Код

var ws = new WebSocket('ws://site.ru:80/folder/file.php'); 
        ws.onopen = function() { alert("Открыт"); // вызывается при открытии соединения 
        }; 
        ws.onerror = function(e) { alert("Ошибка"); // вызывается в случае ошибки, например, при обрыве связи 
        }; 
        ws.onclose = function() { alert("Закрыт"); // вызывается при закрытии соединения 
        }; 
        ws.onmessage = function(msg) { alert(msg.data);
            // вызывается, когда сервер посылает сообщение клиенту.
            // сообщение содержится в msg.data. 
        }; 
        // Вот как послать некоторые данные на сервер:
        ws.send('some data'); 
        
        // Как закрыть сокет:
        ws.close();

Далее php файл, так сказать "проходная дверь" через эти запросы, лежит допустим тут www.site.ru:80/folder/file.php
Код

header('Content-Type: text/plain;'); // хэйдер возвращение данных
set_time_limit(0); // заставляет работать php-скрипт как демон 
ob_implicit_flush(true); // отправляет информацию вне зависимости от того, закончил ли работать php-скрипт или нет
$sockets = array(); // все сокеты
$handshakes = array(); // массив рукопожатий (отдаём информацию о том, что это не просто сокет, а сокет по стандарту WebSocket

$sockets["server"] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  // создаём главный сокет-сервер, к которому будут обращаться клиенты
socket_bind($sockets["server"], "localhost", 80); // прикрепляем главный сокет-сервер к адресу ws://localhost:10001/%server%.php
socket_set_option($sockets["server"],SOL_SOCKET,SO_REUSEADDR,1); // разрешаем использовать один порт для нескольких соединений
socket_listen($sockets["server"], 20); // ставим лимит подключений (20)

while(true){ // скрипт работает постоянно
    $changed_sockets = $sockets; 
    $num_sockets = socket_select($changed_sockets, $write=NULL,$exceptions=NULL,NULL); // проверим все сокеты на изменение статуса по сравнению с прошлым разом
    foreach($changed_sockets as $socket){ // просмотрим каждый из сокетов, который изменил свой статус
      if($socket == $sockets["server"]){ // значит серверу пришли данные о установлении связи между клиентом и сервером
            if (($client = socket_accept($sockets["server"])) >= 0) $sockets[] = $client; // если удалось установить связь, то добавляем в список всех сокетов
      }else{
            $index = array_search($socket, $sockets);
            $len = @socket_recv($socket,$buffer,4096,0); // получаем информацию от сокета
            if($len == 0) { // если статус сокета изменился, а данных нет, то значит сокет закрылся и мы должны убрать его из списка
                  unset($sockets[$index]);
                  unset($handshakes[$index]);
                  socket_close($socket);
            }
            else if(!isset($handshakes[$index])){ // говорили ли мы уже этому подключению, что мы - WebSocket?
                 $buffer = substr($buffer,strpos($buffer,"Sec-WebSocket-Key: ")+19);
                 $accept = base64_encode(sha1(substr($buffer,0,strpos($buffer,"\r\n")) . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
                 $upgrade  = "HTTP/1.1 101 Switching Protocols\r\n" .
                             "Upgrade: websocket\r\n" .
                             "Connection: Upgrade\r\n" .
                             "Sec-WebSocket-Accept: " . $accept . "\r\n\r\n" .
                             "Sec-Websocket-Extensions=x-webkit-deflate-frame"  . chr(0);
                
                 socket_write($socket,$upgrade,strlen($upgrade)); // отправляем пакет о нас
                 $handshakes[$index] = true; // теперь сказали
            }
            else echo 'buf:'.$buffer."\r\n";
      }
    }
}

реализацию данного примера взял из  ... не могу найти сейчас, где-то раздабыл.
Проблема следующая сейчас : при загруке старницы сразу показываеться ОШИБКА через яваскрипт при реализации объекта сокета.

Что вообще делать то дальше ?

Добавлено через 3 минуты и 32 секунды
на сервере стоит php 5.2.17, вроде всё что нужно включено для этого, браузер тоже говорит что может работать с Вебсокетом через яваскрипт. На сервере отдельно тестил работу сокетов, тоже всё нормально работает ...
PM MAIL   Вверх
Sanchezzz
Дата 12.10.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Ны пыхе это изврат через демона делать, то ли дело когда серверная морда в nodejs под это...


--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
Platon
Дата 19.10.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: нет
Всего: 40



Цитата(Sanchezzz @  12.10.2013,  19:52 Найти цитируемый пост)
Ны пыхе это изврат через демона делать, то ли дело когда серверная морда в nodejs под это...


что значит изврат через демона? в чём преимущество нодджс?
PM MAIL ICQ   Вверх
numerovan
Дата 21.10.2013, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: 0
Всего: 2



Изучаю сейчас node.js когда время есть, думаю эту тему нужно перенести в соответствующую рубрику. Тема не закрыта, буду пытаться докопаться до истины, результаты полюбому сюда выкладу.
PM MAIL   Вверх
Sanchezzz
Дата 22.10.2013, 07:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

Репутация: 41
Всего: 60



Цитата

что значит изврат через демона? в чём преимущество нодджс?

Смотри у тебя пых в стандартной ситуации отработал и ушел, что бы скрипт работал вечно его создают как deimon. (служба)  который сидит и ждет пока на него с неба не упадет что то. 

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



--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0453 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.