Java 如何在客户端套接字上等待服务器套接字连接

Java 如何在客户端套接字上等待服务器套接字连接,java,sockets,serversocket,Java,Sockets,Serversocket,我想知道,如何在套接字客户端等待服务器套接字连接 当我首先执行服务器(send)时,它使用ServerSocket.accept方法等待客户端连接。问题在于,如果没有先执行服务器,则无法执行客户机(接收)。我想添加一个条件,允许客户端等待来自服务器的连接。可能吗 发送(服务器) 接收(客户) 错误(客户端) java.net.ConnectException:连接被拒绝 位于java.net.PlainSocketImpl.socketConnect(本机方法) 位于java.net.Plain

我想知道,如何在套接字客户端等待服务器套接字连接

当我首先执行服务器(send)时,它使用ServerSocket.accept方法等待客户端连接。问题在于,如果没有先执行服务器,则无法执行客户机(接收)。我想添加一个条件,允许客户端等待来自服务器的连接。可能吗

发送(服务器)

接收(客户)

错误(客户端)

java.net.ConnectException:连接被拒绝
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
位于java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
在java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
位于java.net.socksocketimpl.connect(socksocketimpl.java:432)
位于java.net.Socket.connect(Socket.java:529)
位于java.net.Socket.connect(Socket.java:478)
位于java.net.Socket(Socket.java:375)
位于java.net.Socket(Socket.java:189)

谢谢。

没有内置的方法可以做到这一点。您必须在客户端捕获异常,并自己实现重试机制

伪代码:

Socket sock = null;
while (retryCounter < threshold) {
  try {
   retryCounter++;
   sock = new Socket(form, 1234);
  } catch (...) {
    // handle exceptions
    // possibly add a sleep period
  }
}
if (sock == null) {
  // you failed to connect
} else {
  // you're connected
}
socketsock=null;
while(retryCounter<阈值){
试一试{
retryCounter++;
sock=新插座(表1234);
}捕获(…){
//处理异常
//可能再加上一段睡眠时间
}
}
if(sock==null){
//你无法连接
}否则{
//你接通了
}

如果您有GUI,请小心:您可能需要在单独的线程中实现其中的一些功能,或者使用计时器来避免冻结您的UI。

没有内置的方法可以做到这一点。您必须在客户端捕获异常,并自己实现重试机制

伪代码:

Socket sock = null;
while (retryCounter < threshold) {
  try {
   retryCounter++;
   sock = new Socket(form, 1234);
  } catch (...) {
    // handle exceptions
    // possibly add a sleep period
  }
}
if (sock == null) {
  // you failed to connect
} else {
  // you're connected
}
socketsock=null;
while(retryCounter<阈值){
试一试{
retryCounter++;
sock=新插座(表1234);
}捕获(…){
//处理异常
//可能再加上一段睡眠时间
}
}
if(sock==null){
//你无法连接
}否则{
//你接通了
}

如果您有GUI,请小心:您可能需要在单独的线程中实现其中一些功能,或者使用计时器来避免冻结您的UI。

感谢Mat,它可以正常工作

    Socket sock = null;
    while (true) {
      try {
       sock = new Socket(from, 1234);
       if (sock != null) { break; }
       }
      catch (IOException e) { Thread.sleep(1000); }
    }
    // rest of the code

感谢Mat,它起作用了

    Socket sock = null;
    while (true) {
      try {
       sock = new Socket(from, 1234);
       if (sock != null) { break; }
       }
      catch (IOException e) { Thread.sleep(1000); }
    }
    // rest of the code

我应该在catch(…)中添加什么?您应该处理希望重试的异常。当发生这种情况时,在某个地方记录一些东西,如果出现“致命”异常(即重试无法解决的异常),则退出。这是非常通用的,这完全取决于您的应用程序需要什么。对不起,我不明白。有没有一种简单的方法,比如发送ping或连接测试?这是一种连接测试。平一点帮助都没有。这并不复杂,只是一个循环中的尝试/捕捉。如果您觉得奇怪,请将try/catch移到单独的函数中。我应该在catch(…)中添加什么?您应该处理要重试的异常。当发生这种情况时,在某个地方记录一些东西,如果出现“致命”异常(即重试无法解决的异常),则退出。这是非常通用的,这完全取决于您的应用程序需要什么。对不起,我不明白。有没有一种简单的方法,比如发送ping或连接测试?这是一种连接测试。平一点帮助都没有。这并不复杂,只是一个循环中的尝试/捕捉。如果您觉得奇怪,请将try/catch移动到一个单独的函数。
sock
在您测试它的地方不可能为空。Just
break
sock
在您测试它的地方不可能为空。只需
中断
    Socket sock = null;
    while (true) {
      try {
       sock = new Socket(from, 1234);
       if (sock != null) { break; }
       }
      catch (IOException e) { Thread.sleep(1000); }
    }
    // rest of the code