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

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

解決済

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

purogutamu
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)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

2回答

0グッド

0クリップ

726閲覧

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

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、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
Toshimichi

総合スコア97

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

purogutamu

2021/07/14 01:50

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

0

投稿2021/07/13 14:29

y_waiwai

総合スコア86064

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2021/07/13 20:07

こちらの回答が複数のユーザーから「過去の低評価」という指摘を受けました。

回答へのコメント

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が指定された数値に設定される点は異なります。 って記述があります

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。