pi-14. イベント処理とネット
ワーク通信: Javaによるイベン
トハンドラとソケットプログラ
ミング
1
金子邦彦
(Java マスター講座:基礎から応用まで)
URL: https://www.kkaneko.jp/pro/pi/index.html
Javaによるイベント処理の仕組みとソケット通信の基
礎、タイマーイベントのプログラミングとネットワーク
通信プログラムの作成
【学習内容の構成】
1. イベントとイベントハンドラ:特定のイベント発生
時に実行する処理を事前に登録する仕組み
2. タイマーイベント:TimerTaskクラスを用いた定期
的処理の実装とマルチスレッド実行
3. ソケット通信:サーバソケットへのバインド、接続
要求の待機、データ送受信による機器間通信
• 前提:Javaの基本文法、クラスとオブジェクトの理解
• 意義:GUIアプリケーションやネットワークプログラ
ムの開発基盤の習得
2
GDB online
3
Java などのプログラミング言語の体
験,演習ができるオンラインサービス
https://www.onlinegdb.com/
オンラインなので、「秘密にしたいプログラム」を
扱うには十分な注意が必要
GDB online で Java を動かす手順
① ウェブブラウザを起動する
② 次の URL を開く
https://www.onlinegdb.com/
4
③ 「Language」のところで,「Java」を選ぶ
5
6
④ ソースコードを入れる
⑤ 実行.実行結果を確認
「Run」をクリック.
14-1. イベントとイベントハンド
ラ
7
イベントとイベントハンドラ
イベントの例
• タイマー
• 外部操作(キーボード、マウスの操作)
イベントハンドラ
イベントが発生したときの処理のこと.特定のイベ
ントごとに、事前に、行うべき処理を登録しておく.
8
9
通常のプログラム実行
イベント発生のたびに
マルチスレッド実行
イベント発生
イベントハンドラ内
のタスクを実行
イベント発生
イベントハンドラ内
のタスクを実行
14-2. Java でのタイマーイベント
10
演習
資料:13 ~ 18
【トピックス】
• タイマーイベント
11
処理を止める
12
100秒止まる
「100000」
とあるのは
ミリ秒単位
① 次のソースコードを入れる
13
② 実行結果の確認 (あとで使うので、ブラウザを閉じないこと)
「start」と表示される
Java でのタイマーイベントとイベントハンドラ
• 「TimerTask」は
Java の標準ライブ
ラリのクラス
14
イベントハンドラ
イベントハンドラ
の登録
1. 最初 0.1 秒経過
したらイベント発生
2. その後,0.5 秒
間隔でイベント発生
マルチスレッドでの実行
15
イベント発生
イベント発生
イベント発生
start
0.1秒
0.5秒
0.5秒
メインのスレッド(青)は動き続ける
タイマーイベント
16
③ 次のソースコードを入れる
17
④ 実行結果の確認 (あとで使うので、ブラウザを閉じないこと)
「start」と表示される
14-3. タイマーイベントのプログ
ラム例
18
19
Ball クラスのオブジェクト
y
x
x
属性 x の値を 2 増やし,
属性 y の値を 3 増やすメソッド move
演習
資料:22 ~ 27
【トピックス】
• タイマーイベント
20
21
① 次のソースコードを入れる
次のページに続く
22
② 実行結果の確認
• 0.5 秒ごとに動かす
0.5 秒ごとにイベント発生
23
24
③ 次のように書き換える
次のページに続く
25
イベント
ハンドラ
イベント
ハンドラ
の登録と、
メインの
スレッド
26
0.5 秒ごとに動く
④ 実行結果の確認
14-4. ソケット通信
27
ソケットとは
ソケットは,機器の間の通信や,プロセス間通信に
使用されるインターフェース.
28
インターネットでの通信
29
IP アドレス
サーバ
(要求を待ち続ける)
さまざまなコンピュータ
(要求する)
プログラムにバインドされたポート
30
IP アドレス
サーバ
(要求を待ち続ける)
さまざまなコンピュータ
(要求する)
実行中の
プログラム
サーバ
ソケット
データ送受信
用のソケット
インターネットでの通信
• サーバ(要求を待ち続ける)
実行中のプログラムは、サーバソケットにバインド
される
• さまざまなコンピュータ(要求する)
サーバの IP アドレス(あるいはサイト名)とサー
バソケットのポート番号を指定して、通信を開始す
る
31
インターネットでの通信
32
通信先コンピュータ
サーバソケット
ポート番号
10001
通信先
プログラム
バインド
通信要求
データのやり取り
通信元コンピュータ
データ送受信
用のソケット
14-5. Java でのソケット通信
33
34
さまざまなコンピュータ
(要求する)
サーバ
(要求を待ち続ける)
サーバの IPアドレス(または
サイト名)とサーバソケット
のポート番号を指定して
通信を開始
データの送受信
プログラムをサーバ
ソケットにバインド
データの送受信
接続要求が来るのを待つ
(acceptという)
サーバのプログラムの例
プログラムを、ポート番号 10001 にバインド.接続要
求が来るのを待って、データの送受信を行う
ServerSocker sock;
Socker s;
BufferedReadrer reader;
sock = new ServerSocket();
sock.bind(new InetSocketAddress(“<サイト名>", 10001));
s = sock.accept();
reader = new BufferedReader(new InputStreamReader
(s.getInputStream()));
String line = reader.readLine();
35
サーバソケットとデータ送受信用のソケット
ServerSocker sock;
Socker s;
BufferedReadrer reader;
sock = new ServerSocket();
sock.bind(new InetSocketAddress(“<ホスト名>",
10001));
s = sock.accept();
reader = new BufferedReader(new InputStreamReader
(s.getInputStream()));
String line = reader.readLine();
36
サーバソケット
データ送受信用のソケット
※ データ送受信に使うソケット.
「サーバソケット」とは別のもの
サーバとの通信のプログラムの例
サーバの IP アドレス(またはサイト名)と、ポート
番号 10001 を指定して通信を開始。
Socket s = new Socket("<サーバのサイト名>", 10001);
BufferedWriter out = new BufferedWriter
(new OutputStreamWriter(s.getOutputStream()));
out.write("GET /index.html HTTP/1.0¥r¥n");
out.flush();
37
演習
資料:40 ~ 45
【トピックス】
• ソケット通信
38
演習
① ウェブブラウザを起動する
② 次の URL を開く
https://paiza.io/
③ もし,表示が英語になっていたら,日本語に切り
替える
④ 「コード作成を試してみる」をクリック
⑤ 「Java」を選ぶ(左上のボタンをクリックするとメニューが出る)
41
プログラムの
編集画面
実行ボタン
プログラムを
書き換えること
ができる
編集画面を確認する。
すでに、Java プログラムが入っている.
書き換えて使う.
43
① 次のソースコードを入れる
② 実行をクリック.実行結果を確認
44
まとめ
• ソケットの機能により,インターネットでの通信
ができる
• サーバ側では,プログラムを,サーバソケットを
バインドする.
• サーバとの通信では,サーバの IP アドレス(また
はサイト名)と、ポート番号を指定して通信を開
始する.
45
関連ページ
• Java プログラミング入門
GDB online を使用
https://www.kkaneko.jp/pro/ji/index.html
• Java の基本
Java Tutor, GDB online を使用
https://www.kkaneko.jp/pro/pi/index.html
• Java プログラム例
https://www.kkaneko.jp/pro/java/index.html
46
14-2
import java.util.*;
public class Main {
public static void main(String[] args) {
System.out.println("start");
try {
Thread.sleep(100000);
} catch(InterruptedException e) {}
}
}
47
14-2
import java.util.*;
class MyTask extends TimerTask {
public void run() {
System.out.println("hello");
}
}
public class Main
{
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTask(), 100, 500);
System.out.println("start");
try {
Thread.sleep(100000);
} catch(InterruptedException e) {}
}
}
48
14-3
class Ball {
double x;
double y;
public Ball(double x, double y) {
this.x = x;
this.y = y;
}
public void move() {
this.x = this.x + 2;
this.y = this.y + 3;
}
public void printout() {
System.out.printf("%f %f¥n", this.x, this.y);
}
}
public class Main
{
public static void main(String[] args) {
Ball b = new Ball(0, 0);
b.printout();
b.move();
b.printout();
}
}
49
14-3
import java.util.*;
class Ball {
double x;
double y;
public Ball(double x, double y) {
this.x = x;
this.y = y;
}
public void move() {
this.x = this.x + 2;
this.y = this.y + 3;
}
public void printout() {
System.out.printf("%f %f¥n", this.x, this.y);
}
}
class MyTask extends TimerTask {
Ball b;
public MyTask() {
super();
this.b = new Ball(0, 0);
}
public void run() {
b.move();
b.printout();
}
}
public class Main
{
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new MyTask(), 100, 500);
System.out.println("start");
try {
Thread.sleep(100000);
} catch(InterruptedException e) {}
}
}
50
14-5
import java.util.*;
import java.net.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
try {
Socket s = new Socket("www.kkaneko.jp", 80);
BufferedReader in = new BufferedReader
(new InputStreamReader(s.getInputStream()));
BufferedWriter out = new BufferedWriter
(new OutputStreamWriter(s.getOutputStream()));
out.write("GET /index.html HTTP/1.0¥r¥n");
out.write("Host: www.kkaneko.jp:80¥r¥n");
out.write("¥r¥n");
out.flush();
System.out.println(in.readLine());
System.out.println(in.readLine());
System.out.println(in.readLine());
System.out.println(in.readLine());
} catch(Exception e) {
e.printStackTrace();
}
}
}
51