Tag: 联网

TCP和Node.js的实时多人游戏原则

我一直在阅读关于多玩家networking的Valve 文章,这篇文章是从Yahn Bernier 2001年的论文中提出的,该文章称为客户端/服务器游戏内协议devise和优化中的延迟补偿方法 。 我正在使用通过socket.io连接到客户端的node.js服务器来制作一个实时的多人游戏,关于以下原则我有几个问题: 实体插值 [Interpolation]可以防止抖动,这通常会导致通过caching服务器更新,然后播放它们之间的平滑插补之间的差距。 它还可以防止丢包造成的故障。 客户端预测 预测是客户端的概念,预测本地玩家的行动的影响,而不用等待服务器来确认他们。 实体的预测状态在服务器命令到达时被testing,直到检测到匹配或不匹配为止。 滞后补偿 延迟补偿是服务器使用播放器延迟来处理[用户input]时的后退时间的概念,以便查看玩家在命令发送时看到的内容。 与预测相结合,滞后补偿可以帮助打击networking延迟到几乎从攻击者的angular度消除这一点。 这些原则是否适用于TCP,和UDP一样,在实现上会有什么不同? 我可以看到实体插值不需要防止数据包丢失,但是这样做。 我甚至可以使用UDP和Node.js在服务器和Web浏览器之间进行通信,反之亦然? 既然论文已经十多年了,这些原则还在使用还是有其他技术出现呢? 任何帮助将非常感激。

操作系统如何在接受同一套接字的多个进程之间进行负载平衡?

我正在阅读Node.js中的集群模块的文档: http://nodejs.org/api/cluster.html 它声称如下: 当多个进程都accept()相同的底层资源时,操作系统将非常有效地在它们之间进行负载均衡。 这听起来很合理,但是即使经过了几个小时的search,我还没有find任何可以证实的文章或者任何东西,或者说明这个负载平衡逻辑如何在操作系统中工作。 另外,什么操作系统正在做这种有效的负载平衡?

长期投票的严重缺点?

对于交互式Web应用程序,像Websockets这样的东西越来越受欢迎。 然而,由于客户端和代理世界并不总是完全兼容,所以通常会使用像“Socket.IO”这样的复杂框架,对于任何可能会禁用其他框架的情况隐藏几种不同的机制。 我只是想知道一个正确实现的长轮询的缺点是什么,因为今天的服务器比如node.js很容易实现,并依赖于很好的支持旧的http技术(尽pipe长时间的轮询行为本身可能会打破它)。 从高层次来看,长时间轮询(尽pipe有一些额外的开销,适用于中等stream量的应用程序)类似于WebSockets所做的真正的推送行为,因为服务器每当他喜欢(尽pipe有一些超时/心跳机制)实际发送它的答案。 所以我们有更多的开销,因为我猜测TCP / IP更多的确认,但没有像频繁轮询那样的持续stream量。 而使用事件驱动的服务器,我们将不会有线程开销来阻止连接。 那么是否还有其他困难的缺点,迫使像聊天这样的中等stream量应用使用WebSockets而不是长时间轮询?

用于实时多人游戏的Node.js UDP

我正在使用node.js构build一个基于浏览器的实时多人游戏。 目前,我有客户端通过socket.io发送用户input到游戏逻辑服务器,游戏世界的快照发送回客户端进行渲染。 以下是代码的简化版本。 是否有可能使用UDP从基于浏览器的客户端发送数据到服务器,反之亦然? 我知道Node.js有一个UDP模块,但我不确定如何以这种方式来实现它。 任何帮助,将不胜感激。 谢谢。 服务器: var server = http.createServer(handler).listen(8888); var iosocket = io.listen(server); // request/response handler function handler(req, res){ … } iosocket.sockets.on('connection', function(socket){ console.log("[x] Socket listener started"); socket.on('msg', function(data){ console.log( " [-] incoming message); }); }); … iosocket.sockets.emit("message", msg); 客户: <!DOCTYPE html> <html> <head> <title>Test</title> <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript"> socket.on('connect', function(){ […]

在本地networking上的其他人如何在我的机器上运行时访问我的NodeJS应用程序?

我有一个非常简单的问题。 我用NodeJS做了一个网页游戏,并且可以通过多个浏览器窗口并排打开, 但是,我想知道其他本地机器是否可以访问和玩我的游戏。 我天真地尝试使用此url: my-ip-address:8000 ,它不会工作。

request.connection.remoteAddress现在在node.js中的前缀为:: ffff

我最近把路由器改成了Google为Google Fiber(yay!)提供的路由器,现在我注意到当我在本地服务器上开发时检查request.connection.remoteAddress时所看到的变化。 之前,我曾经看到这个: request.connection.remoteAddress; // 192.168.1.10 现在我看到了这个: request.connection.remoteAddress; // ::ffff:192.168.1.10 任何人都可以解释发生了什么事? 我的节点服务器是否正在侦听IPv6地址? Is ::ffff:192.168.1.10实际上是IPv6地址还是IPv4地址? 最简单的方法是判断remoteAddress是否是IPv6来检查string是否包含:: ? 当在数据库中存储IPv4地址时,我曾经使用类似INET_ATON东西将它们变成大整数。 我应该放弃这一点,只将所有的远程地址存储为长度为45个字符的string(IPv6地址string的最大长度)