Java RMIアプリケーションでは、ローカルと異なるホストの両方で動作するインスタンスを持つことができます。後者の場合は、発信IPアドレスを取得してシステムプロパティjava.rmi.server.hostNameの引数として設定する方法はありますか?Java RMIで発信IPアドレスを取得
今はハードワイヤードですが、それは望ましい解決策ではありません。
Java RMIアプリケーションでは、ローカルと異なるホストの両方で動作するインスタンスを持つことができます。後者の場合は、発信IPアドレスを取得してシステムプロパティjava.rmi.server.hostNameの引数として設定する方法はありますか?Java RMIで発信IPアドレスを取得
今はハードワイヤードですが、それは望ましい解決策ではありません。
あなたは、従来のJavaの方法を使用することができます:あなたはこれを必要と考える理由
try {
InetAddress addr = InetAddress.getLocalHost();
// Get IP Address
byte[] ipAddr = addr.getAddress();
// Get hostname
String hostname = addr.getHostName();
} catch (UnknownHostException e) {
}
は、私は理解していません。発信スタブの送信元アドレスは、ホストのIPアドレスに自動的に設定されます。このプロパティを設定する必要があるのは、デフォルト設定が正しくない場合のみです。複数のNICがあり、1つだけを経由してエクスポートしたい場合や、IPアドレスではなくホスト名を127.0.0.1にマッピングするLinuxの設定ミスがある場合などです。
以下は、利用可能なすべての非ループバックIPv4アドレスをホストに表示します。 IPv6アドレスも簡単に変更できます。
public static void main(String...args) {
List<InetAddress> addresses = getNonLocalIPV4Addresses();
for (InetAddress addr: addresses) {
System.out.println("address: " + addr.getHostAddress());
}
}
/**
* Get a list of all known non-local IP v4 addresses for the current host.
* @return a List of <code>InetAddress</code>, may be empty but never null.
*/
public static List<InetAddress> getNonLocalIPV4Addresses() {
return getIPAddresses(new InetAddressFilter() {
public boolean accepts(InetAddress addr) {
return (addr instanceof Inet4Address)
&& !(addr.isLoopbackAddress()) || "localhost".equals(addr.getHostName()));
}
});
}
/**
* Get a list of all known IP addresses for the current host,
* according to the specified filter.
* @param filter filters out unwanted addresses.
* @return a List of <code>InetAddress</code>, may be empty but never null.
*/
public static List<InetAddress> getIPAddresses(InetAddressFilter filter) {
List<InetAddress> list = new ArrayList<InetAddress>();
try {
Enumeration<NetworkInterface> interfaces =
NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
Enumeration<InetAddress> addresses = ni.getInetAddresses();
while (addresses.hasMoreElements()) {
InetAddress addr = addresses.nextElement();
if ((filter == null) || filter.accepts(addr)) list.add(addr);
}
}
} catch(Exception e) {
e.printStackTrace();
}
return list;
}
/**
* Filter interface for the methods discovering available IP addresses.
*/
public interface InetAddressFilter {
/**
* Determine whether the specified address is accepted.
* @param addr the address to check.
* @return true if the address is accepted, false otherwise.
*/
boolean accepts(InetAddress addr);
}
サーバーがNATファイアウォールの内側にある場合、発信ホストIPがクライアントに表示されない可能性があることを考慮してください。 –