Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java socketandroid读取字符串时出现错误_Java_Android_C_Sockets - Fatal编程技术网

Java socketandroid读取字符串时出现错误

Java socketandroid读取字符串时出现错误,java,android,c,sockets,Java,Android,C,Sockets,我有一个Android应用程序。此应用程序有不同的线程。每个线程都是一个套接字客户端TCP。服务器每秒向我发送320个字符。通常连接是稳定的,可以正确地接收字符串,但有时一个套接字或所有套接字停止接收数据,并且在(5秒到50秒)之后的几秒钟内,套接字继续接收数据 我失去了这次的信息。我不能丢失这个信息,这是非常重要的。我尝试在C、C++和java中做服务器套接字,这种情况总是发生,bug时间是偶然的,例如运行APP OK 2小时,然后出现bug。前几天我运行了这个应用程序,4分钟后错误出现了。我

我有一个Android应用程序。此应用程序有不同的线程。每个线程都是一个套接字客户端TCP。服务器每秒向我发送320个字符。通常连接是稳定的,可以正确地接收字符串,但有时一个套接字或所有套接字停止接收数据,并且在(5秒到50秒)之后的几秒钟内,套接字继续接收数据

我失去了这次的信息。我不能丢失这个信息,这是非常重要的。我尝试在C、C++和java中做服务器套接字,这种情况总是发生,bug时间是偶然的,例如运行APP OK 2小时,然后出现bug。前几天我运行了这个应用程序,4分钟后错误出现了。我在我的Nexus5、索尼平板电脑Z3Compact中运行该应用程序,我认为SDK中的套接字存在问题,因为所有设备都会传递

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

我尝试在Android中使用Java.Nio sockets,最后一次尝试使用NDK来查看是否在低级别也出现了这个问题。有人有类似的问题或bug吗?有人能帮我吗

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()
不是终止该循环的正确方法。当对等机断开连接时,它不会神奇地变成错误。当代码< > Read()/代码>返回1或有一个“代码> iOExtExo/<代码>以外的读取超时。<此代码>不是C++,但您标记为代码> C++ >代码>。我的问题在Socket。GETInPoT流()中。即使服务器正在发送数据,他也阻止并不读取数据。秒后继续读取更多数据,但不明白为什么不读取一些秒。