套接字android读取字符串上的错误

时间:2015-02-06 19:35:32

标签: java android c sockets

我在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
    }
    //}
}

感谢您阅读和帮助。

1 个答案:

答案 0 :(得分:0)

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

那应该是

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

NB测试isConnected()不是终止该循环的正确方法。当对等设备断开连接时,它不会神奇地变为错误。您应该在read()返回-1时终止,或者除了读取超时之外还有IOException