【发布时间】:2011-03-22 05:11:56
【问题描述】:
我正在用 Java 为回合制游戏编写游戏服务器。 这些是事实:
- 游戏速度很慢,所以客户端需要发送数据,比如说每 8 秒发送一次数据,并且数据大部分时间只是一个小的增量更新(几十个字节),除了像 join of the游戏或列出可用游戏等。
- 服务器必须支持大量玩家,比如说 1000 人,他们可以玩几百场比赛中的一场
- 当玩家转弯时,必须通知同一游戏中的其他玩家该移动。游戏中的最大玩家人数为 10 人左右
首先,我从我的选项列表中排除了 UDP,因为我需要一个可靠的协议,因为在极少数情况下,我确实需要发送一些无法放入一个数据包中的数据,并且我不想为合并数据包和类似的事情而烦恼东西,跟踪到达包裹的顺序和其他低级的东西。
所以问题是使用 TCP 还是 HTTP。
TCP 尝试 #1
从客户端到服务器的连接(反之亦然)一直处于打开状态。这样,当玩家移动时,服务器可以很容易地通知游戏中的其他玩家移动了哪一步。这种方法困扰我的主要问题是,是否建议或什至可以一直打开多达 1000 个连接和套接字?
TCP 尝试 #2
我想到的替代方案是,用于在来自客户端的每个请求上建立单独的连接/套接字。客户端会打开一个连接,向服务器发送一些小数据并关闭该连接。使用这种方法,我可以拥有一个固定大小的线程池,比如说 10 个,并在每个线程中分别处理客户端的请求,以便随时打开最多 10 个连接/套接字。但是这种方法有两件事困扰着我:
- 打开/关闭与客户端的连接很昂贵
- 通知游戏中其他玩家的方式,因为与他们的连接很可能已关闭。在这种情况下,他们每个人都应该“轮询”服务器以获取更新,比方说每隔一秒。
建立 TCP 套接字/连接的成本是多少?这是一项昂贵的操作,还是仅在几毫秒(或更短)内完成?
HTTP
- 如果有很多开销 我将发送一个新的 GET/POST 只是发送几个字节?
- 我可以保持 1000 个 HTTP 连接到 客户端同时使用,然后使用 AJAX 或类似的东西要减少 高架?在这种情况下,1000 同时连接构成 关于重大问题 带宽/性能?
我愿意接受任何形式的建议/建议。
【问题讨论】:
-
关于#2:每次建立连接时您都必须对播放器进行身份验证...这也可能很慢!?
-
客户端和服务器都是Java写的吗?
-
有几个客户端,其中一个是Java,但我正在寻找一个通用的解决方案。