套接字超时和取消

时间:2012-10-05 06:16:28

标签: java android sockets

我在AsyncTask中运行以下代码:

    socket = new Socket(host, Integer.parseInt(port));

如果主机名正确,但端口上没有套接字服务器监听,则该行可能会在抛出异常之前工作几分钟。我可以设置通讯超时吗?此外,是否可以停止此过程 - 目前它不会对AsyncTask.cancel调用做出反应。

3 个答案:

答案 0 :(得分:5)

使用no参数构造器创建套接字,如下所示:

socket = new Socket();

然后使用

socket.connect(remoteAddress, timeout);

有关详细信息,请参阅http://developer.android.com/reference/java/net/Socket.html

- 更新 -

我原先没有注意到你问过如何取消套接字连接。 虽然我不熟悉套接字编程,但看起来你会这样做:

  1. 在asynctask上调用取消,就像你似乎已经尝试过一样。
  2. 覆盖/实施异步任务的onCancelled方法。在实现中,您将需要使用对套接字的引用(使其成为类实例变量),并调用套接字的close()方法。请务必阅读关闭套接字并确保正确处理输入/输出流的异常,以确保您的应用程序不会崩溃。有关关闭套接字的详细信息,请查看this问题。

答案 1 :(得分:1)

您必须先创建套接字,然后在其中使用以下方法。

Socket client=new Socket();   
client.connect(new InetSocketAddress(hostip,port_num),connection_time_out); 

答案 2 :(得分:0)

你可以这样做:

Socket soc = null;
while(soc == null){
    try{
        soc = new Socket("x.x.x.x", portNumber);
    }
    catch(Exception ex){
    }
}

自:

socket.connect(remoteAddress, timeout)

出了名的不可靠,您可以编写自己的超时版本。我写的代码无限期地等待连接,但你可以很容易地引入一个计时器。