簡単なクライアント


ネットワーククライアント

socketを使ったプログラミング


サーバに接続する




Connect.javaの実行例 (古い java の場合)
$ javac Connect.java      ← コンパイルする
$ java Connect nw.tsuda.ac.jp      ← WWWサーバが動いているホスト
Connected to nw.tsuda.ac.jp
$ java Connect ns.tsuda.ac.jp      ← WWWサーバが動いていないホスト
java.net.ConnectException: Connection refused: connect
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
        at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
        at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
        at java.net.Socket.connect(Socket.java:529)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at Connect.main(Connect.java:7)


Connect.javaの実行例 (java 8の場合)
$ javac Connect.java      ← コンパイルする
$ java Connect nw.tsuda.ac.jp      ← WWWサーバが動いているホスト
Connected to nw.tsuda.ac.jp
$ java Connect ns.tsuda.ac.jp      ← WWWサーバが動いていないホスト
java.net.ConnectException: Operation timed out     ← タイムアウトまで75秒ほどかかる
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at java.net.Socket.connect(Socket.java:538)
        at java.net.Socket.<init>(Socket.java:434)
        at java.net.Socket.<init>(Socket.java:211)
        at Connect.main(Connect.java:7)


Connect.javaの実行例 (java 14.0.1の場合)
$ javac Connect.java      ← コンパイルする
$ java Connect nw.tsuda.ac.jp      ← WWWサーバが動いているホスト
Connected to nw.tsuda.ac.jp
$ java Connect ns.tsuda.ac.jp      ← WWWサーバが動いていないホスト
java.net.ConnectException: Operation timed out      ← タイムアウトまで75秒ほどかかる
        at java.base/sun.nio.ch.Net.connect0(Native Method)
        at java.base/sun.nio.ch.Net.connect(Net.java:503)
        at java.base/sun.nio.ch.Net.connect(Net.java:492)
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)
        at java.base/java.net.Socket.connect(Socket.java:648)
        at java.base/java.net.Socket.connect(Socket.java:597)
        at java.base/java.net.Socket.<init>(Socket.java:520)
        at java.base/java.net.Socket.<init>(Socket.java:294)
        at Connect.main(Connect.java:7)

[注意] 処理系によっては即例外とはならずに、しばらく(75秒程度)応答を待ち、 最終的にはタイムアウトして例外が発生します。 待てない場合は、キーボードから Ctl-C をタイプして実行を強制終了させて下さい。


サーバに接続する2

エラーを例外としてそれぞれcatchする例。




Connect2.javaの実行例 (古い java の場合)
$ javac Connect2.java      ← コンパイルする
$ java Connect2 nw.tsuda.ac.jp      ← WWWサーバが動いているホスト
Connected to nw.tsuda.ac.jp
$ java Connect2 ns.tsuda.ac.jp      ← WWWサーバが動いていないホスト
connect refused : ns.tsuda.ac.jp
$ java Connect2 aaa.tsuda.ac.jp      ← 存在しないホスト
unknown host : aaa.tsuda.ac.jp
$ java Connect2 xx.tsuda.ac.jp      ← DNSに登録されているが存在しないホスト
connection timed out; no servers could be reached
または (Javaのバージョンによっては)
connect refused : xx.tsuda.ac.jp


Connect2.javaの実行例 (java 8の場合)
$ javac Connect2.java      ← コンパイルする
nitta@vermeer-2 java8 % java Connect2 nw.tsuda.ac.jp      ← WWWサーバが動いているホスト
Connected to nw.tsuda.ac.jp
$ java Connect2 ns.tsuda.ac.jp      ← WWWサーバが動いていないホスト
connect refused : ns.tsuda.ac.jp
$ java Connect2 aaa.tsuda.ac.jp      ← 存在しないホスト
unknown host : aaa.tsuda.ac.jp
$ java Connect2 xx.tsuda.ac.jp      ← DNSに登録されているが存在しないホスト
java.net.SocketException: Network is unreachable           ← 数秒かかる
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at java.net.Socket.connect(Socket.java:538)
        at java.net.Socket.<init>(Socket.java:434)
        at java.net.Socket.<init>(Socket.java:211)
        at Connect2.main(Connect2.java:7)


