438 Views
January 26, 22
スライド概要
トピックス:イベント, イベントハンドラ, タイマーイベント, ソケット通信
Java の基本(スライド資料とプログラム例)(全17回)
https://www.kkaneko.jp/pro/pi/index.html
金子邦彦研究室ホームページ
https://www.kkaneko.jp/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
pi-14. イベント,イベン トハンドラ,ソケット 通信 トピックス:イベント,イベントハンドラ,タイ マーイベント,ソケット通信 URL: https://www.kkaneko.jp/pro/pi/index.html (Java の基本,スライド資料とプログラム例) 金子邦彦 1
今回の内容 • イベントの処理 イベントハンドラ、イベントの登録のプログラム、 マルチスレッドの仕組み • 通信の基礎 ソケットのバインド,ソケットの接続要求 2
アウトライン 番号 項目 復習 14-1 イベントとイベントハンドラ 14-2 Java でのタイマーイベント 14-3 タイマーイベントのプログラム例 14-4 ソケット通信 14-5 Java でのソケット通信 各自、資料を読み返したり、課題に取り組んだりも行う この授業では、Java を用いて基礎を学び、マスターする 3
Java などのプログラミング言語の体 験,演習ができるオンラインサービス GDB online http://www.pythontutor.com/ オンラインなので、「秘密にしたいプログラム」を 扱うには十分な注意が必要 4
GDB online で Java を動かす手順 ① ウェブブラウザを起動する ② 次の URL を開く https://www.onlinegdb.com 5
③ 「Language」のところで,「Java」を選ぶ 6
④ ソースコードを入れる ⑤ 実行.実行結果を確認 「Run」をクリック. 7
14-1. イベントとイベントハンド ラ 8
イベントとイベントハンドラ イベントの例 • タイマー • 外部操作(キーボード、マウスの操作) イベントハンドラ イベントが発生したときの処理のこと.特定のイベ ントごとに、事前に、行うべき処理を登録しておく. 9
通常のプログラム実行 イベント発生のたびに マルチスレッド実行 イベント発生 イベントハンドラ内 のタスクを実行 イベント発生 イベントハンドラ内 のタスクを実行 10
14-2. Java でのタイマーイベント 11
演習 資料:13 ~ 18 【トピックス】 • タイマーイベント 12
処理を止める ① 次のソースコードを入れる 100秒止まる 「100000」 とあるのは ミリ秒単位 13
② 実行結果の確認 (あとで使うので、ブラウザを閉じないこと) 「start」と表示される 14
Java でのタイマーイベントとイベントハンドラ イベントハンドラ • 「TimerTask」は Java の標準ライブ ラリのクラス イベントハンドラ の登録 1. 最初 0.1 秒経過 したらイベント発生 2. その後,0.5 秒 間隔でイベント発生 15
マルチスレッドでの実行 start 0.1秒 イベント発生 0.5秒 イベント発生 0.5秒 イベント発生 メインのスレッド(青)は動き続ける 16
タイマーイベント ③ 次のソースコードを入れる 17
④ 実行結果の確認 (あとで使うので、ブラウザを閉じないこと) 「start」と表示される 18
14-3. タイマーイベントのプログ ラム例 19
Ball クラスのオブジェクト y 属性 x の値を 2 増やし, 属性 y の値を 3 増やすメソッド move x x 20
演習 資料:22 ~ 27 【トピックス】 • タイマーイベント 21
① 次のソースコードを入れる 次のページに続く 22
② 実行結果の確認 23
• 0.5 秒ごとに動かす 0.5 秒ごとにイベント発生 24
③ 次のように書き換える 次のページに続く 25
イベント ハンドラ イベント ハンドラ の登録と、 メインの スレッド 26
④ 実行結果の確認 0.5 秒ごとに動く 27
14-4. ソケット通信 28
ソケットとは ソケットは,機器の間の通信や,プロセス間通信に 使用されるインターフェース. 29
インターネットでの通信 さまざまなコンピュータ (要求する) サーバ (要求を待ち続ける) IP アドレス 30
プログラムにバインドされたポート さまざまなコンピュータ (要求する) サーバ (要求を待ち続ける) サーバ 実行中の ソケット プログラム データ送受信 用のソケット IP アドレス 31
インターネットでの通信 • サーバ(要求を待ち続ける) 実行中のプログラムは、サーバソケットにバインド される • さまざまなコンピュータ(要求する) サーバの IP アドレス(あるいはサイト名)とサー バソケットのポート番号を指定して、通信を開始す る 32
インターネットでの通信 通信元コンピュータ 通信先コンピュータ 通信要求 データのやり取り サーバソケット ポート番号 10001 バインド 通信先 プログラム データ送受信 用のソケット 33
14-5. Java でのソケット通信 34
さまざまなコンピュータ (要求する) サーバの IPアドレス(または サイト名)とサーバソケット のポート番号を指定して 通信を開始 サーバ (要求を待ち続ける) プログラムをサーバ ソケットにバインド 接続要求が来るのを待つ (acceptという) データの送受信 データの送受信 35
サーバのプログラムの例 プログラムを、ポート番号 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(); 36
サーバソケットとデータ送受信用のソケット 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(); 37
サーバとの通信のプログラムの例 サーバの 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(); 38
演習 資料:40 ~ 45 【トピックス】 • ソケット通信 39
演習 ① ウェブブラウザを起動する ② 次の URL を開く https://paiza.io/ ③ もし,表示が英語になっていたら,日本語に切り 替える
④ 「コード作成を試してみる」をクリック ⑤ 「Java」を選ぶ(左上のボタンをクリックするとメニューが出る)
プログラムの 編集画面 プログラムを 書き換えること ができる 実行ボタン 42
編集画面を確認する。 すでに、Java プログラムが入っている. 書き換えて使う.
① 次のソースコードを入れる 44
② 実行をクリック.実行結果を確認 45
まとめ • ソケットの機能により,インターネットでの通信 ができる • サーバ側では,プログラムを,サーバソケットを バインドする. • サーバとの通信では,サーバの IP アドレス(また はサイト名)と、ポート番号を指定して通信を開 始する. 46
関連ページ • 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 47
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) {} } } 48
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) {}
}
}
49
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();
}
}
50
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) {}
}
}
51
14-5
import jav a.util.*;
import jav a.net.*;
import jav a.io.*;
public class Main {
public static v oid main(String[] args) throws Exception {
try {
Socket s = new Socket("www.kkaneko.jp", 80);
Buf f eredReader in = new Buf f eredReader
(new InputStreamReader(s.getInputStream()));
Buf f eredWriter out = new Buf f eredWriter
(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.f lush();
Sy stem.out.println(in.readLine());
Sy stem.out.println(in.readLine());
Sy stem.out.println(in.readLine());
Sy stem.out.println(in.readLine());
} catch(Exception e) {
e.printStackTrace();
}
}
}
52