【问题标题】:Socket timeout and cancellation套接字超时和取消
【发布时间】:2012-10-05 06:16:27
【问题描述】:

我在 AsyncTask 中运行了以下代码:

套接字 = 新套接字(主机,Integer.parseInt(端口));

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

【问题讨论】:

  • 这不正确。 如果主机根本没有响应,这可能需要大约 70 秒,这只有在网络中断或防火墙阻碍时才会发生。如果主机响应,您将在一两秒内获得连接或“连接被拒绝”。
  • 不存在的主机在 1-2 秒内被处理。顺便说一句,您的笔记是否有助于解决问题(已经解决)?

标签: java android sockets


【解决方案1】:

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

socket = new Socket();

然后使用

socket.connect(remoteAddress, timeout);

更多信息请参见http://developer.android.com/reference/java/net/Socket.html

-- 更新--

我最初没有注意到您询问如何取消套接字连接。 虽然我对套接字编程并不熟悉,但看起来你会这样做:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以这样做:

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

      自:

      socket.connect(remoteAddress, timeout)
      

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

      【讨论】:

        猜你喜欢
        • 2013-05-23
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 2017-10-29
        • 1970-01-01
        相关资源
        最近更新 更多