はじめに
最近、通信系のプログラムの勉強をしていた際に Java で通信するコードを動かしたのでそのメモとプログラムを紹介します。
必要なのはJavaが動くPC1台のみです。
参考書籍
Javaでのネットワーク通信
ネットワークの通信ではクライアントサーバモデルという構成がよく見られます。
例えばホームページを閲覧するというのは、クライアントである我々がサーバー側にHTTPリクエストを送ります。
2つの通信プログラム
さて、今回は同じパソコンの中にサーバー側とクライアント側でプログラムを二つ用意します。
通信を行う上で肝心なことは、
クライアント側はサーバー側のポートをしっかり指定して接続しようとし、
サーバー側はクライアント側から接続されてもいいようにポートを開放しておく、
ということです。
クライアント側の設計概要
クライアント側ではデータを読み取るために
Socket hoge = null;
といったようにソケットを準備して,
hoge = new Socket("IPアドレス",(整数)ポート番号);
ソケットを作成します。
あとはファイルからの読み込みと同じように,InputStreamでデータを受け取って...といった感じで動作します。
第一引数でIPアドレスを、第二引数でポート番号を指定するクライアント側のプログラムのコードは以下にあるのでコピペしてコンパイルすればそのまま動作します。
クライアントのサンプルコード
サーバ側の設計概要
次はサーバー側です。こちらも似たように
ServerSocket hoge2;
を作って
hoge2 = new ServerSocket(ポート番号,最大接続数)
とソケットを作成します。
クライアント側の違いとしては、
作成したサーバーソケットに対する接続を待ち受けるオブジェクトを作り、acceptメソッドを使用することで接続を常に受け付けるようにすることですね。
Socket sock = hoge2.accept();
上のようにacceptメソッドを用います。
サーバのサンプルコード
サーバー側のプログラムの全体は以下です。これもそのままコピペで動くはず。単なる文字列を返してもいいんですけど,せっかくなのでDateを使って日時を返します。
動作結果
実際にサーバー側のプログラムを実行します。おそらく何も表示されず待機されるはず。その後にもう一つターミナルを開いて、クライアント側のプログラムを実行します。
上のサンプルコードで言えば、Netclockを実行後、Readnetを実行します。
コードを見ればわかりますが、Netclockは引数なしで実行、Readnetは二つの引数で実行します。一つ目の引数はサーバのIPアドレス、二つ目はポート番号です。
今回はサーバとクライアントを同じパソコンで実行しますので、Readnetの第一引数は localhost、第二引数はNetclock側のソケットを6000にしているので6000とします。
実行結果はこんな感じになるかと思います。
java Readnet localhost 6000 Sun Apr 19 17:47:26 JST 2015
すごいシンプルなプログラムなので、コードも読みやすいと思います。
以上です。