java - 套接字未连接

标签 java android sockets tcpclient tcp

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

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() 永远不会成功的原因?

谢谢!

最佳答案

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

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

关于java - 套接字未连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46239549/

相关文章:

java - 将 JarEntry 转换为文件

android - 如何使用 Indy HTTP Get 命令正确终止线程?

c - 使用套接字发送/接收/操作字符串

java - ObjectOutput/InputStream 仅发送和接收对象一次

java - Mapbox 无法在 XML 布局 View 中呈现

javascript - 如何使用 javascript-client 关闭与 sse Flux 的连接?

java - Protobuf 映射类型 JSON 格式使用字符串文字 "key"和 "value"而不是实际值

android - 我如何在android中的 ListView 下方显示文本?

android - 如何检索存储在 sqlite 中的日期并将其转换为 timeStamp 以便能够将其与当前日期进行比较?

ios - 无论如何,有没有办法从 Swift 中的 socket.io 方法返回一些东西?