我正在创建一个简单的在线多人游戏,两个玩家(客户)可以相互玩游戏。数据被发送到服务器并从服务器获取,服务器管理与此相关的所有数据。
我面临的问题是如何有效地从服务器获取更新。使用AJAX获取数据:每隔5秒,从服务器获取数据以检查更新。然而,这是使用HTTP完成的,这意味着每次都会发送所有标头。数据本身保持绝对最低。
我想知道是否有人会提供有关如何在此服务器/客户端方案中节省带宽的提示。是否可以使用自定义协议或类似的方式获取,以防止所有标题(如“服务器:Apache”)每次发送?我基本上只需要非常数据(只有9个字节)而不是所有标题(如果它不是更多的话,它们就像100个字节)。
感谢。
答案 0 :(得分:3)
HTML5的websockets(在此处的其他答案中提到)目前可能限制浏览器支持,但使用长期HTTP连接来推送数据(又名Comet)会为您提供类似的“流式传输” even IE6可以处理的功能。尽管Comet实现起来相当棘手,因为它是一种利用浏览器恰好在当时实现的方式的黑客攻击。
另请注意,这两种技术都需要您的服务器处理比以往更多的同时连接,这可能是一个问题,即使它们在大多数时间都处于空闲状态。这有时被称为C10K problem。
本文对websockets vs comet进行了一些讨论。
您可能会成功将HTTP标头减少到保存字节所需的最小值。但是您需要保留Date
,因为根据规范(RFC 2616),这不是可选的。您可能还需要Content-Length
告诉浏览器正文的大小,但可能会在发送正文字节后删除它并关闭连接,但这会阻止浏览器利用HTTP / 1.1持久连接
请注意,Server
标头不是必需的,但Apache不允许您完全删除它 - ServerTokens指令控制它,最短的设置导致Server: Apache
为您已经有。我不认为其他网络服务器通常会让你删除Server
标题,但如果你在共享主机上,你可能会被提供商配置的Apache困住。
答案 1 :(得分:1)
html5套接字将是在不久的将来实现这一目标的方法。
http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/
答案 2 :(得分:1)
这对所有浏览器都无法实现,但较新版本支持(Chrome,Safari)。您应该使用一个使用websockets的框架,然后优雅地降级为长轮询(除非总是有等待的事件,否则您不希望以固定的时间间隔进行轮询)。通过这种方式,您将获得较新浏览器的优势,并且随着人们升级,该池将继续扩展。
对于Java,常见的解决方案是Atmosphere:http://atmosphere.java.net。它有一个jQuery插件以及servlet容器级别的抽象。