我在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%的使用率。最后当套接字客户端没有读取时,服务器会不断发送数据,但这些数据在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
}
//}
}
感谢您阅读和帮助。
答案 0 :(得分:0)
String read = new String(data_read).....
那应该是
String read = new String(data_read, 0, count).....
NB测试isConnected()
不是终止该循环的正确方法。当对等设备断开连接时,它不会神奇地变为错误。您应该在read()
返回-1时终止,或者除了读取超时之外还有IOException
。