Web应用程序与服务器程序双向交互?

3
我想编写一个网页应用程序,与Crafty引擎下棋。我对PHP和javascript不陌生,但必须学习如何与服务器进程交互:网页应用程序和/或(jQuery) ajax如何与运行在服务器上的(linux)程序进行双向交互?
目前我正在本地主机(Apache)上开发。Crafty已安装在我的Ubuntu PC上。这个著名的国际象棋引擎没有GUI,通过命令在终端中运行: $ /usr/games/crafty
因此,您可以与它下棋甚至看到它的计算:
我可以使用proc_open()或exec()函数让Crafty在PHP中运行,并且大多数文档都说明输出流应该是一个文件... 但是我认为我不想要这样的设置,因为那么网页应该不断轮询该文件(例如通过ajax)以查看是否添加了新数据,对吧?
Crafty如何直接与网页通信,说“我已经计算出另一个变化”或“我已经决定了一步”,然后在网页上显示这些信息并让用户给出一些反击,就像在终端中一样。难道不能使用某些会话/流/监听器吗?
我完全没有头绪,请问有人能指点我正确的方向吗?

听起来轮询是最好的选择。 - Joe Green
Crafty看起来非常酷,但它不是一个服务器进程——它被设计为单用户命令行应用程序。理论上你可以将其封装在网页上,但这将很困难——每个并发用户可能都需要运行一个Crafty实例,这会严重限制并发用户的数量。 - Neville Kuyt
1
我可以想到一些干净的解决方案,只需对已有的想法进行少量修改。根据其网站http://www.craftychess.com/,Crafty是一个开源程序。因此,您可以获取它的源代码(ftp://ftp.cis.uab.edu/pub/hyatt)和核心业务逻辑(无论语言如何)。我们有业务逻辑。现在我们需要考虑执行这些逻辑的方法。您可以为其构建新的用户界面,与用户和Crafty逻辑进行交互。这是具有挑战性但可行的,并且可以产生出色的结果。你怎么看? - Dinesh
2
@Dinesh,这是可能的 - 但将单用户应用程序转换为多用户、无状态的Web应用程序是非常不平凡的。根据我的经验,它可能会消耗与构建原始单用户应用程序一样多的时间... - Neville Kuyt
@NevilleK 是的。这不是一个容易的任务。当别无选择时,我们可以这样做。现在有很多在线国际象棋网站。不值得花那么多精力。然而,只有在情况需要时,我们才能采取这种方法。 - Dinesh
1个回答

1

我建议您使用FIFO和&运算符 - 原因如下:

  • 您不想在每个PHP请求上都启动Crafty,而是只想在每个游戏中启动一次
  • 您不希望Crafty在请求结束时结束
  • 您的移动请求将要与已经运行的实例进行交互。

所以我会做以下事情:

  • 使用mkfifo准备一对FIFO - 您可以从PHP或shell中执行此操作
  • 在游戏开始时,运行类似于/usr/games/crafty <stdin.fifo >stdout.fifo 2>stderr.fifo &的命令
  • 对于您的移动,请通过AJAX PHP请求写入stdin.fifo
  • 对于服务器移动,请使用AJAX进行长轮询,在服务器端打开stdin.fifo,然后使用stream_select()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接