Java
Eclipse
TCP
Wireshark
ipv4

「基礎からわかるTCP/IP JAVAネットワークプログラミング」Eclipseでコンパイル。Wiresharkでデバッグ。

JAVAを一度も触ったことがない方にお勧め。20年経った今でも面白い。

基礎からわかるTCP/IP Javaネットワークプログラミング, オーム社, 小高 知宏, 1999.8

基礎.png

https://www.amazon.co.jp/dp/4274064867/
初版が発行された年から、JAVA研修の教材として使っている。2002年に第二版(上記URL)が出ている。
この本に到達する前に20冊の本のソースを入力(またはCDについているもの)をコンパイル実行した。
この本の他の本と比較した利点は、JAVAの得意分野であるネットワークが容易に操作できることが体験できることにある。

1996年当時は、別の本でSunmicrosystemsのJAVA, Microsoft J++の演習を行った。1999年以降、この本で、J Builderを使った演習を行った。当方でこの本で受講していただき、3桁の演習修了した方がいて、今では大学や企業で教えている方がいらっしゃる。

今回は、EclipseのJava Developer toolsを利用する。

wiresharkの利用

TCP, IP, UDP, HTTPなど基本通信規約が理解できる。なお、小包(packet)を監視するWiresharkというソフトでデータを取得しながら動作確認すると良い。

http://wireshark.org
wiresharkのソースコードは、各種通信機器でも利用していることがある。詳細はこの記事の最後に。

Eclipse, Java Developer tools導入

Windows

https://www.eclipse.org
からEclipseをダウンロードする。ダウンロード後、
「EclipseのJava Developer tools」を選択して追加導入する。
この選択をしていないと、コンパイルできるが実行エラーが出たことがある。

Macintosh

Macintosh OS XにEclipseを導入する(5つの壁)
https://qiita.com/kaizen_nagoya/items/b17f03db00aceee41a80

Debian/Ubuntu/Raspbian

apt-get update
apt-get install eclipse

Rasbianで113個のパッケージを導入した。

JAVA プログラム, EclipseでProject, package, java/class作成

JAVAプロジェクトの作成

java0.png
「File」メニューの「New」の「Java Project」を選択する。

java01.png
「Project Name」に2.2.1 Readnetであれば「 Readnet」と入れる。「Finish」が選択可能になって入れば「Finish」を押す。

「Java Project」が現れない場合は、「Java developer tools」の導入がうまくいっていない場合である。
再度、導入してみる。

classファイルの作成

java02.png

「File」メニューの「New」の「class」を選択する。

java03.png

「Package:」と「Name:」に「readnet」「Readnet」と入れる。「Finish」が選択可能になって入れば「Finish」を押す。

Package名を「Readnet」と大文字で入れると次の警告が上部の「Java Class」の下に現れる。
「This package name is discouraged. By convention, package names usually start with a lowercase letter」

Rednet.java
package readnet;

public class Readnet {

}

ファイル名とクラス名が同じになっていることを確認してください。Javaは1つのファイルに1つのclass定義を前提としています。そのため、ファイル名とクラス名が違うとコンパイルエラーになります。

Eclipseでコンパイル、実行、デバッグ

コンパイル

java1.png
「Run」メニューの「Run Configurations」を選択する。
java22.png

「Java Application」をダブルクリックする。
java32.png
「(x)=Arguments」タブを選択し、「Program arguments:」に必要なパラメータを記して「Run」を押す。

例えば、P88「2.2 JAVAで利用できるネットワーク機能」プログラムの中で、使い方として

// 例 JAVA Readnet kick.fuis.fukui-u.ac.jp 60000

となっている。ここは、自分の使っている環境を入れます。例えば、192.168.2.23がIPアドレスであれば、直接IPアドレスを入れても良い。また、ポート番号は60000でも、他に空いている番号で相手との対応で使えば良い。

C言語では、args[0]にはプログラム名が入るが、JAVAではargs[0]に最初の引数が入る。

java33.png

