套接字超时和取消

4

我在AsyncTask中运行以下代码:

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

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


那不正确。如果主机根本没有响应,可能需要约七十秒钟的时间,这只会在存在网络中断或防火墙时发生。如果主机有响应,您将在一两秒钟内获得连接或“连接被拒绝”。 - user207421
不存在的主机在1-2秒内得到处理。顺便问一下,你的笔记有帮助解决这个问题吗(这个问题已经解决了)? - Alex F
3个回答

5

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

socket = new Socket();

那么使用。
socket.connect(remoteAddress, timeout);

请参阅http://developer.android.com/reference/java/net/Socket.html获取更多信息。
-- 更新 --
我最初没有注意到您询问如何取消套接字连接。虽然我不是特别熟悉套接字编程,但看起来您应该这样做:
1. 调用异步任务上的cancel方法,就像您似乎已经尝试过的那样。 2. 重写/实现异步任务上的onCancelled方法。在实现中,您将需要使用对套接字的引用(使其成为类实例变量)并调用套接字的close()方法。请确保详细了解如何关闭套接字,并确保适当处理输入/输出流的异常,以避免应用程序崩溃。有关在关闭套接字方面的更多信息,请查看问题。

1

您需要先创建一个套接字,然后在其中使用以下方法。

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

0
你可以这样做:
Socket soc = null;
while(soc == null){
    try{
        soc = new Socket("x.x.x.x", portNumber);
    }
    catch(Exception ex){
    }
}

自从:

socket.connect(remoteAddress, timeout)

众所周知,它不可靠,你可以编写自己的超时版本。我编写的代码无限等待连接,但你可以非常容易地引入一个计时器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接