0

Linux Mint 14 KDE を使用しています。Java tcp サーバーとクライアントを正常に作成しました。サーバー IP: ポートは 10.10.1.10:9900 で、クライアント IP: ポートは 10.10.1.10:9901 です。初めてクライアントに接続すると、すべて問題ありません。クライアントは接続してデータを送信し、切断します。切断した直後にクライアントをサーバーに接続しようとすると、次の例外が発生します。

java.net.BindException: Address already in use

1分以上待てばOKです。他のフォーラムで、ソケットを閉じた後、60 秒 (1 分) の tcp time_wait があることを読みました。0 に変更した後、すべてが機能しました (誰かが変更したい場合は、この行net.ipv4.tcp_fin_timeout=0/etc/sysctl.confに追加し、ターミナルでこの行をルートサービス ネットワークの再起動として実行します)。翌日、もう 1 つテストを実行しようとしましたが、同じ例外が発生しました。時間が 0 のままかどうかを確認しました (コマンド ラインcat /proc/sys/net/ipv4/tcp_fin_timeoutに root としてこれを書き込むことで確認できます)。0 でした。クライアントに再接続するまで 1 分待たなければなりませんでした。

この例外が発生しないように、誰かがそのように構成する方法を手伝ってくれますか? 1 分待つのは、リアルタイム アプリケーションには多すぎます。OSに空きのポート番号を動的に割り当てさせることでこれを実行できることはわかっていますが、それは私のアプリケーションが必要とするものではありません。

4

2 に答える 2

1

クライアント ソケットを作成した後、それをバインドする前、またはリモート サーバーに接続する前にSocket.setReuseAddress(true)、クライアント ポートの再利用を有効にするために呼び出す必要があります。

于 2013-08-09T13:41:03.337 に答える
0

固定クライアント ポートを指定しないでください。ゼロを使用してください。そうすれば、毎回、または使い果たすまで新しいものを取得できます。つまり、クライアントで接続プールを行う必要があります。

于 2013-08-11T23:28:21.480 に答える