gpt4 book ai didi

java - Android 套接字读取字符串时出现错误

转载 作者:行者123 更新时间:2023-11-30 17:21:09 26 4
gpt4 key购买 nike

我有一个 Android 应用程序。这个应用程序有不同的线程。每个线程都是一个 Socket Client TCP。服务器每秒向我发送约 320 个字符。通常情况下连接是稳定的,并且能够正确接收字符串,但有时一个套接字或所有套接字停止接收数据,几秒后(5秒到50秒)套接字继续接收数据。

我失去了这次的信息。我不能丢失这个信息,非常重要。我尝试用 C、C++ 和 Java 做服务器套接字,这种情况总是发生,并且 bug 出现的时间是偶然的,例如运行 App OK 2 小时,然后 bug 出现。有一天,我运行该应用程序,4 分钟后出现错误。我在我的 Nexus 5、Sony Tablet Z3 Compact 中运行该应用程序,我认为 SDK 中的套接字存在问题,因为它在所有设备上传递。

我发布了一些代码来了解我的代码。我不得不说CPU有4%的使用率。最后当socket客户端不读取时,服务器不断发送数据,但是这些数据在Android App中丢失了。我检查Linux PC中的客户端套接字,在Raspberry Pi,C,Java中,这个问题从未发生过

我尝试在 Android 中使用 Java.Nio 套接字,最后一次尝试使用 NDK 来查看在低级别中是否也出现此问题。有人有类似的问题或错误吗?谁能帮助我吗?

Date last_data = new Date();
InetAddress serverAddr = InetAddress.getByName(ip);
Socket socket = new Socket(serverAddr, port);
while(socket.isConnected()){
byte[] data_read = new byte[514];
//if(socket.getInputStream().available() > 0){
count = socket.getInputStream().read(data_read);
String read = new String(data_read).substring(0, count);

Date now = new Date();
long time = now.getTime() - last_data.getTime();
//long diffInSec = TimeUnit.MILLISECONDS.toSeconds(time);
if(time > 1200){
Log.d("LOG", "ERROR SOCKET TCP " + this.ip + ":" + this.port + " - Time: " + String.valueOf(time));
}
if (!read.isEmpty()) {
//Do something

//Renew Last data receive
last_data = new Date();
}else{
//Never entry
}
//}
}

感谢您的阅读和帮助。

最佳答案

String read = new String(data_read).....

应该是这样

String read = new String(data_read, 0, count).....

注意测试 isConnected() 不是终止该循环的正确方法。当对等点断开连接时,它不会神奇地变为 false。当 read() 返回 -1 或存在读取超时以外的 IOException 时,您应该终止。

关于java - Android 套接字读取字符串时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28373415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com