Connect2.javaの実行例 (java 14の場合)
$ javac Connect2.java      ← コンパイルする
nitta@vermeer-2 java14 % java Connect2 nw.tsuda.ac.jp      ← WWWサーバが動いているホスト
Connected to nw.tsuda.ac.jp
$ java Connect2 ns.tsuda.ac.jp      ← WWWサーバが動いていないホスト
connect refused : ns.tsuda.ac.jp
$ java Connect2 aaa.tsuda.ac.jp      ← 存在しないホスト
unknown host : aaa.tsuda.ac.jp
$ java Connect2 xx.tsuda.ac.jp      ← DNSに登録されているが存在しないホスト
java.net.SocketException: Network is unreachable            ← 数秒かかる
        at java.base/sun.nio.ch.Net.connect0(Native Method)
        at java.base/sun.nio.ch.Net.connect(Net.java:503)
        at java.base/sun.nio.ch.Net.connect(Net.java:492)
        at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:588)
        at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:333)
        at java.base/java.net.Socket.connect(Socket.java:648)
        at java.base/java.net.Socket.connect(Socket.java:597)
        at java.base/java.net.Socket.<init>(Socket.java:520)
        at java.base/java.net.Socket.<init>(Socket.java:294)
        at Connect2.main(Connect2.java:7)

ネットワークアドレスを調べる

InetAddressオブジェクトはホスト名やIP Addressを表現するオブジェクトです。 publicなコンストラクタは存在せず、"www.yahoo.co.jp"や "203.216.247.225" といった文字列をstaticメソッド getByName() に渡してオブジェクトを取得します。 getByName()メソッドは UnknownHostException例外を投げる場合があります。




GetIPAddress.javaの実行例 (昔のある時点)
$ java GetIPAddress www.yahoo.co.jp 
host name: www.yahoo.co.jp
ip address: 203.216.243.240
$ java GetIPAddress 203.216.243.240 
host name: f11.top.vip.tnz.yahoo.co.jp
ip address: 203.216.243.240


GetIPAddress.javaの実行例 (2020年5月時点)
$ javac GetIPAddress.java     ← コンパイルする
$ java GetIPAddress nw.tsuda.ac.jp      ← ホスト名を指定する 
host name: nw.tsuda.ac.jp
ip address: 133.99.41.193
$ java GetIPAddress 133.99.41.193      ← IPアドレスを指定する 
host name: nw.tsuda.ac.jp
ip address: 133.99.41.193
$ java GetIPAddress www.yahoo.co.jp      ← ホスト名を指定する 
host name: www.yahoo.co.jp
ip address: 182.22.28.252     ← 返されるIPアドレスは固定ではありません。
$ java GetIPAddress 182.22.28.252      ← IPアドレスを指定する 
host name: 182.22.28.252
ip address: 182.22.28.252


コンピュータネットワーク 演習


提出〆切は、次回の講義が始まる時刻です。


課題1a

提出先 http://ynitta.com/class/network/local/handin/list.php?id=kadai1a
提出ファイルGetIPAddress2.java
コメント欄

複数のIPv4のIP Addressを持つホスト名。ただし、例に挙がっている www.twitter.com 以外。

複数のネットワークインターフェイスを持つホストもあるので、 一つのマシンが複数のホスト名や複数のIP Addressを持つことがあります。 全てのIPアドレスを取得して表示するプログラムを作成しなさい。

コマンド引数として与えられた文字列をホスト名またはIP Addressとして 名前解決し、 全ての組み合わせを表示するプログラムを書きなさい。

また、GetIPAddress2.java を用いて、 複数のIPv4のIP Addressを持つホスト名を発見しなさい。

[ヒント] 「有名な会社名をgoogleで検索して wwwサーバのホスト名を調べ、 GetIPAddress2 で複数のIPv4アドレスを持つかどうか調べる」という方法があります。

[注意] 下の2020年5月9日の実行例の中では www.twitter.com だけが、課題に適した答となります。




GetIPAddress2.javaの実行例 (昔のある時点)
$ java GetIPAddress2 www.google.com 
host name: www.google.com
ip address: 216.58.220.164
host name: www.google.com
ip address: 2404:6800:4004:812:0:0:0:2004
$ java GetIPAddress2 www.yahoo.co.jp 
host name: www.yahoo.co.jp
ip address: 183.79.197.250
host name: www.yahoo.co.jp
ip address: 182.22.72.251
host name: www.yahoo.co.jp
ip address: 182.22.72.252
host name: www.yahoo.co.jp
ip address: 182.22.72.250