講義パワポ

Download Report

Transcript 講義パワポ

AL12011
池田貴明
*
*
* 1.ORACLEのホームページを開き、→をクリック
http://www.oracle.com/technetwork/java/javas
e/downloads/index.html
* 2.LicenseにAcceptして自分のPCのOS用のリン
クをクリック
*
* 3.JDKをインストールする場所だけ覚えて(or
作って)、インストールします。
* 4.環境変数の設定をします。
* 5.「javac
-version」と「java -version」を実
行して、数字が両方同じ and どちらも問題なく実
行できる、ならOKです。
*
*
* メモ帳とかのテキストエディタでクラスを書いて
いきます。名前の頭は大文字、以降は小文字のほ
うが良いです。(例:Hello.java)
*
* 以下をメモ帳かなんかに入力し、
「Hello.java」という名前で保存します。
public
public
class
Hello {
static void
main(String[]
System.out.println("Hello, world!");
}
}
args) {
*
* 「javac Hello.java」を実行(コンパイル)し、そ
の後「java Hello」を実行してください。
* コマンドラインにHello, world!と表示されれば
OKです。
*
*
* クラスって??
→オブジェクトが持つ特徴や機能をまとめた設計
書のようなもの。例えば車だと、ここが何センチ
で、色が何である、とかの「特徴」、アクセルを
踏むと加速する、ブレーキを踏むと減速する、と
かの「機能」、をまとめたもの。
* オブジェクトって??
→クラスをもとに作成した実体。実体なのでオブ
ジェクトを生成したクラス内で、実際にメソッド
やフィールドの実行、参照ができる。
*
* クラスは次の3つの部品から成り立っています。
1. フィールド
2. メソッド
3. コンストラクタ
*
* オブジェクトの特徴を表したもの
* C言語でいう変数です。
* 実際の書き方は次のスライドのようにします。
*
public class SayHello {
int i = 0;
String s = "Hello!";
フィールド
SayHello() {
System.out.println(i + s);
}
void Meet(String name) {
System.out.println(name + ", nice to meet you!");
}
}
*
* クラスは次の3つの部品から成り立っています。
1. フィールド
2. メソッド
3. コンストラクタ
*
* オブジェクトの機能を表したもの
* C言語でいう関数です。
* 実際の書き方は次のスライドのようにします。
*
public class SayHello {
int i = 0;
String s = "Hello!";
メソッド
SayHello() {
System.out.println(i + s);
}
void Meet(String name) {
System.out.println(name + ", nice to meet you!");
}
}
*
* クラスは次の3つの部品から成り立っています。
1. フィールド
2. メソッド
3. コンストラクタ
*
* クラスに従ってオブジェクトを実体化させる
(実際に作る)ことをインスタンス化(または
オブジェクト生成)と呼びます。
* インスタンス化がおこなわれると、呼ばれたク
ラスの特別なメソッド(関数)であるコンスト
ラクタというものが実行されます。この関数に
は初期化処理を書くことが多いです。
*
public class SayHello {
int i = 0;
String s = "Hello!";
SayHello() {
System.out.println(i + s);
}
コンストラ
クタ
void Meet(String name) {
System.out.println(name + ", nice to meet you!");
}
}
*
* インスタンス化したオブジェクトのフィールド、
メソッドは「.(ドット)」を使うことで参照でき
ます。(例:engine.size、engine.start())
* 基本的にインスタンス化していないオブジェク
トのフィールド、メソッドにはアクセス(参
照)ができません
- アクセスするとランタイムで例外
(NullPointerException)を吐かれます
*
*
* 最初のプログラムを次のように書き換えましょう(Hello.java)
public
class
public
Hello {
static
Human
void main(String[]
aru =
new
args) {
Human("アル");
System.out.println(aru.introduction());
aru.age
=
14;
System.out.println(aru.age);
}
}
*
* HelloクラスでHumanクラスのインスタンスを
作成したいので、Humanクラスを書いていき
ます。
* 次のスライドの内容を「Human.java」という
名前で保存します。
*
public class Human {
String name; //フィールド
int age;
Human(String name) { //コンストラクタ
this.name = name;
}
自分のオブジェクトの
こと(Human)
String introduction() { //メソッド
return this.name+"です!よろしく!";
}
}
「+」で文字列の結合が
できる
*
* 実行結果:
アルです!よろしく!
14
*
* mainメソッドの最初の行
Human aru = new Human("アル");
でHumanクラス型のaruという名前のオブジェク
トを作成していて、次の行の
System.out.println(aru.introduction());
ではaruオブジェクトのintroductionメソッドを呼
んでいます。
* 次の2行
aru.age = 14;
System.out.println(aru.age);
では、最初にaruのフィールド変数ageに14を代入
してから次にその値を参照しています。
*
*
*
* 掲示板ソフトを作るのに必要なもの
1. クライアントプログラム
① ソケット
② 文字列の書き込み、読み取り
③ 例外
2. サーバプログラム
① サーバソケット
② 文字列の書き込み、読み取り
③ マルチスレッド
④ 例外
*
クライアント
クライアント
クライアント
データなど
/サーバー\
*
*
* MyClient.javaをコピーします。
* プログラムの最初(public class ~よりも前の行)に以下を
追加します。
import
java.io.*;
import
java.net.*;
* public class ~の次の行に以下を追加します(フィールド)。
Socket
socket
=
null;
* tryブロックの{ }の間に以下を追加します。
socket
=
new
Socket(args[0],Integer.parseInt(args[1]));
System.out.println(socket.toString());
socket.close();
*
* 「javac
「java
MyClient.java」を実行後、
MyClient
IPアドレス 9999」を実行します
* 以下のようになると思います
(数字は異なります)
*
import java.io.*;
import java.net.*;
* 必要なクラスをインポートします。「*」ですべてのクラス。
Socket socket = null;
* フィールドに変数名を宣言します。
socket = new Socket(args[0],Integer.parseInt(args[1]));
System.out.println(socket.toString());
socket.close();
* Socketオブジェクトを生成し、変数名socketに格納します。
- argsはコマンド実行時の引数が入っている配列です。■
* オブジェクトの情報を標準出力します。
* socketを閉じます。
*
try{
}
catch(Exception e){
e.printStackTrace();
}
* 例外処理です。
* tryブロック内で例外が発生すると、catchブロックに処理が
移り、何かの処理(ここではプリントするだけ)を行います。
* 例外が発生する可能性がある処理を呼び出すときには、必ず
このセットを書かなければなりません。
*
socket = new Socket(args[0],Integer.parseInt(args[1]));
* ソケットと呼びます。2つのマシンの間で通信を行う際の端
点です。■
* new時にIPアドレスとポート番号を指定すると自動的に接続
* 今回はソケットを接続し、ソケットの情報をプリントしただ
けでしたが、InputStreamとOutputStreamをソケットから取
り出すことでデータの入出力ができます。
*
* MyClient.javaに続きを書いていきます。
* public class ~の次の行に以下を追加します(フィールド)。
PrintWriter output = null;
BufferedReader input = null;
* socket = ~とSystem.~の2文をwhile(true){ }で囲み、
socket.close();の後にclose文を2つ追加します。
while(true){
socket = new Socket(args[0],Integer.parseInt(args[1]));
System.out.println(socket.toString());
}
socket.close();
output.close();
input.close();
*
* System.~の次の行(while文の最後)に以下を追加します。
output = new PrintWriter(
new OutputStreamWriter(socket.getOutputStream()),true);
input = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.print("Client>");
String userin = new BufferedReader(
new InputStreamReader(System.in)).readLine();
if(userin.equals("exit"))break;
output.println(userin);
String line = null;
while((line = input.readLine()) != null){
System.out.println("Server>"+line);
}
*
* 「javac
「java
MyClient.java」を実行後、
MyClient
IPアドレス 9999」を実行します
* 入力と同じ文字列が帰ってきて、exitで終了します。
*
PrintWriter output = null;
BufferedReader input = null;
* フィールドに変数名を宣言します。
while(true){
}
* while文です。いわゆる無限ループです。
- Javaではwhile文の条件文はtrueかfalseの値(boolean型)です。
socket.close(); output.close(); input.close();
* いろいろ閉じます。いろいろあるんです。いろいろ。
*
output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()),true);
* 長いので分けます。
OutputStream
os
=
socket.getOutputStream();
* socketからOutputStreamを取り出します。
OutputStreamWriter
osw
=
new
OutputStreamWriter(os);
* 取り出したOutputStreamをOutputStreamWriterに入れます。
output
=
new
PrintWriter(osw,true);
* OutputStreamWriterにtrue(自動flush)を添えてPrintWriter
に盛ったらoutputの完成です。
※画像はイメージです
*
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String userin = new BufferedReader(new InputStreamReader(System.in)).readLine();
* 先ほどと同様です。
* 2行目はオブジェクトの生成とメソッドの呼び出しを同時に
行っています。System.inは標準入力です。
if(userin.equals("exit"))break;
* ユーザの入力がexitと等しければwhileループを抜けます。
- オブジェクト同士を比較するには、
「オブジェクト1.equals(オブジェクト2)」と書きます。
*
while((line = input.readLine()) != null){
System.out.println("Server>"+line);
}
* 入力を1行読み取り、行が続いている限りプリントします。
- オブジェクトがnullでないかを判定するには、
「オブジェクト !=
null」と書きます。
- この場合、readLine()メソッドが行の終了を読み取ったときに、
Stringオブジェクトではなく、nullを返してくるので、それで判
定しています。
*
*
* MyServer.javaをダウンロードします。
* public class MyServer の次にextends~を追加します(継承)。
public
class
MyServer
extends
Thread {
* public class ~の次の行に以下を追加します(フィールド)。
Socket
client
=
null;
* MyServer(Socket socket)の{ }の中に以下を追加します(コン
ストラクタ)。
this.client
=
client;
*
* 1番目のtryの{ }の間に以下を追加します。
ServerSocket server = new ServerSocket(9999);
while(true){
Socket client = server.accept();
System.out.println(client.getInetAddress());
new MyServer(client).start();
}
*
* 「javac MyServer.java」を実行後、「java MyServer」
* 無限ループで処理が止まると思うので、別の端末を立ち上
げて「java MyClient
localhost
* サーバを終了するには「Ctrl+C」
↓クライアント
↓サーバ
9999」を実行します。
*
public
class
* 「extends
MyServer
extends
Thread {
クラス名」と書くことを、クラスを継承すると
言います。
* この場合、Threadクラスに書いてあるフィールドとメソッ
ドを、あたかもMyServerクラスに書いてあるかのように扱う
ことができます。(ただしprivateなものを除く)
* Threadクラスにはマルチスレッドに関する便利な機能が多
く備わっています。
* 継承したクラスのメソッドは内容を書き換えることができま
す。(オーバーライド)(ただしprivateなものを除く)
*
* Threadクラスの使い方
1.
マルチスレッドを実装するクラスにThreadクラスを継承する
public class MyServer extends Thread {
2.
public void run()メソッドをオーバーライドする
@Override
public void run(){
…(以下略)…
3.
外部クラスなどから、実装したクラスをインスタンス化し、
start()メソッドを呼び出す(main関数内)
new MyServer(client).start();
■
*
ServerSocket server = new ServerSocket(9999);
* 9999番ポートで接続を待つサーバソケットをインスタンス化
while(true){
Socket client = server.accept();
System.out.println(client.getInetAddress());
new MyServer(client).start();
}
* 無限ループです。無限にクライアントの接続を受け付けます。
* 接続があるまでプログラムはserver.accept();の部分で処理が
止まっています。
* 接続があるとクラアントからソケットの端を受け取り、もう
片方の端のIPアドレスをプリントし、スレッドを開始します。
*
* MyServer.javaに続きを書いていきます。
* public class ~の次の行に以下を追加します(フィールド)。
static String log = "<<<<< BBS Log >>>>>";
static int count = 0;
* output.println(line);の1行をコメントアウトし、そこに以下
の2行を追加します(close()たちの前の行)。
if(line != null && line.equals("")){
output.println(log+"\n<<<<< END >>>>>");
}
else if(line != null){
log = log+“\n”+(count++)+“. ”+line;
output.println("書き込みました");
}
*
*
* 今回使った講義資料、ソースは以下のHPにおい
てあるので復習とかに役立ててください
*http://rmdy.mydns.jp/