【发布时间】:2012-04-01 06:26:37
【问题描述】:
我正在开发一个通过 WLAN 连接与 TCP Java 服务器通信的 Android 应用程序。 Android 应用程序是一个在屏幕上移动精灵的游戏。每当精灵移动时,AndroidClient 将其坐标发送到 Java 服务器,然后将数据发送到其他客户端(最多 4 个客户端)。服务器在单独的线程上处理每个客户端,大约每 20 毫秒发送一次数据更新,每个数据包大约包含 1-10 个字节。我在一个 70 Mbit 的网络上(我的无线网络上大约有 15 Mbit 有效)。
我遇到了连接不稳定的问题,并且遇到了大约 50-500 毫秒的延迟。每 10-30 个数据包。我已将 tcpNoDelay 设置为 true,从而停止了一致的 200 毫秒延迟,尽管它仍然滞后很多。由于我对 Android 和网络都很陌生,我不知道这是否可以预期。我还想知道 UDP 是否适合我的程序,因为我感兴趣的是快速发送更新而不是每个数据包都正确到达。
对于如何避免/解决此延迟问题的任何指导,我将不胜感激。关于如何实现这种客户端-服务器架构的一般提示也会受到欢迎。
【问题讨论】:
-
UDP 听起来确实是一个更好的选择。
-
对于一个游戏,您可能想要添加一些预测(您可能已经看到了错误预测对某些游戏的影响)。
-
使用 wireshark 或 tcpdump 捕获网络活动并在此处发布。
-
听起来您的协议并非旨在以低延迟通过 TCP 工作。你能解释一下它是如何工作的吗?例如,它如何确保 ACK 捎带?将 tcpNoDelay 设置为 true 的事实在它应该受到伤害时有所帮助,这强烈表明您的协议从未设计用于 TCP 的低延迟。我的猜测是:1)您的编写代码可能很糟糕,并将部分应用程序级消息推送到传输层。 2)您的协议可能很糟糕,并且没有应用程序级别的确认来减少延迟。