Android Studio:检查服务器套接字是否每隔X分钟打开/收听一次

时间:2016-04-25 18:21:15

标签: android sockets networking tcp ip

如果我的计算机上已打开TCP / IP服务器套接字,我会制作一个每X分钟检查一次的Android应用。如果是,它会建立连接并从中读取数据,如果没有,它会等待并尝试在X min再次连接......

当我首先打开服务器然后再打开客户端(手动)时,下面的代码工作一次,但是我无法让客户端继续检查服务器套接字是否基于时间打开/收听。 异步方法无法工作,因为我无法延迟,我无法使用Handler方法。

CheckserversocketeveryXmin.java

public class AppListener extends Async {

@Override
public void handleMessage(Message msg) {

    final Handler h = new Handler();
    final int delay = 5000; //milliseconds

    h.postDelayed(new Runnable() {
        public void run() {


            try {

                String msg_received = null;

                System.out.println("LISTENING FOR LAST INSTALLED APP");


                System.out.println("TRY");

                Socket socket = new Socket("85.190.178.23", 5050);

                // Get data sent through socket
                DataInputStream DIS = new DataInputStream(socket.getInputStream());

                System.out.println("DataInputStream Started");

                // read data that got sent
                msg_received = DIS.readUTF();

                System.out.println("Message from server" + msg_received);

                // Might not want to close socket, or only the first string will be sent and none after
                socket.close();


            } catch (Exception e) {
                System.out.println("Did not receive string");
            }


            h.postDelayed(this, delay);
        }
    }, delay);

}

}

现在我可能会犯这个错误,把这个代码放到我的主Activity中,由于某种原因它会每隔x秒尝试一次但是从来没有连接,因为如果我删除延迟,它就连接一次。

在Async中放置一个无限循环(我知道这不是技术上的好)并且等待/延迟是一个好方法吗?如果是这样,你们中的任何人都有一个指针:)

1 个答案:

答案 0 :(得分:0)

  

将此代码放入我的主Activity中,由于某种原因,它每隔x秒尝试一次,但从不进行连接

您可能是SDK 11+,因此您的处理程序正在抛出一个NetworkOnMainThreadException,您正在吞并你的阻止块

  

如果我删除了延迟

,它会在这里连接一次

您在Handler内声明了handleMessage变量,因此在将runnable发布到句柄后,您会立即删除对它的所有引用;它可能是垃圾收集。在AppListener

中创建两个变量成员变量