如何在客户端Socket上等待ServerSocket连接

时间:2011-12-10 11:58:22

标签: java sockets serversocket

我想知道如何在Socket客户端等待ServerSocket连接。

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

发送(服务器)

ServerSocket servsock = new ServerSocket(1234);
Socket sock = servsock.accept();

RECEIVE(客户)

Socket sock = new Socket(from, 1234);

错误(客户)

java.net.ConnectException: Connection refused
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)

谢谢。

2 个答案:

答案 0 :(得分:4)

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

的伪代码:

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
}

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

答案 1 :(得分:2)

感谢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