За последние 24 часа нас посетили 54933 программиста и 1776 роботов. Сейчас ищут 883 программиста ...

WebSockets - пустые строки

Тема в разделе "Прочие вопросы по PHP", создана пользователем Хыиуду, 7 июл 2014.

  1. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Есть простенькие клиент и сервер на websockets. Клиент простейший, вводишь в инпут текст, по кнопке делается socket.send(text). На сервере бегает бесконечный цикл:
    Код (PHP):
    1. while(true) {
    2.    // Тут мы получаем в $socket идентификатор сокета
    3.    $bytes = socket_recv($socket,$buffer,2048,0);
    4.    echo $buffer."\nBytes: "; var_dump($bytes);
    5.    if ($bytes > 0)  {
    6.        // Обработка пришедшего текста, если не было handshake - сделать handshake, если был - обработать как данные
    7.    }
    8.    else  {
    9.       disconnect($socket);
    10.    } 
    11. }
    Handshake делается, все хорошо. Потом socket.send('123') со стороны клиента - в очередной итерации цикла на сервер приходит "123" и корректно обрабатывается, а в следующей итерации приходит пустая строка. Делал костыль - дисконнект только после пяти пустых строк подряд - приходят пять пустых строк в следующих пяти итерациях цикла. Клиент во всех случаях получает отлуп "Во время загрузки страницы соединение с ws://localhost:8008/ws_server.php было прервано", даже если на сервере поставить полный игнор пустых строк (if ($bytes>0) {...} else continue). Слышал, что нужно завершать передачу пустой строкой (http://forum.ixbt.com/topic.cgi?id=26:41693), передавал и "123\n\n", и "123\r\n\r\n", все равно на следующих итерациях цикла продолжает отрабатывать socket_recv и возвращать пустые строки. Проверял $bytes через var_dump - это именно int(0), а не false.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    можно дурацкий вопрос? а где у тебя выход из цикла?
    самое главное всегда оказывается в тех фрагментах, которые поциент сразу не показывает )))
     
  3. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Выхода из цикла, что характерно, нет, он там и не нужен. Процесс запущен в консоли и крутится там, ждет подключений клиентов.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ясно. а готовые решения не смотрел?
     
  5. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Да это оно и есть, в общем-то. Код почти целиком взят с https://code.google.com/p/phpwebsocket/, заменены функции dohandshake и getheaders на другие, взятые с какого-то форума, потому что со старыми даже сервер не запускался.
     
  6. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Доводилось в целях самообучения (читай самомучения) писать сервер на веб-сокетах на пыхе. Развлечение было увлекательным. Сразу могу сказать, что работает из того что публикуется всякими самоделками может быть каждое 5 решение. Отмёл все велосипеды и начал прямо с изучения протокола. Процесс занял неделю, включая отладку. Подводных камней там набралось на мешок, после которого ещё откроете, что половина браузеров технологию не поддерживает и будете писать обходные решения (второй мешок).
    Поднимайте node.js +socket.io и получайте удовольствие. Решит все проблемы.
     
  7. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Спасибо за совет, но сейчас мне нужно именно на РНР. Тем более большинство браузеров уже все давно поддерживает.
     
  8. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    А ты прекрасен в своей наивности :)
    Вопрос в том: КАК поддерживает.
    Совет уже дали - забей и делай на ноде.
     
  9. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Забил и делаю на Питоне
     
  10. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    А в чем разница если писать с 0, а не на готовом решении?
     
  11. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    Это кому вопрос был?