質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
IPv6

IPv6は、インターネットプロトコルの一つ。主流となっているIPv4に変わるものとして設計されました。IPアドレスの需要の増大を予見して開発されたもので、従来よりも多くのIPアドレスの作成が可能です。

IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

2回答

1307閲覧

JavaのTCP通信について、助けてください

purogutamu

総合スコア17

IPv6

IPv6は、インターネットプロトコルの一つ。主流となっているIPv4に変わるものとして設計されました。IPアドレスの需要の増大を予見して開発されたもので、従来よりも多くのIPアドレスの作成が可能です。

IPv4

IPv4(Internet Protocol version 4)は、インターネットプロトコルの一つ。インターネットに繋がったコンピューターや機器を識別するためのIPアドレスを32ビット表記で表わします。しかしIPv4は、限界があるため、IPv6が次世代プロトコルとして注目されています。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

0クリップ

投稿2021/07/13 14:26

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()

を使うとできると書いてありました。しかしイマイチ使い方がわかりませんでした。
回答をよろしくお願いします。できれば抽象的な回答ではなく、具体的な回答をお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
Toshimichi

総合スコア97

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

purogutamu

2021/07/14 01:50

別の方法ですが、NetworkInterfaceを使うとIPv6のIPアドレスを取得することはできました。プログラムを参考にさせてもらいました。回答ありがとうございます。
guest

0

投稿2021/07/13 14:29

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

purogutamu

2021/07/13 14:35

すみません。少し説明不足でした。InetAddressを使うだけでIPv6のIPアドレスの取得はできるのでしょうか?
y_waiwai

2021/07/13 14:54

static Inet6Address getByAddress(String host, byte[] addr, int scope_id) InetAddress.getByAddress(String,byte[])とまったく同様にしてInet6Addressを作成します。ただし、IPv6スコープIDが指定された数値に設定される点は異なります。 って記述があります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問