Игровой сервер PHP, несколько TCP-клиентов?

I ' m создание многопользовательской игры на основе веб-браузера. Я определил, что веб-сокеты - лучший способ обработки сообщений, учитывая их природу реального времени. Клиент использует холст HTML5 для рендеринга игры и веб-сокетов для связи с хостом.

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

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

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

Места, где мне нужна помощь:

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

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

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

Может ли кто-нибудь дать мне технический совет о том, как достичь этих целей? Я не думаю, что все это выглядит слишком многим, чтобы просить PHP, но поправьте меня, если я ошибаюсь!

Какой-то псевдокод того, чего я в идеале хотел бы достичь на стороне сервера. Ни одна из функций не должна блокировать: Массив клиентов;

while(gamerunning)
{
    CheckForNewClients();
    GetStatusFromClients();
    DoGameUpdate();
    SendGameStateToClients();
}

[Обновить] Для всех, кого это интересует, я создал специальное приложение, поддерживающее веб-сокеты (в частности, используя Java и библиотеку веб-сокетов TooTallNates), а не реальную веб-службу, поскольку это казалось более разумным, хотя, кстати, кажется, что большинство веб-браузеров с тех пор перекинули сеть розетки в корзине из-за проблем с безопасностью.

10
задан Toby Wilson 7 December 2011 в 12:43
поделиться