2013-10-25 2 views
-1

Я создал простое приложение node.js с двумя страницами. Лобби и игровая комната. Пользователь подключается к фойе, затем садится за стол, и игровое помещение открывается в новом окне. Таким образом, открываются два окна браузера, оба с собственным подключением сокетов.Сокеты не остаются подключенными к iPad/iphone?

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

Однако, на моем iPad или iPhone, когда я открываю игровой зал, соединение сокета с фойе заканчивается через короткое время.

Есть ли лучший способ заставить соединение сокета оставаться открытым на тех устройствах, которые отличаются от компьютера?

Вот код, у меня есть на сервере:

EDIT: Подключение к вестибюлю на самом деле не заканчивается мгновенно, когда это окно браузера больше не имеет фокус на мобильном устройстве, это только то, что сам по себе тайм-аут происходит после тайм-аута интервал.

Вот мой отладочный вывод:
получил понг Player1
получил понг Player1
получил понг Player1
получил понг Player1
получил понг Player1
{имя пользователя: 'Player2',
пароль: 'пароль' ,
browser_os: 'Mozilla/5.0 (iPad, CPU OS 5_1_1, как Mac OS X) AppleWebKit/534.46 (KHTML, например, Gecko) Версия/5.1 Mobile/9B206 Safari/7534.48.3'}
info - рукопожатие разрешено Ut2WHuhbDGsYzd6CRquX (игрок 2 входит в и рукопожатии и вестибюль)
подключения лоббировать
получили понг Player1
получили понг Player2 (первый понг от игрока 2)
информации - открывает рукопожатие уполномочили стола If6MFTkJqv3T_Mn5RquY (игра для игрока 2 - обратите внимание нет больше PONGS от игрока 2 !!)
получили понг Player1
получили понг Player1
получил понг Player1
информации - рукопожатие уполномочила agmZNNSnce0h68NSRquZ (игровой стол открывает для игрока 1)
получил понг Player1
получил понг Player1
получил понг Player1
получил понг Player1
получили понг Player1
получил понг Player1
получили понг Player1
информации - транспортный конец (сердцебиения таймаута)
лобби отключения (игрок 2 обрываются от лобби)
получил понг Player1

Это мой код на стороне сервера:

function sendHeartbeat(){ 
    setTimeout(sendHeartbeat, 8000); 
    io.sockets.in('lobby1').emit('ping', { beat : '1' }); 
} 

setTimeout(sendHeartbeat, 8000); 

Это мой код на стороне клиента:
гнездо.на ('пинг', функции (MSG) {sendPong (MSG)});

function sendPong(msg) { 
    socket.emit('pong'); 
} 

ответ

0

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

HTML5 поддерживает функцию Websockets, которая позволяет использовать более истинный сокет TCP/IP, который создает постоянное двухстороннее соединение между браузером и сервером. Это может быть вашим лучшим выбором, поскольку большинство методов Commet - это, в основном, хаки, чтобы обойти природу того, как изначально планировались HTTP и веб-браузеры (т. Е. Делать небольшие дискретные запросы, а не поддерживать связь неограниченно). Веб-сокеты HTML5 предназначены для непосредственной поддержки этой функции. Большинство современных браузеров support web sockets, включая мобильные (за исключением Android, но я думаю, что это скоро). Существует несколько пакетов веб-сокетов для node.js, включая WebSocket-Node и ws. Вот good intro в веб-сокеты.

Почему ваш код работает в некоторых средах, а другие трудно сказать на данный момент. Это может быть отсутствие поддержки в браузерах. Мобильные устройства имеют менее мощные браузеры, чем настольные компьютеры. Я не уверен в поддержке веб-сокетов Commet или HTML5 в мобильном Safari (have a look at this).

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

+0

Я использую socket.io. Это не использует сам Websocket под обложками? Разве socket.io просто не работает с iphone/ipad? – a2zCribbage

Смежные вопросы