Java TCP服务器 - 安卓客户端丢包

时间:2012-03-13 19:28:30

标签: java android tcp

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

服务器端:

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

客户刚收到(~3包)
test_0
TEST_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();
}

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

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