【问题标题】:Java TCP server - android client packet lossJava TCP服务器 - android客户端丢包
【发布时间】:2012-03-13 19:28:29
【问题描述】:

我正在尝试使用 Java TCP 服务器和 Android 客户端为 Android 创建一个基本的多人游戏。问题是发送 TCP 数据包时速度慢。当我输入 Thread.sleep(100) 时,它就可以工作了。

服务器端:

for(int i = 0; i<50; i++) {
    client.send("test_" + i);
}

客户端刚刚收到(~3 个数据包)
测试_0
测试_1

休眠的服务器:

for(int i = 0; i<50; i++) {
        client.send("test_" + i);
        Thread.sleep(100);
}

客户收到 ~45

编辑:客户端:

while (true) {
if (!running)
    break;
inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"), 2 * 1024);
String rawRecervied = inFromServer.readLine();
if (rawRecervied == null) {
    close();
    break;
}
final String recervied = rawRecervied.substring(2); // for skip utf bom chars
new Thread() {
    public void run() {
        listener.dataRecervied(recervied);
        Log.e("TCP recervied", recervied); // debug
    }
}.start();
}

【问题讨论】:

  • 尝试 BWitched 建议在 while(true) 之外创建 BufferedReader
  • 您的问题是什么?是关于丢包,根据标题,还是慢速,根据正文?

标签: java android tcp


【解决方案1】:

也许密钥在BufferedReader 中。您处于一个循环中,并不断创建BufferedReader 以检查是否已从服务器发送了某些内容。一旦检测到数据,您就开始处理它,但数据不断涌入,并被缓冲在BufferedReader 中。处理完最初检测到的数据后,您再次创建了BufferedReader,但是,之前创建的BufferedReader 中已经缓冲的所有数据会发生什么情况?也许它已经丢失了。

您可以尝试在循环外创建BufferedReader 吗?

【讨论】:

    【解决方案2】:

    如果它是一种可以接受丢包的单向协议,则使用 UDP 而不是 TCP,因为它在网络资源方面更便宜。我认为这不是你的情况。如果是 TCP,那么实现一个基本的流控制,客户端通过将其 ID 回显给服务器来确认接收到的数据包。

    您还应该修改您的客户端和服务器代码,因为这种行为可能是您实现 client.sent(..) 的方式。您是否总是关闭并重新打开连接?还是什么?

    【讨论】:

    • 我也使用 UDP(用于快速移动数据),但 TCP 用于我想要确定的数据(用于登录或聊天)。
    猜你喜欢
    • 2023-03-21
    • 2012-11-03
    • 2013-02-17
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多