javaでTCP通信を行い、クライアントのIPアドレスの取得方法に困っています。目標はIPv4のIPアドレスに対してはIPv4を、Ipv6のIPアドレスに対してはIPv6を表示させることです。
InetAddress addr = InetAddress.getLocalHost();
System.out.println("IP Address : " + addr.getHostAddress());
このようにすれば、IPv4のIPアドレスが表示されます。しかし、IPv6のIPアドレスは表示できません。例えば、自分が接続しているWiFiのIPアドレスでIPv4を無効にしても、IPv6が表示されないです。色々と調べてみて、
java.net.Inet6Address.getHostAddress()
を使うとできると書いてありました。しかしイマイチ使い方がわかりませんでした。
回答をよろしくお願いします。できれば抽象的な回答ではなく、具体的な回答をお願いします。
以下のような質問にはグッドを送りましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 間違っている
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
回答2件
0
ベストアンサー
InetAddresss.getLocalhost()で取得されるアドレスは, 必ずしもIPv4のアドレスを返すことが保証されていないことに留意してください。
java
1import java.net.*; 2import java.util.Collections; 3 4public class Main { 5 6 /** 7 * ローカルホストのアドレスのうち, 特に {@code IPv6} のものを返す. 8 * {@code IPv6} で定義されるローカルホストのアドレスが複数存在する場合, そのうちの1つのみが返されるが, その規則性については保証されない. 9 * @return ローカルホストのアドレスのうち, 特に {@code IPv6} のもの 10 * @throws UnknownHostException ローカルホストのアドレスが解決出来なかった場合 11 * @throws SocketException ネットワークインターフェースの取得に問題が発生した場合 12 */ 13 public static Inet6Address getIPv6Localhost() throws UnknownHostException, SocketException { 14 /* 15 ローカルホストのアドレスを取得し, またそのアドレスを持つネットワークインターフェースを特定する. 16 そのネットワークインターフェースの持つ全てのアドレスからIPv6のものを探す. 17 */ 18 InetAddress localhost = InetAddress.getLocalHost(); 19 for (NetworkInterface ni : Collections.list(NetworkInterface.getNetworkInterfaces())) { 20 boolean hasLocalhost = Collections.list(ni.getInetAddresses()).contains(localhost); 21 if (!hasLocalhost) continue; 22 for (InetAddress addr : Collections.list(ni.getInetAddresses())) { 23 if(!(addr instanceof Inet6Address)) continue; 24 return (Inet6Address) addr; 25 } 26 } 27 return null; 28 } 29 30 public static void main(String[] args) throws Exception { 31 Inet6Address ipv6 = getIPv6Localhost(); 32 if(ipv6 == null) System.out.println("Could not find IPv6 localhost"); 33 else System.out.println("Found IPv6 localhost: " + ipv6.getHostAddress()); 34 } 35}
投稿2021/07/13 15:04
編集2021/07/13 15:10総合スコア97
0
投稿2021/07/13 14:29
総合スコア86064
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
こちらの回答が複数のユーザーから「過去の低評価」という指摘を受けました。
回答へのコメント
関連した質問
Q&A
解決済
UDP通信とC言語の線形連結リストについて
回答2
クリップ0
更新
2023/01/30
Q&A
受付中
2つの三次元ベクトルから角度を求める問題。
回答2
クリップ0
更新
2023/02/06
Q&A
解決済
5回、自然数を入力し、その中で最小値と最大値を除いた合計値を出力するプログラム
回答3
クリップ0
更新
2023/02/03
Q&A
解決済
リダイレクト後のHTTPリクエストについて
回答1
クリップ0
更新
2023/01/30
Q&A
解決済
Javaでのtxtファイル操作でエラー
回答1
クリップ1
更新
2023/02/01
Q&A
解決済
Java の stream().filterのcontainsの条件にListを指定したい
回答2
クリップ0
更新
2023/01/27
Q&A
解決済
2次元配列の2つ目の要素を全て3桁のカンマ区切りにしたい
回答2
クリップ0
更新
2023/02/02
Q&A
受付中
linuxの環境変数を変更して、node-red上で使いたいです
回答2
クリップ0
更新
2023/02/05
同じタグがついた質問を見る
IPv6は、インターネットプロトコルの一つ。主流となっているIPv4に変わるものとして設計されました。IPアドレスの需要の増大を予見して開発されたもので、従来よりも多くのIPアドレスの作成が可能です。
IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。
Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。
TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。
良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2021/07/14 01:50