Как ждать соединение ServerSocket на клиентском сокете - PullRequest
1 голос
/ 10 декабря 2011

Мне интересно, как я могу ждать соединения ServerSocket на стороне клиента Socket.

Когда я сначала выполняю сервер (отправляю), он ожидает подключения клиента с помощью метода ServerSocket.accept. Проблема заключается в том, что клиент (прием) не может быть выполнен без предварительного запуска сервера. Я хотел бы добавить условие, чтобы позволить клиенту ждать соединения с сервера. Возможно ли это?

ОТПРАВИТЬ (сервер)

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

ПОЛУЧИТЬ (клиент)

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 ]

4 голосов
/ 10 декабря 2011

Нет встроенного способа сделать это. Вам придется перехватить исключение на стороне клиента и самостоятельно внедрить механизм повторных попыток.

Псевдо-код:

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
}

Будьте осторожны, если у вас есть графический интерфейс: вам может понадобиться реализовать это в отдельном потоке или использовать таймеры, чтобы избежать зависания вашего интерфейса.

2 голосов
/ 13 декабря 2011

Спасибо Мату, все работает.

    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
...