String
にドット付き10進表記のローカルIPアドレスがあります。 InetAddress
に変換してSocket
にフィードしたいのですが、DNSルックアップを行わずに実行する必要があります(これにより、タイムアウトが長くなる可能性があるため)。
そのための準備ができたメソッドはありますか、またはString
を分割してそのバイトからInetAddress
を作成する必要がありますか?
pdateファクトリメソッドInetAddress.getByName()
とInetAddress.getByAddress()
は、どちらもJava.Sun.com
などのホスト名も受け入れるため、適切ではないようです。彼らが実装でDNSサーバーに接続しようとするかどうかは明らかではありません。
このようにしてください
InetAddress inetAddress = InetAddress.getByName("192.168.0.105");
リテラルIPアドレスが指定されている場合、アドレス形式の有効性のみがチェックされます。
Javaソースコード
// if Host is an IP address, we won't do further lookup if (Character.digit(Host.charAt(0), 16) != -1 || (Host.charAt(0) == ':')) { }
GuavaのInetAddresses#forString()
を使用できます。これは、具体的にユースケースに文書化されています。
指定された文字列表現を持つ
InetAddress
を返します。
これにより、すべてのネームサービス検索が意図的に回避されます(例:DNSなし)。
(強調を追加)
オープンソースのIPAddress Javaライブラリ は、IPv6およびIPv4のすべての標準表現を検証し、DNSルックアップなしで検証します。免責事項:私はそのライブラリのプロジェクトマネージャーです。
次のコードは、要求していることを実行します。
String str = "fe80:0:0:0:f06c:31b8:cd17:5a44";
try {
IPAddressString str = new IPAddressString(str);
IPAddress addr = str.toAddress();//throws if invalid, without a DNS lookup
InetAddress inetAddr = addr.toInetAddress();//convert valid address
//use address
} catch(AddressStringException e) {
//e.getMessage has validation error
}
これを行うには、getByNameメソッドを使用します。例えば:
InetAddress localhost = InetAddress.getByName("127.0.0.1")
Java docsで説明されているように:
ホスト名は、「Java.Sun.com」などのマシン名か、IPアドレスのテキスト表現のいずれかです。リテラルIPアドレスが指定されている場合、アドレス形式の有効性のみがチェックされます。