【问题标题】:Socket does not connect [duplicate]套接字不连接[重复]
【发布时间】:2017-09-24 07:15:02
【问题描述】:

在我的应用程序中,我正在循环等待服务器可用:

Socket sock=new Socket(); // create the socket object
while (running)           // a more or less endless loop
{
   try
   {
      sock.connect(new InetSocketAddress(data.host,11355),1000); // try to connect to the server

      ...
      // when everything goes well, we do something with the "sock"

   }
   catch (IOException ioe)
   {
      // conection could not be established
      try
      {
         Thread.sleep(1000); // wait for one second until next connection attempt
      }
      catch (InterruptedException ie)
      {

      }
   }
}

这个想法是尝试建立与服务器的连接,当连接失败时,connect() 会抛出异常,我会在延迟一秒后重试。

我的问题:它不起作用。当服务器在应用程序启动时不可用但稍后可以访问时,connect() 不成功,它无法连接到服务器。此代码仅在服务器可用于第一个 connect() 的情况下才能正常工作。

那么这里有什么问题呢?我必须以某种方式重置套接字吗?或者还有什么可能是后来调用 connect() 永远不会成功的原因?

谢谢!

【问题讨论】:

  • @LunarWatcher ??他不是在监听客户端连接,而是想以作为客户端连接。
  • @LunarWatcher 你在说什么?服务器在另一端。如果它没有在监听,连接将失败。这正是这里发生的事情。问题是为什么当服务器可用时它仍然失败。
  • @LunarWatcher 这不是服务器问题,连接到它可以与其他类型的客户端正常工作。如果你能这么好心地专注于这个问题而不是给毫无意义的 cmets,那就太好了
  • 嗯,不确定连接异常后对象的状态是否保持错误状态。您是否尝试过在 catch 块中简单地执行 sock = new Socket();
  • 如 API 中所述“一旦套接字被关闭,它就不能用于进一步的网络使用(即不能重新连接或重新连接)。需要创建一个新的套接字。”

标签: java android sockets tcpclient tcp-ip


【解决方案1】:

socket 会记住其错误状态,不能用于重试connect()。您必须在每个connect() 之前创建一个新套接字。套接字很便宜,所以我不会担心开销。

或者,您可以在尝试connect() 之前尝试 ping 服务器,但我认为这不值得付出努力(而且它的健壮性也会降低)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2012-09-06
    • 2014-10-21
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多