如何使用后台线程检查套接字是否已连接

时间:2013-03-26 05:39:59

标签: java android sockets

我正在开发应用程序,其中我在读取和写入套接字之前检查端口的可用性。我正在使用以下代码来检查状态

private boolean isAvailable(String host, int port) {
        try {
            Socket socket = new Socket();
            socket.connect(new InetSocketAddress(host, port), 1000);
            isPortAvailable = socket.isConnected();
        } catch (IOException e) {
            isPortAvailable = false;
        }
        return isPortAvailable;
    }

此后我在onClick()

上查看此状态
if (isAvailable(ip, Integer.parseInt(portLVR))) {
    startActivity(new Intent(getApplicationContext(),ActivityLivingRoom.class));
} else
    Toast.makeText(getApplicationContext(),"Connection Error !", Toast.LENGTH_SHORT).show();

但我的问题是如果我在主线程上检查这个状态,那么android会给我networkonMainThradException所以我如何使用后台线程管理这个操作?

4 个答案:

答案 0 :(得分:1)

试试这个

 private class SocketCheckTask extends AsyncTask<String , Integer , Boolean> {
       String classname="";
     public SocketCheckTask (String classname) {
              this.classname=classname;
    } 
@Override
protected Boolean doInBackground(String... params) {
    return isAvailable(params[0], Integer.parseInt(params[1]);
  }

@Override
protected void onPostExecute(Boolean isAvailable) {
   if (isAvailable)) {
     Class c=Class.forName("yourpackage"+classname);
startActivity(new Intent(getApplicationContext(),c));
     } else
Toast.makeText(getApplicationContext(),"Connection Error !", Toast.LENGTH_SHORT).show();
     }
}

然后像这样发送

 SocketCheckTask task=new SocketCheckTask ("ActivityLivingRoom");
task.execute(ipadress,port);

答案 1 :(得分:0)

像这样:

private class CheckAvailabilityTask extends AsyncTask<Void, Void, Boolean> {
    String ip;
    int port;

    public CheckAvailabilityTask(String ip, int port) {
        this.ip = ip;
        this.port = port;
    }
    @Override
    protected Boolean doInBackground(Void... params) {
        return isAvailable(this.ip, this.port);
    }

    @Override
    protected void onPostExecute(Boolean isAvailable) {
        if (iisAvailable) {
            startActivity(new Intent(getApplicationContext(),ActivityLivingRoom.class));
        } else
        Toast.makeText(getApplicationContext(),"Connection Error !", Toast.LENGTH_SHORT).show();
    }
}

onClick()事件中:

new CheckAvailabilityTask(IP, PORT).execute();

答案 2 :(得分:0)

我认为最好的解决方案是,在click事件上启动一个新线程,并将你的开始活动代码放在同一个线程中。

如果您正在使用Toast,则可以从该线程执行此操作,但如果您计划更新UI(如红色/绿色状态),则必须使用处理程序和消息。

仅供参考,Asynctask只是删除了Thread的实现,并向人们展示了一个很好的抽象。

答案 3 :(得分:0)

您无法打开套接字并且永远不会关闭它以确定host:port是否可用。

测试任何服务或资源是否可用的唯一真正方法是尝试使用它。

只需在需要时执行连接和I / O,并在此时处理生成的异常。无论如何你必须抓住它们。

不要编写试图预测未来的代码。