私は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)
すべてのソケットを閉じていないためかもしれないと思いましたが、コードを変更しました。新しいソケットが必要なときに作成するクラスが 1 つあり、それを閉じるために finalize メソッドを追加しました。ServerSocket を閉じるための finalize メソッドもあるので、何が問題なのかわかりません。
また、エラーが発生した後、すぐにプログラムを再実行すると、以前よりも早く問題が発生します。その後、しばらく待って実行すると、元の時間のように戻ります。
私は本当に問題を解決することができず、私は何年もの間それを理解しようとしてきました. 誰が問題が何であるか知っていますか?
前もって感謝します!
アップデート:
だから私はエラーがどこから来ているのかを理解しました、そしてそれは本当に奇妙です. 問題を引き起こしている次のコードがあります。
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();
}
}
ご覧のとおり、コードはソケットを開いて書き込む必要があります。ただし、上記のようにすべての機能コードがコメントアウトされている場合でも、ソケットが開かれてすぐに閉じられても、「バッファ領域がありません」というエラーが発生します。
これがなぜなのか、私には本当にわかりません。プログラムはマルチスレッド化されており、各スレッドは上記のメソッドを使用して定期的にオブジェクトを作成し、それを呼び出します。ソケットを作成して閉じる行が削除されると、エラーは発生しなくなりますが、そこにある場合、ソケットを開いてすぐに閉じてもエラーが発生します。
なぜこれが起こっているのか、誰にも手がかりがありますか?
どうもありがとう。