簡単なクライアント
ネットワーククライアント
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
複数のネットワークインターフェイスを持つホストもあるので、
一つのマシンが複数のホスト名や複数の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
|