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