4

私のJavaコードは複数のスレッドを使用し、各スレッドはServerSocketを実行して受け入れます。これらのスレッドは、Java ソケットを使用して相互に通信します。121 スレッドではすべて問題なく動作しますが、256 スレッドで同じコードを実行すると、次のエラーが発生します。

java.net.SocketException: No buffer space available (maximum connections reached?): listen failed
    at java.net.PlainSocketImpl.socketListen(Native Method)
    at java.net.PlainSocketImpl.listen(Unknown Source)
    at java.net.ServerSocket.bind(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)
    at java.net.ServerSocket.<init>(Unknown Source)

私はWindows XP SP3を使用しています。このような投稿がいくつかあります(こちら)が、この問題の解決策を投稿する人はいません。TCP 接続の制限を削除するための Windows パッチもインストールしましたが、問題は解決しませんでした。

4

4 に答える 4

6

このメッセージは、接続が不足している可能性があることを示しています。あなたはそれをチェックしましたか?次を使用して、コマンドラインから開いているソケットを確認できます。

netstat -n

両側のすべてのソケットを閉じていることを確認します (finally ブロック内)。接続を受信した後も、リッスン ソケットは開いたままになることに注意してください。ソケットをすばやく開いたり閉じたりしないでください (問題に関連している可能性があるため、すぐに再利用できないと思います)。

ソケット関連のパフォーマンスを向上させるには、java.nio API を使用できますが、java.net よりもはるかに複雑です。

于 2011-06-15T20:00:49.340 に答える
4

この投稿にはあなたの答えがあると思います。ぶら下がっているソケットを放置すると、最大値に達する可能性があります (これは、Windows パッチが修正しない他の設定 (JVM 制限など) によって決定される可能性があります)。

余談ですが、それほど多くのスレッドで実行している場合は、Java の単純な Socket および ServerSocket クラスではなく、java.nio を使用した方がよい可能性が非常に高くなります。

このサイトは、 java.nio の使用方法と、単純な Socket および ServerSocket プログラミングの使用から得た ( Sun/Oracle の Java NIO API の参照とともに) どのようにそれを学んだかについての非常に優れたチュートリアルです。

具体的には、C++ select() 呼び出しがソケットで機能するのと同じ方法で、ソケット I/O を多重化できるようにするセレクターを使用することが原因に役立ちます。これは、ソケット コードのコアで、多数のスレッドがソケット I/O を処理することによる影響を軽減し、ソケットと直接やり取りするスレッドを 1 つだけにすることができることを意味します。

于 2011-06-15T19:45:55.160 に答える
2

ServerSocket 呼び出しを変更して問題を解決しました。私の誤りは、バックログの値を高く設定しすぎることです。サーバーが 5 ~ 6 接続以上リッスンする必要はありません。交換しました: ServerSocket sock=new ServerSocket(port,500); with ServerSocket sock=new ServerSocket(port,10); そして今、すべてがうまく機能しています!

于 2011-06-16T13:53:52.593 に答える