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

# JAVAを一度も触ったことがない方にお勧め。２０年経った今でも面白い。
基礎からわかるTCP/IP Javaネットワークプログラミング, オーム社, 小高 知宏, 1999.8

![基礎.png](https://qiita-image-store.s3.amazonaws.com/0/51423/fc7a857c-76ba-44a0-5b04-c623488e1c8c.png)
https://www.amazon.co.jp/dp/4274064867/
初版が発行された年から、JAVA研修の教材として使っている。2002年に第二版（上記URL）が出ている。
この本に到達する前に20冊の本のソースを入力（またはCDについているもの）をコンパイル実行した。
この本の他の本と比較した利点は、JAVAの得意分野であるネットワークが容易に操作できることが体験できることにある。

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

今回は、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
macOSにEclipseを導入する(５つの壁)
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](https://qiita-image-store.s3.amazonaws.com/0/51423/a7998bd2-28fe-1130-be82-a671b0b8ff79.png)
「File」メニューの「New」の「Java Project」を選択する。

![java01.png](https://qiita-image-store.s3.amazonaws.com/0/51423/18677b41-7581-498e-8e69-20a923d3919c.png)
「Project Name」に2.2.1 Readnetであれば「 Readnet」と入れる。「Finish」が選択可能になって入れば「Finish」を押す。


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

## classファイルの作成

![java02.png](https://qiita-image-store.s3.amazonaws.com/0/51423/6fb17d24-c59f-d4a3-5e41-cc453083ea89.png)

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

![java03.png](https://qiita-image-store.s3.amazonaws.com/0/51423/ef353c79-c90d-c331-035c-f11851584523.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は１つのファイルに１つのclass定義を前提としています。そのため、ファイル名とクラス名が違うとコンパイルエラーになります。

# Eclipseでコンパイル、実行、デバッグ
## コンパイル
![java1.png](https://qiita-image-store.s3.amazonaws.com/0/51423/3789bbd9-1521-89a0-c057-47892d302123.png)
「Run」メニューの「Run Configurations」を選択する。
![java22.png](https://qiita-image-store.s3.amazonaws.com/0/51423/ad6e0949-71e3-1d5b-0843-81aba6a1f4fa.png)

「Java Application」をダブルクリックする。
![java32.png](https://qiita-image-store.s3.amazonaws.com/0/51423/fdf0db15-8715-877c-20e6-242991301ce3.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](https://qiita-image-store.s3.amazonaws.com/0/51423/89802ff1-9c0d-6fc1-8565-ef096bde908e.png)

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

![java34.png](https://qiita-image-store.s3.amazonaws.com/0/51423/7b15af3a-f4de-c159-964b-f9dd7d5f54c0.png)

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

![java35.png](https://qiita-image-store.s3.amazonaws.com/0/51423/2e06465f-9c3d-0d1a-f3f0-a9f886bf0368.png)
コンパイルエラーがある場合には、「Problems」タグに表示がある。

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

![java36.png](https://qiita-image-store.s3.amazonaws.com/0/51423/055c9fc3-1758-2907-1737-09267453c533.png)

コンパイルエラーがあるが、ひとまず先に進む場合は「Proceed」、戻って修正してからもう一度コンパイルするときは「Cancel」を選ぶ。
![java4.png](https://qiita-image-store.s3.amazonaws.com/0/51423/9bc2459d-bae8-3a0a-80bb-f3c273e479fc.png)

「Package Explorer」、ソースコードの行番号、「Outline」にもコンパイルエラーのありかを表示している。
「Problems」タグを選択すると、コンパイルエラー一覧が出る。２つ以上のエラーがある場合は、
![java41.png](https://qiita-image-store.s3.amazonaws.com/0/51423/0c1c964b-6b1b-22e2-f6e7-bee31f6727d1.png)


## 実行・wiresharkによる測定
実行結果が、思うような結果でなかった場合には、
wiresharkを起動して、パケットを計測する。
![wire1.png](https://qiita-image-store.s3.amazonaws.com/0/51423/a449f947-7c60-0847-df98-f7c44d33cce3.png)
他のネットワーク機器とのやりとりの場合は、その接続しているインタフェースを選択する。例えば、「Ethernet:en0」。
自分自身とのやりとりの場合は、「Loopback:lo0」を選択する。

![wire2.png](https://qiita-image-store.s3.amazonaws.com/0/51423/5746570b-c234-4842-e130-338f76134195.png)

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

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

![wire3.png](https://qiita-image-store.s3.amazonaws.com/0/51423/6e31b43d-8c0d-ec4d-adac-68f73a664af0.png)

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

# wiresharkの導入
## Windows
https://www.wireshark.org/download.html

```
Windows Installer (64-bit)
Windows Installer (32-bit)
```
のいずれかを落として実行。

## Macintosh
MacintoshにWiresharkを導入する５つの壁
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

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

## 一覧
物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

量子(0) 計算機, 量子力学 
https://qiita.com/kaizen_nagoya/items/1cd954cb0eed92879fd4

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

転職(0)一覧
https://qiita.com/kaizen_nagoya/items/f77520d378d33451d6fe

仮説（0）一覧（目標100現在40）
https://qiita.com/kaizen_nagoya/items/f000506fe1837b3590df

Qiita(0)Qiita関連記事一覧（自分）
https://qiita.com/kaizen_nagoya/items/58db5fbf036b28e9dfa6

鉄道（０）鉄道のシステム考察はてっちゃんがてつだってくれる
https://qiita.com/kaizen_nagoya/items/26bda595f341a27901a0

安全（0）安全工学シンポジウムに向けて: 21
https://qiita.com/kaizen_nagoya/items/c5d78f3def8195cb2409

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

OSEK OS設計の基礎　OSEK(100)
https://qiita.com/kaizen_nagoya/items/7528a22a14242d2d58a3

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

プログラマによる、プログラマのための、統計(0)と確率のプログラミングとその後
https://qiita.com/kaizen_nagoya/items/6e9897eb641268766909

官公庁・学校・公的団体（NPOを含む）システムの課題、官（０）
https://qiita.com/kaizen_nagoya/items/04ee6eaf7ec13d3af4c3

「はじめての」シリーズ　 ベクタージャパン　
https://qiita.com/kaizen_nagoya/items/2e41634f6e21a3cf74eb

AUTOSAR(0)Qiita記事一覧, OSEK(75)
https://qiita.com/kaizen_nagoya/items/89c07961b59a8754c869

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

LaTeX(0) 一覧　
https://qiita.com/kaizen_nagoya/items/e3f7dafacab58c499792

自動制御、制御工学一覧（０）
https://qiita.com/kaizen_nagoya/items/7767a4e19a6ae1479e6b

Rust(0) 一覧　
https://qiita.com/kaizen_nagoya/items/5e8bb080ba6ca0281927

小川清最終講義、最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
#### 文書履歴(document history)
ver. 0.01 初稿 　20180305
ver. 0.02 ありがとう追記　20230508
## 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.