gpt4 book ai didi

PHP 游戏服务器,多个 TCP 客户端?

转载 作者:可可西里 更新时间:2023-11-01 02:30:28 25 4
gpt4 key购买 nike

我正在制作一款基于网络浏览器的多人游戏。鉴于其实时性,我确定 websockets 是处理通信的最佳方式。客户端使用 HTML5 canvas 渲染游戏,并使用 websockets 与主机通信。

我选择使用 PHP 来托管游戏,因为托管服务提供商似乎更喜欢它。我以前没有使用过 PHP,但在 Java 中用 websockets 做过类似的事情,但严重依赖多线程。

我一直在看一些关于多客户端 php 套接字的教程;但他们中的大多数人都会为每个客户 fork 新流程。因为我会有一个不断运行的游戏循环,所以我认为这不合适。

我想要实现的是一种在每个客户端连接时为其分配端口、监听新客户端、与当前客户端列表交换数据以及一起运行游戏循环的方法。

我需要帮助的地方是:

  • 如何查找端口并将其分配给新客户端,将端口通知客户端,并在断开连接时清理端口。
  • 如何在不阻塞游戏循环的情况下执行上述操作以及所有其他套接字事务。以部分 block 的形式接受来自客户端的消息并且只对完整的消息采取行动是可以接受的。

谁能给我一些关于如何实现这些目标的技术建议?我不认为这一切看起来对 PHP 要求太多,但如果我错了请纠正我!

我理想中希望在服务器端实现的一些伪代码。任何功能都不应阻止: 数组客户端;

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

[更新]对于任何感兴趣的人,我创建了一个支持网络套接字的专用应用程序(特别是使用 Java 和“TooTallNates”网络套接字库),而不是实际的网络服务,因为它似乎更有意义,尽管顺便说一句,似乎大多数网络浏览器自从 slung web由于安全问题,垃圾箱中的 socket 。

最佳答案

您确实需要运行一个 PHP 守护程序才能有效地执行此操作(并且需要 PHP 5.3)。我写了一个相当完整的使用 PHP for daemon processes 概述.无论您选择什么,我都建议您使用基于事件的运行循环系统。

我设计了一个名为 LooPHP 的基本 RunLoop 库这可能会有所帮助,尤其是当您要处理 *_select 时。我非常乐意回答您对此的任何问题。

编辑:

在基于事件的系统中,您不只是while 命令列表,而是对监听器使用react。例如……

而不是做:

while( 1 ) {
... /* listen, react */
} /* repeat */

运行循环通过注册监听器(套接字和其他异步事件生成器)来工作

class ReactClass { ... }

$loop = new LooPHP_EventLoop( new ReactClass );

//add one time event
$loop->addEvent( function() {
print "This event was called 0.5 second after being added\n";
}, 0.5 /* in seconds */ );

//this creates a repeating event, this is called right away and repeats
$add_event = function() use ( $loop, &$add_event ) {
print "This event is REPEATEDLY called 0.1 every second\n";
$loop->addEvent( $add_event, 0.1 );
};
$add_event();

//start the loop processing, no events are processed until this is done
$loop->run(); //php doesn't leave this call until the daemon is done
exit(0); //cleanly exit

上面的例子是一个非常简单的 1 源 EventLoop 和一个手动添加的定时函数(这些甚至可以从对 ReactClass 的调用中添加)。

在我工作的应用程序中,我需要将异步事件馈送到后端(通过套接字),然后需要能够调用与原始事件任意偏移的函数(对于超时的客户端等) ).

如果您想要更多示例,可以在 github 找到它们.

我希望你觉得这很有用。

关于PHP 游戏服务器,多个 TCP 客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262119/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com