如何使用nodejs从客户端向节点子进程发送/路由按键?

时间:2013-05-25 21:21:10

标签: javascript node.js

我正在使用node.js在点击HTML元素时生成子进程(恰好是一个视频游戏)。当然,客户端和服务器应该在同一台机器上。当我现在这样做时,游戏会打开,但当然所有键盘按下都会进入浏览器,而不是在产生时打开的全屏游戏。

如何将所有键盘按键从客户端路由到子进程(游戏)?

我唯一的想法是让客户端监听按键,然后将它们(通过Socket.IO之类的东西)传递给节点,而节点又会将这些按键发送给孩子。我担心这会导致按键和游戏之间的延迟。此外,我甚至不确定如何首先将实际的按键发送到子进程。

- 这就是我如何产生这个过程 -

var spawn = require('child_process').spawn;
var prc = spawn('gameinquestion',  ['-v']);

1 个答案:

答案 0 :(得分:0)

这个想法:

  • 在导航器窗口中绑定keydown事件
  • 通过ajax将密钥转发给Node(请记住,您需要在此选择权限。您可以逐个发送密钥,这会导致并发问题或高延迟 - 更多信息稍后。或者你可以发送成串的密钥,这意味着你将推迟一些按键)
  • 节点使用原生解决方案传达击键(我不确定你在哪个平台上)

然而,对于你正在做的事情(玩游戏),你可能想要完全破坏Node并获得类似http://badassjs.com/post/711624134/novnc-a-vnc-viewer-in-javascript(纯JS中的VNC客户端)的东西。

有关延迟的更多信息

如果你一个接一个地传达击键,你需要担心的是,一些稍后会发射的请求实际上会更快到达(有时很少,有时会很多)。这可能会也可能不会更改单独请求命中节点服务器的顺序。如果你一个接一个地传递击键,你总是想要做的是让Node发回一个“收到的最后击键”的唯一ID,以便客户知道它在哪一个......或者拥有客户端记录它收到的击键次数,发送当前发送的所有击键,并让服务器重新构建订单。

第二个选项是数据包解决方案 - 您可以将它们聚集在x keystrokesx milliseconds' worth of keystrokes中,而不是发送一次击键。第一个是好的,如果你打字很多,因为更新会更快,但如果你打字很少,会更糟。第二个很好,因为你知道你最多会被x推迟。然而,这很糟糕,因为你知道你必须依靠侥幸延迟少于x

此外,即使在#2的情况下,除非你选择一个愚蠢的大包装框架,否则你需要实施解决方案#1。

相关问题