ファイルを保存するか聞いてくる。「OK」を押す。

java34.png

実行時のエラーまたはプログラムの結果が「Console」に出る。

java35.png
コンパイルエラーがある場合には、「Problems」タグに表示がある。

コンパイルエラー

最初のうちは、記述の誤りなどで2−3回はコンパイルエラーが出て、それを直しながら覚えていく。

java36.png

コンパイルエラーがあるが、ひとまず先に進む場合は「Proceed」、戻って修正してからもう一度コンパイルするときは「Cancel」を選ぶ。
java4.png

「Package Explorer」、ソースコードの行番号、「Outline」にもコンパイルエラーのありかを表示している。
「Problems」タグを選択すると、コンパイルエラー一覧が出る。2つ以上のエラーがある場合は、
java41.png

実行・wiresharkによる測定

実行結果が、思うような結果でなかった場合には、
wiresharkを起動して、パケットを計測する。
wire1.png
他のネットワーク機器とのやりとりの場合は、その接続しているインタフェースを選択する。例えば、「Ethernet:en0」。
自分自身とのやりとりの場合は、「Loopback:lo0」を選択する。

wire2.png

これを回避するには、Macintosh, Linuxでは、コマンドプロンプトで

su otheruser
wireshark &

「Loopback:lo0」を選択する。ここでotheruserとは、他のユーザのIDのこと。otheruserと打っても、otheruserというIDの人がいないと知らんと言われる。

wire3.png

自分から自分へのパケットが測定できる。

wiresharkの導入

Windows

https://www.wireshark.org/download.html

Windows Installer (64-bit)
Windows Installer (32-bit)

のいずれかを落として実行。

Macintosh

MacintoshにWiresharkを導入する5つの壁
https://qiita.com/kaizen_nagoya/items/69eb2d357a125f5368e1
参照

Debian/Ubuntu/Raspbian

apr-get update
apt-get install wireshark

Raspberry PiでWiresharkを活用する10の関門

https://qiita.com/kaizen_nagoya/items/b3fa0a20855d44c3768d

まとめ

JAVAの特徴(C、C++と比べて)

1 Class名とファイル名が同一で、拡張子はそれぞれclass, java。Project, Packageも同一で良い。ただし、Packageは小文字始まりを原則とする。
2 Internetが得意(C、C++のJAVA以前の言語に比べて。)
3 classの中にmain関数がある。違和感。mainクラスまたは実行環境のOSのClassとしてmainクラスがあると良いかも。
4 C言語では、args[0]にはプログラム名が入る。JAVAではargs[0]に最初の引数が入る。

EclipseでJAVA

1 EclipseもJAVAで書かれていて相性が良い。
2 JAVA Developer toolsを導入
3 New ->Java Project, New-> classで始める。
4 コマンドの引数は「(x)=Arguments」タブを選択し、「Program arguments:」に必要なパラメータ

ネットワークプログラミングのデバッグ

1 Wiresharkを使う
2 自分自身へのパケットはLoopbackをインタフェースに指定
3 アクセスが禁止の場合は、アクセス可能な人にsuして、wireshark &で起動
4 自分以外の接続は、Ethernet:en0など具体的に接続しているものを選ぶ。

<この記事は書きかけです。順次、追記します。>
「基礎からわかるTCP/IP JAVAネットワークプログラミング」第二章JAVAによるネットワークプログラミング phttpd 三箇所でException収集
https://qiita.com/drafts/d1db78d3db0e90c0ff9f
でhttp/0.9だから嫌だって言われている。

情報処理技術者試験 ネットワークスペシャリストに合格 
https://qiita.com/kaizen_nagoya/items/407857392ca5c5677ee4

通信エミュレータの移植
https://qiita.com/drafts/ce505bbea4229b83e93b

Macintosh対応「基礎からわかるTCP/IP アナライザ作成とパケット解析 Linux/FreeBSD対応」小高知宏 オーム社
https://qiita.com/kaizen_nagoya/items/517411b42fc5ceabd581