2016-04-04 17 views
0

カスタマイズされたルーティングポリシーがある可能性があるため、ユーザーにターゲットサーバーに接続する特定のローカルアドレスを自由に選択させたい、ローカルポートのアベイラビリティを手動でテストする必要があるかもしれないので、一時的なポートを指定するのではなく、一時的なポートを取得するようにしてください。Javaソケット:指定されたポート番号を持たないソケットに特定のローカルアドレスをバインドする方法

"Socket"と "InetSocketAddress"のコンストラクタを調べたところ、(ローカルアドレスとエフェメラルポートを同時に取得することはできますが)上記の作業を行う人がいないようです。メソッドを呼び出して初期化します。

答えて

0

あなたの条件に適していなければならないコンストラクタ

public Socket(InetAddress address, 
    int port, 
    InetAddress localAddr, 
    int localPort) 
    throws IOException 

があります。 localPortが0の場合、システムはフリーポートを選択します。

+0

こんにちは@ammoQに適合させることができ、このコンストラクタは、localPortではを指定する必要があります。 – howToDeleteMyAccount

+0

こんにちは@ammoQ、申し訳ありませんが、私は最後の文に気付かなかった。それを試してみましょう。 – howToDeleteMyAccount

+0

@ammoQありがとう、はい、これは動作します。私は低いランクのためにあなたのために+1することはできません。 – howToDeleteMyAccount

1

Socketを作成し、後でそれを呼び出すことができます。

Socket socket = new Socket(); // no idea where to connect 

socket.connect(addressAndPort); // now I know. 

私は何をやっていることはテスト目的のためにTCPRegistryを持っています。このコンポーネントはエイリアスポートを処理します。例えばhost.port1。それはサーバー上の一時的なポートを提供し、クライアントが同じ文字列を使用して接続できるようにします。

注:サーバーの前でクライアントを起動できるように、これらのServerSocketをユニットテストで事前ビルドするように要求することができます。

最後に、テストの最後に、すべてのソケットとサーバーソケットが閉じていることを確認するか、強制的にクリーンアップします。

これは、NIOのために設計されていますが、プレーンなIO TCPRegistry

+0

こんにちは@ピーター、それはピアノード(サーバー)アドレスとポートを指定する "接続"によって。私がしたいのは、ローカルポートを指定せずにローカルアドレスを指定/バインドすることです。ローカルポートを指定しない理由は、ローカルポートの可用性テストを回避するだけでなく、マルチソケット接続を行う際に占有/解放されたポートのリストを維持しないようにするためです。 – howToDeleteMyAccount

+0

@zipperこれをやりたくないかもしれませんが、接続したいホストとポートを知らなくても接続を作成することはできません。私はコンポーネント/サービスを使用して、どのポートが何に使用されているかを管理することをお勧めします。 –

関連する問題