Я пишу сетевую программу на Java. Я использую объекты ServerSocket и Socket для отправки и получения сообщений с использованием TCP. Моя программа работает нормально, если выполняется в течение короткого времени, однако, если я запускаю ее в течение более длительного времени, я получаю следующую ошибку:
java.net.SocketException: No buffer space available (maximum connections reached?): connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
Я подумал, что это может быть из-за того, что я не закрываю все сокеты, но я изменил свой код: у меня есть один класс, который я создаю, когда хочу новый сокет, и добавил метод finalize для его закрытия. У меня также есть метод finalize для закрытия ServerSocket, поэтому я не знаю, в чем проблема.
Кроме того, после того, как я получаю ошибку, если я сразу же снова запускаю программу, она сталкивается с проблемой быстрее, чем раньше. Затем, если я подожду некоторое время и запустлю его, он вернется к исходному времени.
Я действительно не могу решить проблему, и я пытался понять это целую вечность. Кто-нибудь знает, в чем проблема?
Заранее спасибо!
UPDATE:
Итак, я выяснил, откуда возникла ошибка, и это действительно странно. У меня есть следующий код, который вызывает проблему:
try {
sock = new Socket(InetAddress.getByName(ipaddr), port);
sock.close();
// os = sock.getOutputStream();
// byte[] arr = s.getBytes();
// os.write(arr);
// os.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
sock.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Как видите, код должен открыть сокет и записать в него. Однако даже когда весь функциональный код закомментирован, как указано выше, поэтому сокет просто открывается, а затем сразу закрывается, я все равно получаю ошибку «нет места в буфере».
Я действительно не могу понять, почему это так. Программа является многопоточной, и каждый поток периодически создает объекты с помощью вышеуказанного метода и вызывает его. Когда строки для создания и закрытия сокета удалены, я больше не получаю сообщение об ошибке, но когда они есть, даже если сокет открывается и сразу закрывается, я получаю сообщение об ошибке.
Кто-нибудь знает, почему это происходит?
Большое спасибо.