2017-04-23 5 views
0

私はクライアントサーバーアプリケーションを持っています。複数のクライアントが指定されたポート、たとえば6001に接続されている場合、私は問題に直面しています。問題は、クライアントがサーバに接続されていて、コマンドkill -9 $ pid(pidがサーバアプリpidの場合)を使ってサーバを停止した場合、サーバを再起動している間にBIND Exception- Addressこれは、クライアントがサーバへの接続に失敗したために、クライアントが再び接続するためにポート6001が使用できないことを意味します。クライアントサーバーアプリケーションで接続用のポートを動的に選択

私はこれを解決する方法を探していました。ポートの範囲を動的に使用することを考えました。ここで

は私が思っていますものです:私はポートの範囲を提供しますXMLファイルに

代わりのポート番号をハードコード6001と6001から6005を言います。サーバーが起動すると、ポートをループして使用可能なポートを選択します。たとえば、サーバーが指定されたポート6001にバインドされたサーバーソケットを作成しようとしたときに、ポートが既に別のアプリケーションによってバインドされている場合は、6002ポートを選択するなどの例外があります。使用可能なポートがあれば、サーバーはサーバーSocketオブジェクトを作成し、そのポート上のクライアントの受信を開始します。

同様にクライアント側でも同様に、最初に6001で接続しようとします(失敗した場合は6002など)。これは、サーバーが待機している正しいポートに接続するまで続きます。

私の質問は、これが適切なアプローチかどうかです。また、クライアントが上記の方法で接続できる場合。

いいえ、上記の問題を解決する方法がありますか。ポート番号

は、さらなる使用のためにポートを解放し、それを与えることはありませんPIDを使用してプロセスを殺す:-wni TCP lsofを

ポートの使用を使用するプロセスのPIDを検索するに

+0

プログラムを強制終了すると、ポートは使用可能になります。あなたのコードは、着信接続を処理するサブプロセスを起動しますか?もしそうなら、そのサブプロセスはまだ実行中ですか? –

+0

他のプロセスが実行されているかどうかはわかりません。私はそれをどのように見つけることができますか?私のサーバーはSolaris上で動作しています。この問題は、Linuxでは複製されず、Windowsでは複製されません。サブプロセスを含むすべてのプロセスを終了させるコマンドを提供できますか? 以下は、サーバーを停止したときに実行されるコマンドです。 # #シャットダウンサーバー # kill_server(){ PID = 'server_pid' であれば[ "$ pidを"!= ""]; /bin/kill -9 $ pid エコーサーバーが停止しました。 else エコーサーバーが実行されていません。 fi } –

答えて

0

"already in"エラーを使用しています。これはあなたの問題を解決します。クライアントからのアクセス用に単一のポートを持つ方が良い方法です。

+0

私はSolarisを使用しています。私はこのコマンドがsolarisでは動作しないと思う。あなたはsolarisのコマンドを知っていますか? –

+0

solarisのlsofに相当するスクリプトについてのリンクを参照してください。http://stackoverflow.com/questions/20670400/equivalent-lsof-i-in-solaris – OTM

1

はあなたのServerSocketので、作成する必要があります。

ServerSocket ss = new ServerSocket(); // NB no parameters 
ss.setReuseaddress(true); 
ss.bind(new InetSocketAddress(port)); 

は、これは、TIME-WAIT状態で左オーバー接続がある場合でも、サーバソケットをバインドするために大丈夫だオペレーティングシステムに指示します。アプリケーションの実行中のインスタンスがまだ残っている場合は、最初に停止する必要があります。

ポート範囲のものは忘れてしまいます。

+0

ss.bind(port);またはss.bind(新しいInetSocketAddress(port)); ? また、ss.bindの使用方法は? setReuseAddressだけを使用すればどうなりますか? あなたの返答には都合の良い方法で! –

+0

はい、 'bind(新しいInetSocketAddress(port))'です。 'setReuseAddress()'は* bind *に先行すべきであり、それはその代用ではありません。 – EJP

関連する問題