私はクライアントサーバーアプリケーションを持っています。複数のクライアントが指定されたポート、たとえば6001に接続されている場合、私は問題に直面しています。問題は、クライアントがサーバに接続されていて、コマンドkill -9 $ pid(pidがサーバアプリpidの場合)を使ってサーバを停止した場合、サーバを再起動している間にBIND Exception- Addressこれは、クライアントがサーバへの接続に失敗したために、クライアントが再び接続するためにポート6001が使用できないことを意味します。クライアントサーバーアプリケーションで接続用のポートを動的に選択
私はこれを解決する方法を探していました。ポートの範囲を動的に使用することを考えました。ここで
は私が思っていますものです:私はポートの範囲を提供しますXMLファイルに
代わりのポート番号をハードコード6001と6001から6005を言います。サーバーが起動すると、ポートをループして使用可能なポートを選択します。たとえば、サーバーが指定されたポート6001にバインドされたサーバーソケットを作成しようとしたときに、ポートが既に別のアプリケーションによってバインドされている場合は、6002ポートを選択するなどの例外があります。使用可能なポートがあれば、サーバーはサーバーSocketオブジェクトを作成し、そのポート上のクライアントの受信を開始します。
同様にクライアント側でも同様に、最初に6001で接続しようとします(失敗した場合は6002など)。これは、サーバーが待機している正しいポートに接続するまで続きます。
私の質問は、これが適切なアプローチかどうかです。また、クライアントが上記の方法で接続できる場合。
いいえ、上記の問題を解決する方法がありますか。ポート番号
は、さらなる使用のためにポートを解放し、それを与えることはありませんPIDを使用してプロセスを殺す:-wni TCP lsofを
ポートの使用を使用するプロセスのPIDを検索するに
プログラムを強制終了すると、ポートは使用可能になります。あなたのコードは、着信接続を処理するサブプロセスを起動しますか?もしそうなら、そのサブプロセスはまだ実行中ですか? –
他のプロセスが実行されているかどうかはわかりません。私はそれをどのように見つけることができますか?私のサーバーはSolaris上で動作しています。この問題は、Linuxでは複製されず、Windowsでは複製されません。サブプロセスを含むすべてのプロセスを終了させるコマンドを提供できますか? 以下は、サーバーを停止したときに実行されるコマンドです。 # #シャットダウンサーバー # kill_server(){ PID = 'server_pid' であれば[ "$ pidを"!= ""]; /bin/kill -9 $ pid エコーサーバーが停止しました。 else エコーサーバーが実行されていません。 fi } –