繁体   English   中英

Java TCP服务器-Android客户端数据包丢失

[英]Java TCP server - android client packet loss

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

服务器端:

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

客户端刚收到(〜3个数据包)
测试_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();
}

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

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

如果它是单向协议,可以接受丢包,则使用UDP代替TCP,因为从网络资源上讲它更便宜。 我认为这不是您的情况。 如果是TCP,则实施基本的流控制,其中客户端通过将其ID回显到服务器来确认收到的数据包。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM