Необъяснимое SocketException в клиенте Java, соединяющемся с localhost - PullRequest
1 голос
/ 09 июля 2010

У меня есть программа Java, работающая на iSeries, которая подключается к процессу сервера на том же хосте.Вот отредактированная версия клиентского кода Java:

while (true) {         
 try {
  socket = new Socket(myHost, myPort);
 } catch (UnknownHostException ex) {
  // Quit
 } catch (ConnectException ex) {
  // Wait for a while and retry
  continue;
 } catch (IOException ex) {
  // Quit
 }
 break;
}

// Do stuff with socket...

Иногда, при вызове конструктора Socket (), я получаю SocketException, который попадает в обработчик IOException, который выходит из приложения (это может быть немного резкимреакция, но я не хочу менять это, пока не пойму проблему более полно).Вот трассировка стека:

java.net.SocketException: A connection with a remote socket was reset by that  
 at java.lang.Throwable.<init>(Throwable.java:195)                             
 at java.lang.Exception.<init>(Exception.java:41)                              
 at java.io.IOException.<init>(IOException.java:40)                            
 at java.net.SocketException.<init>(SocketException.java:29)                
 at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:305)            
 at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:158)              
 at java.net.Socket.connect(Socket.java:488)                                
 at java.net.Socket.connect(Socket.java:438)                                
 at java.net.Socket.<init>(Socket.java:148) 
 at com.foo.AccessObject.<init>(AccessObject.java:36)  

Я понимаю, что если я читаю из сокета, а другой узел закрывает его, я получу исключение SocketException.Я также понимаю, что в случае сбоя соединения я получу исключение ConnectionException.Чего я не понимаю, так это как получить SocketException при создании Socket.Я думаю, что могу устранить хитрые сетевые устройства, так как соединение идет к localhost.

Я потенциально могу обойти эту проблему, перехватывая SocketException вместо ConnectionException, но я не хочу маскировать эту проблему, по крайней мере, пока не пойму ее больше.У кого-нибудь есть идеи о том, что может быть причиной ошибки?

1 Ответ

2 голосов
/ 09 июля 2010

Вероятной причиной может быть то, что ваша система исчерпала (иногда) порты, которые создает Socket (). Использование пула соединений может быть полезным. Это поможет избежать создания нового Socket каждый раз, если это приемлемый вариант в вашем случае.

Для linux количество открытых сокетов может быть указано командой

netstat -n.

Предел количества открытых файлов (linux рассматривает сокеты как файлы) можно проверить с помощью команды,

ULIMIT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...