11

私の Tomcat インスタンスは複数の IP アドレスをリッスンしていますが、ファイルを開くときにどのソース IP アドレスを使用するかを制御したいと考えていますURLConnection

これを指定するにはどうすればよいですか?

4

4 に答える 4

6

これでうまくいくはずです:

URL url = new URL(yourUrlHere);
Proxy proxy = new Proxy(Proxy.Type.DIRECT, 
    new InetSocketAddress( 
        InetAddress.getByAddress(
            new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);

そして、これで完了です。例外を適切に処理することを忘れないでください。もちろん、シナリオに合わせて値を変更してください。

ああ、私はインポートステートメントを省略しました

于 2008-09-18T12:34:34.013 に答える
3

Apache commons HttpClient を使用すると、次のように動作することもわかりました (わかりやすくするために、try/catch を削除しました)。

HostConfiguration hostConfiguration = new HostConfiguration();
byte b[] = new byte[4];
b[0] = new Integer(192).byteValue();
b[1] = new Integer(168).byteValue();
b[2] = new Integer(1).byteValue();
b[3] = new Integer(11).byteValue();

hostConfiguration.setLocalAddress(InetAddress.getByAddress(b));

HttpClient client = new HttpClient();
client.setHostConfiguration(hostConfiguration);
GetMethod method = new GetMethod("http://remoteserver/");
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
    new DefaultHttpMethodRetryHandler(3, false));
int statusCode = client.executeMethod(method);

if (statusCode != HttpStatus.SC_OK) {
    System.err.println("Method failed: " + method.getStatusLine());
}

byte[] responseBody = method.getResponseBody();
System.out.println(new String(responseBody));");

ただし、IP のゲートウェイ (この場合は 192.168.1.11) がダウンした場合はどうなるのだろうか。次のゲートウェイが試行されますか、それとも失敗しますか?

于 2008-09-18T14:45:51.293 に答える
1

明らかな移植性のある方法は、URL.openConnection でプロキシを設定することです。プロキシはローカル ホストに置くことができ、クライアント ソケットのローカル アドレスをバインドする非常に単純なプロキシを作成できます。

URL が接続されているソースを変更できない場合は、URL コンストラクターを呼び出すとき、または URL.setURLStreamHandlerFactory を介してグローバルに URLStreamHandler を置き換えることができます。URLStreamHandler は、openConnection 呼び出しを変更して、デフォルトの http/https ハンドラーに委譲できます。

より極端な方法は、ハンドラーを完全に置き換えることです (おそらく、JRE の実装を拡張します)。または、代替 (オープン ソース) の http クライアントを利用できます。

于 2008-09-18T12:19:35.950 に答える