diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..9a874b5 --- /dev/null +++ b/.DS_Store Binary files differ diff --git a/.gitignore b/.gitignore index fb89066..c8cf850 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ *.class .class /bin/ +.DS_Store +/src/output.txt diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index e256158..82b4fe1 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -7,6 +7,7 @@ org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.release=enabled org.eclipse.jdt.core.compiler.source=11 diff --git a/src/Frac.java b/src/Frac.java deleted file mode 100644 index ab620a6..0000000 --- a/src/Frac.java +++ /dev/null @@ -1,94 +0,0 @@ -public class Frac { - - // 確認用 - - public static void main(String[] args) { - Frac d1_3 = new Frac(1,3); - Frac d1_2 = new Frac(1,2); - Frac plus = d1_3.tasu(d1_2); - d1_3.print(); System.out.print("+ "); d1_2.print(); System.out.print("= "); - plus.println(); - - Frac minus = d1_2.hiku(d1_3); - d1_3.print("-"); d1_2.print("="); minus.println(); - - Frac d7_63 = new Frac(7,63); - d7_63.print("="); - d7_63.yakubun(); - d7_63.println(); - - Frac d2_1 = new Frac(2,1); - Frac mul = d1_2.kakeru(d2_1); - d1_2.print("*"); d2_1.print("="); - mul.print("="); - mul.yakubun().println(); - - Frac div = d1_2.waru(d2_1); - d1_2.print("/"); d2_1.print("="); - div.println(); - - Frac d = new Frac(4209,18453); - Frac e = new Frac(83, 324); - d.tasu(e).yakubun().println(); //メソッドチェーン - d.waru(e).yakubun().println(); //メソッドチェーン -} - -//メンバー変数 - int a; //bunsi - int b; //bumbo - - // コンストラクタ - public Frac() { - a = 2; b = 3; - } - public Frac(int ia, int ib) { - a = ia; b = ib; - } - - //メソッド - public void setBunsiBumbo(int fa, int fb){ - a = fa; b = fb; - } - public void print(){ - System.out.print(a+"/"+b+" "); - } - public void print(String append){ - System.out.print(a+"/"+b+" "+append+" "); - } - public void println(){ - System.out.println(a+"/"+b); - } - public Frac tasu(Frac f){ - int na = a * f.b + b * f.a; - int nb = b * f.b; - return new Frac(na,nb); - } - public Frac hiku(Frac f){ - int na = a * f.b - b * f.a; - int nb = b * f.b; - return new Frac(na,nb); - } - public Frac kakeru(Frac f){ - int na = a * f.a; - int nb = b * f.b; - return new Frac(na,nb); - } - public Frac waru(Frac f){ - int na = a * f.b; - int nb = b * f.a; - return new Frac(na,nb); - } - public Frac yakubun(){ //約分:破壊的メソッド - int g = gcd(a,b); - a = a/g ; b = b/g; - return new Frac(a,b); //一応新しいオブジェクトもつくって返す(メソッドチェーンするため) - } - private int gcd(int m, int n){ - while (m != n) { - if (m < n) { n -= m; } - else { m -= n; } - } - return n; - } -} - diff --git a/src/Main.java b/src/Main.java deleted file mode 100644 index a017768..0000000 --- a/src/Main.java +++ /dev/null @@ -1,29 +0,0 @@ -import java.io.BufferedReader; -import java.io.InputStreamReader; - -public class Main { - public static void main(String args[]){ - int x, y=0 ; - InputStreamReader isr = new InputStreamReader(System.in) ; //標準入力(=キーボード) - BufferedReader br = new BufferedReader(isr) ; - System.out.print("input integer: ") ; - String buf ; - try{ - buf = br.readLine() ; // キーボード入力を文字列として読み取る - x = Integer.parseInt(buf) ; // 文字列を整数に変換 - } catch(Exception e){ // 読み込んだ文字列が整数に変換できない場合 - x = 0; - } - System.out.println("Input Number = " + x) ; - - /*?? 変数yに値を設定する */ - - /*?? 和、差、積、商(小数部分は切り捨て)、剰余(演算子は%をつかいます)を表示する - * 答えがわかるように表示されれば、改行の有無や表記などは、気にしなくてよい */ - System.out.println("和は "+(x+y)+" です"); - - System.out.println("submitted by 17A5000") ; - // 出力する文字列を各自の学生番号に置き換えること - - } // end main -} diff --git a/src/PPAP.java b/src/PPAP.java deleted file mode 100644 index bde27e7..0000000 --- a/src/PPAP.java +++ /dev/null @@ -1,52 +0,0 @@ -import java.util.ArrayList; - -public class PPAP { - - public static void main(String[] args) { - ArrayList alist = new ArrayList(); //可変長配列 - Pen pen = new Pen(); - Apple apple = null; - alist.add(pen); - alist.add(new Pineapple()); - alist.add(apple = new Apple()); - alist.add(pen); - - for(BaseObj bo: alist) { - System.out.print(bo.getName()+"\t"); - } - System.out.println(""); - for(BaseObj bo: alist) { - System.out.print(bo.hashCode()+" "); // インスタンス/オブジェクト固有のID - } - System.out.println(""); - System.out.println(""); - - // 通常の配列Version - BaseObj[] ary = new BaseObj[4]; - ary[0] = pen; - ary[1] = new Pineapple(); - ary[2] = apple; - ary[3] = pen; - for(BaseObj bo: ary) { - System.out.print(bo.getName()+"\t"); - } - System.out.println(""); - for(BaseObj bo: ary) { - System.out.print(bo.hashCode()+" "); // インスタンス/オブジェクト固有のID - } - System.out.println(""); - System.out.println(""); - - System.out.println("生成したオブジェクトの総数は?です"); // ?の部分を、数字におきかえてください - } -} - -class BaseObj { - // インスタンス/オブジェクトが作られたときの「型」=「クラス名」を返す - public String getName() { - return getClass().getName(); - } -} -class Pen extends BaseObj { } -class Pineapple extends BaseObj { } -class Apple extends BaseObj { } \ No newline at end of file diff --git a/src/j1/HelloNW.java b/src/j1/HelloNW.java index 9d5f071..79c0782 100644 --- a/src/j1/HelloNW.java +++ b/src/j1/HelloNW.java @@ -5,7 +5,7 @@ public static void main(String[] args) { System.out.println("Hello!"); System.out.print("Welcome to "); - System.out.print("nerwork programming "); + System.out.print("network programming "); System.out.println("in Java!"); } } diff --git a/src/j1/SleepSort.java b/src/j1/SleepSort.java new file mode 100644 index 0000000..5bc7462 --- /dev/null +++ b/src/j1/SleepSort.java @@ -0,0 +1,42 @@ +package j1; + +import java.util.Random; + +public class SleepSort extends Thread { + public static void main(String[] args) { + + int[] data = new int[12]; + // 乱数をつかってデータの生成 + Random rand = new Random(); + for(int i=0;i<12;i++){ + data[i] = rand.nextInt(50)+1; + } + System.out.println("いまから、以下の数値を「小さい順」に画面に表示していきます。"); + for(int i=0; i<12;i++){ + System.out.print(data[i]+" "); + } + System.out.println(""); + + for(int i=0; i<12;i++){ + SleepSort ss = new SleepSort(data[i]); + ss.start(); + } + System.out.println("-------------------------------------------------"); + + } + + int datum; // データの単数形 + int msec; + SleepSort(int d){ + datum = d; + msec = d*200; //ここの数字を変えると、ソート完了時間に影響する + } + public void run(){ + try { + sleep(msec); // msec ミリ秒動作休止 + + System.out.println(this.datum ); // 数値を表示 + } catch (InterruptedException e) { + } + } +} diff --git a/src/j1/TestThread.java b/src/j1/TestThread.java index c57793a..867fce6 100644 --- a/src/j1/TestThread.java +++ b/src/j1/TestThread.java @@ -1,38 +1,41 @@ -package j1; - -//----------------------------------------------------------- -public class TestThread { - public static void main(String[] args) { - System.out.print("TestThread started."); - - MyThread mt1 = new MyThread("1s ", 1000); - MyThread mt2 = new MyThread("2s ", 2000); - MyThread mt3 = new MyThread("2.33s ", 2333); - - mt1.start(); - mt2.start(); - mt3.start(); - } -}; - -// ----------------------------------------------------------- -class MyThread extends Thread { - String str; - int msec; - - MyThread(String txt, int ms) { - this.str = txt; - this.msec = ms; - } - - public void run() { - while (true) { - try { - System.out.print(this.str); - sleep(msec); // tミリ秒動作休止 - } catch (InterruptedException e) { - break; - } - } // end while - } // end of run -} // end of class myThread +package j1; + +//----------------------------------------------------------- +public class TestThread { + public static void main(String[] args) { + System.out.print("TestThread started."); + + MyThread mt1 = new MyThread("1s ", 1000); + MyThread mt2 = new MyThread("2s ", 2000); + MyThread mt3 = new MyThread("2.33s ", 2333); + + mt1.start(); + mt2.start(); + mt3.start(); + } +}; + +// ----------------------------------------------------------- +class MyThread extends Thread { + String str; // 識別用の文字列 + int msec; // 実行間隔(ミリ秒) + int count = 0; + + MyThread(String txt, int ms) { + this.str = txt; + this.msec = ms; + } + + public void run() { + while (true) { + try { + System.out.println(this.str+" (count="+count+")" ); + sleep(msec); // tミリ秒動作休止 + count++; // カウンタを1つ増やす + } catch (InterruptedException e) { + break; + } + } // end while + } // end of run +} // end of class myThread + diff --git a/src/j2/EchoClient.java b/src/j2/EchoClient.java index ce0c233..984fc64 100644 --- a/src/j2/EchoClient.java +++ b/src/j2/EchoClient.java @@ -8,29 +8,37 @@ import java.net.UnknownHostException; public class EchoClient { + // プログラムの本体main public static void main(String[] args) { + if (args.length < 2) { // もしコマンドライン引数の数が1つ以下だったら、ここで設定したIPaddress, PortNumをつかう。 + // コマンドライン引数を2つ設定していたら、それを用いる。 + args = new String[2]; + args[0] = "127.0.0.1"; + args[1] = "9999"; + } + new EchoClient(args[0], args[1]); + } + + public EchoClient(String address, String strport) { // ソケットや入出力用のストリームの宣言 Socket socket = null; DataOutputStream dos = null; BufferedReader isbr = null; BufferedReader stdinbr = null; - if (args.length < 2) { - args = new String[2]; - args[0] = "127.0.0.1"; // 接続先アドレス - args[1] = "9999"; //ポート番号 - } - String host = args[0]; - int port = Integer.parseInt(args[1]); + int port = Integer.parseInt(strport); try { - socket = new Socket(host, port); - dos = new DataOutputStream(socket.getOutputStream()); - isbr = new BufferedReader(new InputStreamReader(socket.getInputStream())); - stdinbr = new BufferedReader(new InputStreamReader(System.in)); + socket = new Socket(address, port); + isbr = new BufferedReader(new InputStreamReader(socket.getInputStream())); // サーバからの文字列読み出し + + stdinbr = new BufferedReader(new InputStreamReader(System.in)); // 標準入力からの文字列読み出し + + dos = new DataOutputStream(socket.getOutputStream()); // サーバへの文字列書き出し } catch (UnknownHostException e) { - System.err.println("Don't know about host: " + host); + System.err.println("Don't know about host: " + address); } catch (IOException e) { - System.err.println("Echoサーバ [" + host+":"+port+"] に接続できませんでした"); + System.err.println("Echoサーバ [" + address + ":" + port + "] に接続できませんでした"); + System.exit(1); // 異常終了(エラーで終了)なら1 } // サーバーにメッセージを送る diff --git a/src/j2/EchoServer.java b/src/j2/EchoServer.java index 93d8ec7..68403f9 100644 --- a/src/j2/EchoServer.java +++ b/src/j2/EchoServer.java @@ -9,38 +9,43 @@ import java.net.Socket; public class EchoServer { - @SuppressWarnings("resource") public static void main(String args[]) { + if (args.length < 2) { // もしコマンドライン引数の数が1つ以下だったら、ここで設定したBind Address, PortNumをつかう。 + // コマンドライン引数を2つ設定していたら、それをBind Address, PortNumとして用いる。 + args = new String[2]; + args[0] = "127.0.0.1"; // Bind Address + args[1] = "9999"; // ポート9999番を開く + } + new EchoServer(args[0], args[1]); + } + + public EchoServer(String bindaddress, String strport) { // ソケットや入出力用のストリームの宣言 ServerSocket echoServer = null; + Socket clientSocket = null; String line; BufferedReader br; PrintStream os; - Socket clientSocket = null; - if (args.length < 2) { - args = new String[2]; - args[0] = "127.0.0.1"; - // ポート9999番を開く - args[1] = "9999"; - } - String bindaddress = args[0]; - int port = Integer.parseInt(args[1]); + int port = Integer.parseInt(strport); try { echoServer = new ServerSocket(); - echoServer.bind(new InetSocketAddress(bindaddress, port)); // サーバソケットにバインドする=ポートでの待ち受け開始 + // クライアントからの要求を受けるソケットを開く + echoServer.bind(new InetSocketAddress(bindaddress, port)); // サーバソケットにバインドする=ポートでの待ち受け開始 } catch (IOException e) { System.err.println(e); - System.err.println("バインド失敗。ポート番号 "+port+" (Bind-address: "+bindaddress+" 向け) がすでにつかわれているようです"); + System.err.println("バインド失敗。ポート番号 " + port + " (Bind-address: " + bindaddress + " 向け) がすでにつかわれているようです"); System.err.println("ポート番号またはバインドアドレスを変更してください。"); + System.err.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。"); System.exit(1); } - System.out.println("EchoServer ["+bindaddress+":"+port+"] started."); + System.out.println("EchoServer [" + bindaddress + ":" + port + "] started."); + System.out.println("停止するには CTRL+C をおしてください"); + // サーバ側の処理の繰り返し while (true) { try { - // クライアントからの要求を受けるソケットを開く - clientSocket = echoServer.accept(); + clientSocket = echoServer.accept(); // 接続がくるまで、ここで待つ System.out.println("accept"); br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); os = new PrintStream(clientSocket.getOutputStream()); diff --git a/src/j2/ThreadEchoClient.java b/src/j2/ThreadEchoClient.java index e398b66..df6d8eb 100644 --- a/src/j2/ThreadEchoClient.java +++ b/src/j2/ThreadEchoClient.java @@ -32,7 +32,8 @@ break; } } catch (IOException e) { - e.printStackTrace(); + System.out.println("サーバとの接続が切れました。"); + // e.printStackTrace(); } finally { System.exit(0); } diff --git a/src/j2/ThreadEchoServer.java b/src/j2/ThreadEchoServer.java index 28cdbee..36e4a70 100644 --- a/src/j2/ThreadEchoServer.java +++ b/src/j2/ThreadEchoServer.java @@ -14,13 +14,12 @@ ThreadEchoServer(Socket sc) { sock = sc; - // start running thread = new Thread(this); - thread.start(); // スレッドが run()を背負って走る + thread.start(); // 別のスレッドでrun()を動作させる。メインのスレッドはrun()の終了を待たずにmain()に戻る } @Override - public void run() { + public void run() { String line = null; BufferedReader br = null; PrintStream os = null; @@ -48,7 +47,7 @@ ServerSocket echoServer = null; Socket clientSocket = null; - if (args.length < 2) { + if (args.length < 2) { // 引数の数が2つ未満の場合、以下の設定を用いる。(変更したら再コンパイルが必要) args = new String[2]; args[0] = "127.0.0.1"; // ポート9999番を開く @@ -63,6 +62,7 @@ System.err.println(e); System.err.println("バインド失敗。ポート番号 "+port+" (Bind-address: "+bindaddress+" 向け) がすでにつかわれているようです"); System.err.println("ポート番号またはバインドアドレスを変更してください。"); + System.out.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。"); System.exit(1); } System.out.println("ThreadEchoServer ["+bindaddress+":"+port+"] started."); @@ -74,7 +74,7 @@ } catch (IOException e) { e.printStackTrace(); } - new ThreadEchoServer(clientSocket); + new ThreadEchoServer(clientSocket); //クライアントからの要求をスレッドで捌く } } } diff --git a/src/j2/ThreadTimeServer.java b/src/j2/ThreadTimeServer.java index 73899c2..fab8917 100644 --- a/src/j2/ThreadTimeServer.java +++ b/src/j2/ThreadTimeServer.java @@ -1,10 +1,10 @@ package j2; -// 時刻を答えるサーバプログラムTimeServer.java +// 時刻を答えるサーバプログラムThreadTimeServer.java -// このプログラムはポート番号5555番で動作するサーバです +// このプログラムはポート番号9999番で動作するサーバです // クライアントから接続がきたら、一方的に時刻を返します // このプログラムを停止させるにはコントロールCを入力してください -// 使い方: java TimeServer +// 使い方: java ThreadTimeServer // ライブラリの利用 import java.io.IOException; @@ -34,28 +34,28 @@ String outstr; // 出力データを格納する文字列 Date d; // 日付時刻処理用オブジェクト - System.out.println("(TimeServer) accepted (client has connected)"); + System.out.println("(ThreadTimeServer) accepted (client has connected)"); System.out.println(sock.getRemoteSocketAddress().toString()); try { os = new PrintStream(sock.getOutputStream()); // 出力用データの作成 d = new Date(); - outstr = "\n" + "Hello, this is TimeServer.\n" + d.toString() + "\n"; - System.out.println("(Server-side message) " + outstr); + outstr = "\n" + "Hello, this is ThreadTimeServer.\n" + d.toString() + "\n"; + System.out.println("(サーバ→クライアント) " + outstr); // データの出力(1回目) os.println(outstr); Thread.sleep(3000); // 3秒まつ outstr = new Date().toString(); os.println(outstr); // データの出力(2回目) - System.out.println("(Server-side message) " + outstr); + System.out.println("(サーバ→クライアント) " + outstr); Thread.sleep(3000); // 3秒まつ outstr = "Thank you."; os.println(outstr); - System.out.println("(Server-side message) " + outstr); + System.out.println("(サーバ→クライアント) " + outstr); os.close(); // 接続終了 sock.close(); - System.out.println("(TimeServer) クライアントからの接続を閉じました"); + System.out.println("(ThreadTimeServer) クライアントからの接続を閉じました"); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { @@ -67,12 +67,12 @@ ServerSocket svsock = null;// サーバ用ソケット Socket sock;// ソケットの読み書き用オブジェクト - if (args.length < 2) { + if (args.length < 2) { // 引数の数が2つ未満の場合、以下の設定を用いる。(変更したら再コンパイルが必要) args = new String[2]; // バインドするアドレスとポートを指定 args[0] = "127.0.0.1"; // ポート9999番を開く - args[1] = "5555"; + args[1] = "9999"; } String bindaddress = args[0]; int port = Integer.parseInt(args[1]); @@ -96,6 +96,7 @@ } catch (IOException e) { System.out.println("*** Exception ***"); System.out.println(e); + System.out.println("ポート番号を変更するか,\nコマンド killall java を実行して全てのJavaプロセスを終了してください。"); System.exit(1); } } diff --git a/src/j2/TimeClient.java b/src/j2/TimeClient.java index 3431105..64dc6af 100644 --- a/src/j2/TimeClient.java +++ b/src/j2/TimeClient.java @@ -15,22 +15,23 @@ public class TimeClient { // プログラムの本体main public static void main(String[] args) { - Socket csock = null;// サーバ接続用ソケット - BufferedReader reader = null; - if (args.length < 2) { + if (args.length < 2) { // 引数の数が2つ未満の場合、以下の設定を用いる。(変更したら再コンパイルが必要) args = new String[2]; - args[0] = "127.0.0.1"; - args[1] = "5555"; + args[0] = "127.0.0.1"; // IPaddress + args[1] = "9999"; // PortNum } + new TimeClient(args[0],args[1]); + } + public TimeClient(String address, String strport){ + Socket socket = null;// サーバ接続用ソケット + BufferedReader reader = null; // 指定のポートに対して,ソケットを作成します // オブジェクトinstrを作り,データ読み出しを準備します try { - csock = new Socket(args[0], Integer.parseInt(args[1])) ; // 第2引数は文字列を整数に変換して渡す - // csock = new Socket("127.0.0.1", 5555); // ローカルホストのサーバに接続するとき - // csock = new Socket("10.104.89.61", 5555) ;//別ホストのサーバに接続する例(サーバのIPアドレスはipコマンドで調査しておく) - reader = new BufferedReader(new InputStreamReader(csock.getInputStream())); + socket = new Socket(address, Integer.parseInt(strport)) ; // 第2引数は文字列を整数に変換して渡す + reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); } catch (Exception e) { - System.err.println("サーバ ["+args[0]+":"+args[1]+"] に接続できませんでした"); + System.err.println("サーバ ["+address+":"+strport+"] に接続できませんでした"); System.exit(1); // 異常終了(エラーで終了)なら1 } diff --git a/src/j2/TimeServer.java b/src/j2/TimeServer.java index 06fcbd7..aaf7796 100644 --- a/src/j2/TimeServer.java +++ b/src/j2/TimeServer.java @@ -1,12 +1,6 @@ package j2; // 時刻を答えるサーバプログラムTimeServer.java -// このプログラムはポート番号5555番で動作するサーバです -// クライアントから接続がきたら、一方的に時刻を返します -// このプログラムを停止させるにはコントロールCを入力してください -// 使い方: java TimeServer - -// ライブラリの利用 import java.io.IOException; import java.io.PrintStream; import java.net.InetSocketAddress; @@ -17,64 +11,67 @@ // TimeServerクラス public class TimeServer { public static void main(String args[]) { - ServerSocket svsock = null;// サーバ用ソケット - Socket sock;// ソケットの読み書き用オブジェクト + if (args.length < 2) { // 引数の数が2つ未満の場合、以下の設定を用いる。(変更したら再コンパイルが必要) + args = new String[2]; + // ローカルホストからの接続のみを受け付ける場合 "127.0.0.1" + // 別のホストからの接続も受け付ける場合 "0.0.0.0" + args[0] = "127.0.0.1"; // Bind Address + args[1] = "9999"; // ポート番号 9999 で待ち受ける + } + new TimeServer(args[0], args[1]); + } + + public TimeServer(String bindaddress, String strport) { + ServerSocket timeServer = null;// サーバ用ソケット + Socket clientSocket;// ソケットの読み書き用オブジェクト PrintStream os; String outstr; // 出力データを格納する文字列 Date d; // 日付時刻処理用オブジェクト - if (args.length < 2) { - args = new String[2]; - args[0] = "0.0.0.0"; - // ローカルホストからの接続のみを受け付ける場合 "127.0.0.1" - // 別のホストからの接続も受け付ける場合 "0.0.0.0" - - // デフォルトでは、ポート5555番を開く - args[1] = "5555"; - } - String bindaddress = args[0]; - int port = Integer.parseInt(args[1]);// 文字列を整数に変換 + int port = Integer.parseInt(strport);// 文字列を整数に変換 try { - svsock = new ServerSocket(); // サーバソケットの作成 - svsock.bind(new InetSocketAddress(bindaddress, port)); // サーバソケットにバインドする=ポートでの待ち受け開始 + timeServer = new ServerSocket(); // サーバソケットの作成 + // クライアントからの要求を受けるソケットを開く + timeServer.bind(new InetSocketAddress(bindaddress, port)); // サーバソケットにバインドする=ポートでの待ち受け開始 } catch (IOException e) { System.err.println(e); System.err.println("バインド失敗。ポート番号 " + port + " (Bind-address: " + bindaddress + " 向け) がすでにつかわれているようです"); System.err.println("ポート番号またはバインドアドレスを変更してください。"); + System.err.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。"); System.exit(1); } - System.out.println("TimeServer started. [" + bindaddress + ":" + port + "]"); System.out.println("停止するには CTRL+C をおしてください"); // サーバ側の処理の繰り返し - try { - while (true) { - sock = svsock.accept();// 接続がくるまで待つ + while (true) { + try { + clientSocket = timeServer.accept(); // 接続がくるまで、ここで待つ System.out.println("(TimeServer) accepted (client has connected)"); - System.out.println(sock.getRemoteSocketAddress().toString()); - os = new PrintStream(sock.getOutputStream()); + System.out.println(clientSocket.getRemoteSocketAddress().toString()); + os = new PrintStream(clientSocket.getOutputStream()); + // 出力用データの作成 d = new Date(); outstr = "\n" + "Hello, this is TimeServer.\n" + d.toString() + "\n"; - System.out.println("(Server-side message) " + outstr); + System.out.println("(サーバ→クライアント) " + outstr); // データの出力(1回目) os.println(outstr); Thread.sleep(3000); // 3秒まつ outstr = new Date().toString(); os.println(outstr); // データの出力(2回目) - System.out.println("(Server-side message) " + outstr); + System.out.println("(サーバ→クライアント) " + outstr); Thread.sleep(3000); // 3秒まつ outstr = "Thank you."; os.println(outstr); - System.out.println("(Server-side message) " + outstr); + System.out.println("(サーバ→クライアント) " + outstr); os.close(); // 接続終了 - sock.close(); + clientSocket.close(); System.out.println("(TimeServer) クライアントからの接続を閉じました"); + } catch (Exception ex) { + ex.printStackTrace(); } - } catch (Exception ex) { - ex.printStackTrace(); } } } diff --git a/src/j3/Phttpd.java b/src/j3/Phttpd.java index 4cfa9e5..f429199 100644 --- a/src/j3/Phttpd.java +++ b/src/j3/Phttpd.java @@ -1,94 +1,95 @@ -package j3; -// いんちきHTTPサーバPhttpd.java (pseudo-HTTP-Daemon) pseudoの発音はスード - -// このプログラムはポート番号8000番で動作するサーバです -// 使い方: java j3.Phttpd ファイル名 -// WWWクライアントからの接続に対して、引数で指定したファイルを返します。 - -// ライブラリの利用 -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; - -// Phttpdクラス -public class Phttpd { - public static void main(String args[]) { - // サーバソケット - ServerSocket servsock = null; - Socket sock; - - // 入出力 - DataOutputStream dostr; - BufferedReader in; - FileInputStream infile = null; - byte[] buff = new byte[1024]; - - // その他 - boolean cont = true; - - if (args.length == 0) // 引数がない場合、以下のファイルを返すことにする - args = new String[] { "src/j3/index.html" }; // 相対パスで指定。windowsの場合、user.dir=NWP - // args = new String[] { "j3/index.html" };//Linuxの場合、通常はcd NWP/src しているはず - System.out.println("このサーバは" + args[0] + "を返します。"); - System.out.println(System.getProperty("user.dir")); - try { - // サーバ用ソケットの作成(ポート番号8000番) - servsock = new ServerSocket(8000); - while (true) { - sock = servsock.accept();// 接続要求の受付 - // 接続先の表示 - System.out.println("---\nConnection Requst from: " + (sock.getInetAddress())); - // オブジェクトinfileを作り,ファイルを準備します - try { - infile = new FileInputStream(args[0]); - } catch (Exception e) { - // ファイル準備の失敗 - System.err.println("ファイルがありません"); - System.exit(1); - } - // 読み書き用オブジェクトの生成 - in = new BufferedReader(new InputStreamReader(sock.getInputStream())); - dostr = new DataOutputStream(sock.getOutputStream()); - // read headers - StringBuffer request = new StringBuffer(); - String line; - while ((line = in.readLine()) != null) { - System.out.println(line); - request.append(line + "\r\n"); - if (line.length() < 1) - break; - } - - // Response Headerの出力 - String CRLF = "\r\n"; - String response = "HTTP/1.1 200" + CRLF + "Content-type: text/html; charset=UTF-8" + CRLF + CRLF; - dostr.write(response.getBytes()); - - // Response Bodyの出力 - cont = true; - while (cont) { - // ファイルからの読み込みとネットワーク出力 - try { - int n = infile.read(buff); - dostr.write(buff, 0, n); - } catch (Exception e) { // end of file - cont = false; - } - } - // おまけ:レスポンスヘッダを表示 - dostr.write(request.toString().getBytes()); - - // 接続終了 - sock.close(); - infile.close(); - } - } catch (IOException e) { - System.out.println("異常終了:ポート番号の重複の可能性あり"); - System.exit(1); // 異常終了は1 - } - } -} +package j3; +// いんちきHTTPサーバPhttpd.java (pseudo-HTTP-Daemon) pseudoの発音はスード + +// このプログラムはポート番号8000番で動作するサーバです +// 使い方: java j3.Phttpd ファイル名 +// WWWクライアントからの接続に対して、引数で指定したファイルを返します。 + +// ライブラリの利用 +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.ServerSocket; +import java.net.Socket; + +// Phttpdクラス +public class Phttpd { + public static void main(String args[]) { + // サーバソケット + ServerSocket servsock = null; + Socket sock; + + // 入出力 + DataOutputStream dostr; + BufferedReader in; + FileInputStream infile = null; + byte[] buff = new byte[1024]; + + // その他 + boolean cont = true; + + if (args.length == 0) // 引数がない場合、以下のファイルを返すことにする + // args = new String[] { "src/j3/index.html" }; // 相対パスで指定。windowsの場合、user.dir=NWP + args = new String[] { "j3/index.html" };//Linuxの場合、通常はcd NWP/src しているはず + System.out.println("このサーバは" + args[0] + "を返します。"); + System.out.println(System.getProperty("user.dir")); + try { + // サーバ用ソケットの作成(ポート番号8000番) + servsock = new ServerSocket(8000); + while (true) { + sock = servsock.accept();// 接続要求の受付 + // 接続先の表示 + System.out.println("---\nConnection Requst from: " + (sock.getInetAddress())); + // オブジェクトinfileを作り,ファイルを準備します + try { + infile = new FileInputStream(args[0]); + } catch (Exception e) { + // ファイル準備の失敗 + System.err.println("ファイルがありません"); + System.exit(1); + } + // 読み書き用オブジェクトの生成 + in = new BufferedReader(new InputStreamReader(sock.getInputStream())); + dostr = new DataOutputStream(sock.getOutputStream()); + // read headers + StringBuffer request = new StringBuffer(); + String line; + while ((line = in.readLine()) != null) { + System.out.println(line); + request.append(line + "\r\n"); + if (line.length() < 1) + break; + } + + // Response Headerの出力 + String CRLF = "\r\n"; + String response = "HTTP/1.1 200" + CRLF + "Content-type: text/html; charset=UTF-8" + CRLF + CRLF; + dostr.write(response.getBytes()); + + // Response Bodyの出力 + cont = true; + while (cont) { + // ファイルからの読み込みとネットワーク出力 + try { + int n = infile.read(buff); + dostr.write(buff, 0, n); + } catch (Exception e) { // end of file + cont = false; + } + } + // おまけ:レスポンスヘッダを表示 + dostr.write(request.toString().getBytes()); + + // 接続終了 + sock.close(); + infile.close(); + } + } catch (IOException e) { + System.out.println("異常終了:ポート番号の重複の可能性あり"); + System.exit(1); // 異常終了は1 + } + } +} + diff --git a/src/j3/Thttpd.java b/src/j3/Thttpd.java index 6471935..4e7e6cc 100644 --- a/src/j3/Thttpd.java +++ b/src/j3/Thttpd.java @@ -28,13 +28,15 @@ ServerSocket servsock = null; Socket sock; + System.out.println(args.length); - if (args.length == 0) // 引数がない場合、以下のファイルを返すことにする - args = new String[] { "src/j3/index.html", "8000" }; // 相対パスで指定。windowsの場合、user.dir=NWP - // args = new String[] { "j3/index.html" ,"8000"};//Linuxの場合、通常はcd NWP/srcしているはず + if (args.length == 0 || args[0].length() < 1) { // 引数がない場合、以下のファイルを返すことにする + args = new String[] { "j3/index.html", "8000" };// Linuxの場合、通常はcd NWP/srcしているはず + // args = new String[] { "src/j3/index.html", "8000" }; // + // windowsの場合、user.dir=NWP + } int portnum = Integer.parseInt(args[1]); - System.out.println("このサーバは" + args[0] + "を返します。ポート番号は "+portnum+" です。"); - // System.out.println(System.getProperty("user.dir")); + System.out.println("このサーバは" + args[0] + "を返します。ポート番号は " + portnum + " です。"); showUrls(portnum); try { @@ -51,9 +53,9 @@ } /** - * ネットワークインタフェースを調べて、10.104ではじまるIPアドレスについて表示する + * ネットワークインタフェースを調べて、接続可能なIPアドレスについて表示する */ - public static void showUrls(int pnum){ + public static void showUrls(int pnum) { Enumeration interfaces; try { interfaces = NetworkInterface.getNetworkInterfaces(); @@ -64,11 +66,11 @@ InetAddress i = (InetAddress) addresses.nextElement(); String ip = i.getHostAddress(); String[] seg = ip.split("\\."); // .で文字列分割 - if (seg.length==4) //分割したセグメントが4つあればIPv4 - System.out.println("http://"+ip+":"+pnum); + if (seg.length == 4) // 分割したセグメントが4つあればIPv4 + System.out.println("http://" + ip + ":" + pnum); } } - } catch (SocketException e1) { + } catch (SocketException e1) { e1.printStackTrace(); } diff --git a/src/j4/PiClient.java b/src/j4/PiClient.java index f99679c..d815d40 100644 --- a/src/j4/PiClient.java +++ b/src/j4/PiClient.java @@ -12,10 +12,6 @@ // ライブラリの利用 import java.rmi.Naming; -import java.rmi.RemoteException; -import java.net.MalformedURLException; -import java.rmi.NotBoundException; -import java.util.* ; //PiClientクラス public class PiClient{ @@ -26,6 +22,9 @@ long millis ;//経過時間 long maxloopcount = 10000000 ;//発生する点の個数 + // 引数の指定がなかった場合はlocalhost + if (args.length==0) args = new String[]{"localhost"}; + try{ //計算開始 System.out.println("Start") ; diff --git a/src/j4/PiDistClient.java b/src/j4/PiDistClient.java index f44b0f7..7a273a5 100644 --- a/src/j4/PiDistClient.java +++ b/src/j4/PiDistClient.java @@ -1,115 +1,118 @@ -package j4; -// RMIによる分散処理プログラムの実装例 -// (5)クライアントプロセス実装のクラスファイル - -// PiDistClient.java -// このクラスは、クライアントプロセスのクラスです -// 分散処理システムにおけるクライアントの機能を記述します -// RMIレジストリにおける名前の取得や、サーバへの仕事の依頼を行います -// 使用方法 -// java j4.PiDistClient サーバ名1 サーバ名2 ・・・ -// なお、クライアント起動の前に、サーバとレジストリを起動してください - -// ライブラリの利用 -import java.rmi.Naming; - -//PiDistClientクラス -public class PiDistClient{ - - // mainメソッド - public static void main(String args[]){ -// long result = 0 ;//サーバの計算結果を格納する - long millis ;//経過時間 - long maxloopcount = 10000000 ;//点の個数 - int i ;//サーバの数 - - //スレッドを構成するための配列を宣言する - // PiDistClientでは、サーバの数だけスレッドを作成します - // 各スレッドはサーバの計算処理終了を待ち、 - // 終了後Resultクラスのオブジェクトに結果を報告します - LaunchPiServer l[] = new LaunchPiServer[args.length]; - Thread t[] = new Thread [args.length]; - - //処理の本体 - try{ - //処理時間計測開始 - millis = System.currentTimeMillis() ; - //引数で指定されたサーバに処理を依頼します - for(i=0;i connections; + static final int DEFAULT_PORT = 6000;// ポート番号省略時は6000 番を使います + static ServerSocket serverSocket; + static ArrayList connections; - // sendAllメソッド - // 各クライアントにメッセージを送ります - public static void sendAll(String t){ - if (connections != null){// コネクションがあれば実行します - for (Socket s : connections) { + // sendAllメソッド + // 各クライアントにメッセージを送ります + public static void sendAll(String t) { + if (connections != null) {// コネクションがあれば実行します + for (Socket s : connections) { + try { + PrintWriter pw = new PrintWriter(s.getOutputStream()); + pw.println(t); + pw.flush(); + } catch (IOException ex) { + } + } + } + System.out.println(t); + } + + // addConnectionメソッド + // クライアントとの接続を追加します + public static void addConnection(Socket s) { + if (connections == null) { + connections = new ArrayList(); + } + connections.add(s); + } + + // deleteConnectionメソッド + // あるクライアントとのコネクションを削除します + public static void deleteConnection(Socket s) { + if (connections != null) { + connections.remove(s); + } + } + + // mainメソッド + // サーバソケットを作り,クライアントからの接続を待ち受けます + public static void main(String[] arg) { + int port = DEFAULT_PORT; + if (arg.length > 0) + port = Integer.parseInt(arg[0]); try { - PrintWriter pw = new PrintWriter(s.getOutputStream()); - pw.println(t); - pw.flush(); - }catch (IOException ex){} - } + serverSocket = new ServerSocket(port); + } catch (IOException e) { + System.out.println(e); + System.out.println("バインド失敗。ポート番号 "+port+"がすでにつかわれているようです"); + System.out.println("ポート番号を変更するか、killall java でポートを使用している他のプロセスを終了してください。"); + System.exit(1); + } + while (true) { + try { + Socket cs = serverSocket.accept(); + addConnection(cs); + Thread ct = new Thread(new ClientProc(cs)); + ct.start(); + } catch (IOException e) { + System.err.println(e); + } + } } - System.out.println(t); - } - - // addConnectionメソッド - // クライアントとの接続を追加します - public static void addConnection(Socket s){ - if (connections == null){ - connections = new ArrayList(); - } - connections.add(s); - } - - // deleteConnectionメソッド - // あるクライアントとのコネクションを削除します - public static void deleteConnection(Socket s){ - if (connections != null){ - connections.remove(s); - } - } - - // mainメソッド - // サーバソケットを作り,クライアントからの接続を待ち受けます - public static void main(String[] arg){ - int port = DEFAULT_PORT ; - if (arg.length > 0) port = Integer.parseInt(arg[0]) ; - try { - serverSocket = new ServerSocket(port); - }catch (IOException e){ - System.err.println(e); - System.exit(1); - } - while (true) { - try { - Socket cs = serverSocket.accept(); - addConnection(cs); - Thread ct = new Thread(new ClientProc(cs)); - ct.start(); - }catch (IOException e){ - System.err.println(e); - } - } - } } // ClientProcクラス // クライアント処理用スレッドのひな形です class ClientProc implements Runnable { - Socket s; - BufferedReader in; - PrintWriter out; - String name = null; - ChatServer server = null ; + Socket s; + BufferedReader in; + PrintWriter out; + String name = null; + ChatServer server = null; - //コンストラクタ - public ClientProc(Socket s) throws IOException { - this.s = s; - in = new BufferedReader(new InputStreamReader(s.getInputStream())); - out = new PrintWriter(s.getOutputStream()); - } - - // スレッドの本体 - // 各クライアントとの接続処理を行います - public void run(){ - try { - while (name == null){ - out.print("Input your name? : "); - out.flush(); - name = in.readLine(); - } - ChatServer.sendAll(name + " joined."); - String line = in.readLine(); - while (!"quit".equals(line)){ - if (line != null) ChatServer.sendAll(name + "> " +line); - line = in.readLine(); - } - ChatServer.sendAll(name + " disconnected."); - ChatServer.deleteConnection(s); - s.close(); - }catch (IOException e){ - try { - s.close(); - }catch (IOException e2){} + // コンストラクタ + public ClientProc(Socket s) throws IOException { + this.s = s; + in = new BufferedReader(new InputStreamReader(s.getInputStream())); + out = new PrintWriter(s.getOutputStream()); } - } + + // スレッドの本体 + // 各クライアントとの接続処理を行います + public void run() { + try { + while (name == null) { + out.println("Input your name? "); + out.flush(); + name = in.readLine(); + } + ChatServer.sendAll(name + " joined."); + String line = in.readLine(); + while (!"quit".equals(line)) { + if (line != null) + ChatServer.sendAll(name + "> " + line); + line = in.readLine(); + } + ChatServer.sendAll(name + " disconnected."); + ChatServer.deleteConnection(s); + s.close(); + } catch (IOException e) { + try { + s.close(); + } catch (IOException e2) { + } + } + } } diff --git a/src/j5/MCChat.java b/src/j5/MCChat.java deleted file mode 100644 index 15f5c1c..0000000 --- a/src/j5/MCChat.java +++ /dev/null @@ -1,147 +0,0 @@ -package j5; -// MCChat.java -// マルチキャストを使ってチャット機能を提供 -// 使い方 > java j5.MCChat - -import java.net.*; -import java.io.*; -import java.util.Arrays; -//============================================================================== -public class MCChat { - // 受信スレッドを作成・実行し,送信を担当 - - final byte TTL = 1; //同一セグメント内部のみ到達可能とする - final String MULTICASTADDRESS = ("224.0.0.1") ; - // マルチキャストアドレス224.0.0.1はルータを超えない場合のアドレス - int port = 7000; - // マルチキャストチャット用のポート番号,指定がなければ7000 番とします - byte[] buff = new byte[1024]; //送信用バッファ - String myname ="" ; // 利用者名 - int nameLength = 0; //利用者名の長さ - MulticastSocket soc = null; // マルチキャストソケット - InetAddress chatgroup = null; //チャット用アドレス - - // コンストラクタ利用者名などを設定します - public MCChat(int portno){ - port = portno ; //ポート番号の設定 - BufferedReader lineread = new BufferedReader(new InputStreamReader(System.in)) ; - System.out.print("Input your name: ") ; - try{ - myname = lineread.readLine() ; - } catch(Exception e){ - e.printStackTrace() ; - System.exit(1) ; - } - System.out.println("Welcome " + myname + "!") ; - myname = myname + ">" ; - nameLength = (myname.getBytes()).length ; - for(int i = 0;i < nameLength;++i) - buff[i] = (myname.getBytes())[i] ; - } - - //----------------------------------------------------------------------------- - public void makeMulticastSocket() { - // MULTICASTADDRESSに対してマルチキャストソケットを作成. - try{ - chatgroup = InetAddress.getByName(MULTICASTADDRESS) ; - soc = new MulticastSocket(port) ; - soc.joinGroup(chatgroup) ; - } catch(Exception e){ - e.printStackTrace() ; - System.exit(1); - } - } // end of makeMulticastSocket - //----------------------------------------------------------------------------- - public void startListener() { - // スレッド用クラスListenPacketのオブジェクトを生成し,起動. - try{ - ListenPacket lisner = new ListenPacket(soc); - Thread lisner_thread = new Thread(lisner); - lisner_thread.start();//受信スレッドの開始 - } catch(Exception e){ - e.printStackTrace() ; - System.exit(1); - } - } // end of startListener - //----------------------------------------------------------------------------- - public void sendMsgs() { - // マルチキャストパケットの送信を担当. - try{ - // 送信ループ - while(true){ - int n = System.in.read(buff, nameLength, 1024 - nameLength ) ; -// if (n > 1){ //文字数が少ないときはコピー失敗するのでチェックしない -// byte[] mesonly = Arrays.copyOfRange(buff, nameLength, nameLength+n-1); -//debug for(byte b: mesonly){ -//debug System.out.println(b); -//debug } -// String messtr = new String(mesonly); // byte array to string -// if (messtr.equals("exit")) break; -// } - - if(n > 0){ - DatagramPacket dp = new DatagramPacket(buff, n + nameLength, chatgroup, port) ; - soc.send(dp) ; - } - else break ;// CTRL+Dは n==0 になるので、ループ終了 - // (Enterのみだと改行文字が含まれるため0に - // ならない) - } - } catch(Exception e){ - e.printStackTrace() ; - System.exit(1); - } - } // end of sendMsgs - //----------------------------------------------------------------------------- - public void quitGroup() { - // 接続を終了 - try{ - System.out.println("Connection Closed.") ; - soc.leaveGroup(chatgroup) ; - System.exit(0) ; - } - catch(Exception e){ - e.printStackTrace() ; - System.exit(1); - } - } - //----------------------------------------------------------------------------- - public static void main(String[] arg){ - MCChat c = null ; - int portno = 7000 ; - // コマンドライン引数があれば、使用ポート番号を設定する - if (arg.length >= 1) portno = Integer.parseInt(arg[0]) ; - - c = new MCChat(portno) ; - c.makeMulticastSocket() ; - c.startListener() ; - c.sendMsgs() ; - c.quitGroup() ; - } -} // end of class MCChat -//============================================================================== -// ListenPacketクラス -// マルチキャストパケットを受信します -class ListenPacket implements Runnable { - MulticastSocket s = null; - // コンストラクタ: マルチキャストスレッドを受け取ります - public ListenPacket(MulticastSocket soc){ - s = soc; - } - // 処理の本体 - public void run(){ - byte[] buff = new byte[1024] ; - try{ - while(true){ - DatagramPacket recv = new DatagramPacket(buff,buff.length) ; - s.receive(recv) ; - if(recv.getLength() > 0){ - System.out.write(buff,0,recv.getLength()) ; - } - } - } catch(Exception e){ - e.printStackTrace() ; - System.exit(1) ; - } - } -} // end of class ListenPacket diff --git a/src/j5/MultiCastChat.java b/src/j5/MultiCastChat.java new file mode 100644 index 0000000..e3ea8e0 --- /dev/null +++ b/src/j5/MultiCastChat.java @@ -0,0 +1,152 @@ +package j5; +// MCChat.java +// マルチキャストを使ってチャット機能を提供 +// 使い方 > java j5.MCChat + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.DatagramPacket; +import java.net.InetSocketAddress; +import java.net.MulticastSocket; +import java.net.NetworkInterface; +//============================================================================== +public class MultiCastChat { + // 受信スレッドを作成・実行し,送信を担当 + + final byte TTL = 1; //同一セグメント内部のみ到達可能とする + final String MULTICASTADDRESS = ("224.0.0.1") ; + // マルチキャストアドレス224.0.0.1はルータを超えない場合のアドレス + int port = 7000; + // マルチキャストチャット用のポート番号,指定がなければ7000 番とします + byte[] buff = new byte[1024]; //送信用バッファ + String myname ="" ; // 利用者名 + int nameLength = 0; //利用者名の長さ + MulticastSocket soc = null; // マルチキャストソケット + // InetAddress chatgroup = null; //チャット用アドレス + InetSocketAddress chatgroup; + + // コンストラクタ利用者名などを設定します + public MultiCastChat(int portno){ + port = portno ; //ポート番号の設定 + BufferedReader lineread = new BufferedReader(new InputStreamReader(System.in)) ; + System.out.println("Input your name below!! (下に識別用の名前を入力)") ; + try{ + myname = lineread.readLine() ; + } catch(Exception e){ + e.printStackTrace() ; + System.exit(1) ; + } + System.out.println("Welcome " + myname + "!") ; + myname = myname + ">" ; + nameLength = (myname.getBytes()).length ; + for(int i = 0;i < nameLength;++i) + buff[i] = (myname.getBytes())[i] ; + } + + //----------------------------------------------------------------------------- + public void makeMulticastSocket() { + // MULTICASTADDRESSに対してマルチキャストソケットを作成. + try{ + chatgroup = new InetSocketAddress(MULTICASTADDRESS, port); + soc = new MulticastSocket(port) ; + // soc.joinGroup(chatgroup) ; + soc.joinGroup(chatgroup, NetworkInterface.getByIndex(0)); + } catch(Exception e){ + e.printStackTrace() ; + System.exit(1); + } + } // end of makeMulticastSocket + //----------------------------------------------------------------------------- + public void startListener() { + // スレッド用クラスListenPacketのオブジェクトを生成し,起動. + try{ + ListenPacket lisner = new ListenPacket(soc); + Thread lisner_thread = new Thread(lisner); + lisner_thread.start();//受信スレッドの開始 + } catch(Exception e){ + e.printStackTrace() ; + System.exit(1); + } + } // end of startListener + //----------------------------------------------------------------------------- + public void sendMsgs() { + // マルチキャストパケットの送信を担当. + try{ + // 送信ループ + while(true){ + int n = System.in.read(buff, nameLength, 1024 - nameLength ) ; +// if (n > 1){ //文字数が少ないときはコピー失敗するのでチェックしない +// byte[] mesonly = Arrays.copyOfRange(buff, nameLength, nameLength+n-1); +//debug for(byte b: mesonly){ +//debug System.out.println(b); +//debug } +// String messtr = new String(mesonly); // byte array to string +// if (messtr.equals("exit")) break; +// } + + if(n > 0){ + DatagramPacket dp = new DatagramPacket(buff, n + nameLength, chatgroup) ; + soc.send(dp) ; + } + else break ;// CTRL+Dは n==0 になるので、ループ終了 + // (Enterのみだと改行文字が含まれるため0に + // ならない) + } + } catch(Exception e){ + e.printStackTrace() ; + System.exit(1); + } + } // end of sendMsgs + //----------------------------------------------------------------------------- + public void quitGroup() { + // 接続を終了 + try{ + System.out.println("Connection Closed.") ; + soc.leaveGroup(chatgroup, NetworkInterface.getByIndex(0)); + System.exit(0) ; + } + catch(Exception e){ + e.printStackTrace() ; + System.exit(1); + } + } + //----------------------------------------------------------------------------- + public static void main(String[] arg){ + MultiCastChat c = null ; + int portno = 7000 ; + // コマンドライン引数があれば、使用ポート番号を設定する + if (arg.length >= 1) portno = Integer.parseInt(arg[0]) ; + + c = new MultiCastChat(portno) ; + c.makeMulticastSocket() ; + c.startListener() ; + c.sendMsgs() ; + c.quitGroup() ; + } +} // end of class MCChat +//============================================================================== +// ListenPacketクラス +// マルチキャストパケットを受信します +class ListenPacket implements Runnable { + MulticastSocket s = null; + // コンストラクタ: マルチキャストスレッドを受け取ります + public ListenPacket(MulticastSocket soc){ + s = soc; + } + // 処理の本体 + public void run(){ + byte[] buff = new byte[1024] ; + try{ + while(true){ + DatagramPacket recv = new DatagramPacket(buff,buff.length) ; + s.receive(recv) ; + if(recv.getLength() > 0){ + System.out.write(buff,0,recv.getLength()) ; + } + } + } catch(Exception e){ + e.printStackTrace() ; + System.exit(1) ; + } + } +} // end of class ListenPacket diff --git a/src/j5/T1.java b/src/j5/T1.java index cbe8f8d..1f6a63d 100644 --- a/src/j5/T1.java +++ b/src/j5/T1.java @@ -1,106 +1,107 @@ -package j5; - -import java.io.BufferedInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - -// telnetの原形となるプログラムT1.java -// このプログラムは,指定されたアドレスのポートに標準入出力を接続します -// 使い方java T1 サーバアドレスポート番号 -// 起動の例java T1 kiku.fuis.fukui-u.ac.jp 80 -// 終了にはコントロールC を入力してください - -// ライブラリの利用 -import java.net.Socket; -import java.net.UnknownHostException; - -// T1クラス -// T1クラスは,ネットワーク接続の管理を行います -// StreamConnectorクラスを用いてスレッド処理を行います -public class T1 { - // ソケットの準備 - protected Socket serverSocket;//接続用ソケット - public OutputStream serverOutput;//ネットワーク出力用ストリーム - public BufferedInputStream serverInput;// 同入力用ストリーム - - // openConnectionメソッド - //アドレスとポート番号からソケットを作りストリームを作成します - public void openConnection(String host,int port) - throws IOException,UnknownHostException - { - serverSocket = new Socket(host, port); - serverOutput = serverSocket.getOutputStream(); - serverInput - = new BufferedInputStream(serverSocket.getInputStream()); - } - - // main_procメソッド - // ネットワークとのやりとりをするスレッドをスタートさせます - public void main_proc() - throws IOException - { - try { - // スレッド用クラスStreamConnectorのオブジェクトを生成します - StreamConnector stdin_to_socket = - new StreamConnector(System.in, serverOutput); - StreamConnector socket_to_stdout = - new StreamConnector(serverInput, System.out); - // スレッドを生成します - Thread input_thread = new Thread(stdin_to_socket); - Thread output_thread = new Thread(socket_to_stdout); - // スレッドを起動します - input_thread.start(); - output_thread.start(); - } - catch(Exception e){ - System.err.print(e); - System.exit(1); - } - } - - // mainメソッド - // TCP コネクションを開いて処理を開始します - public static void main(String[] arg){ - try { - T1 t = null; - t = new T1(); - t.openConnection(arg[0], Integer.parseInt(arg[1])); - t.main_proc(); - }catch(Exception e){ - e.printStackTrace(); - System.exit(1); - } - } -} - -// StreamConnectorクラス -// ストリームを受け取り,両者を結合してデータを受け渡します -// StreamConnectorクラスはスレッドを構成するためのクラスです - -class StreamConnector implements Runnable { - InputStream src = null; - OutputStream dist = null; - // コンストラクタ入出力ストリームを受け取ります - public StreamConnector(InputStream in, OutputStream out){ - src = in; - dist = out; - } - // 処理の本体 - // ストリームの読み書きを無限に繰り返します - public void run(){ - byte[] buff = new byte[1024]; - while (true) { - try { - int n = src.read(buff); - if (n > 0) - dist.write(buff, 0, n); - } - catch(Exception e){ - e.printStackTrace(); - System.err.print(e); - System.exit(1); - } - } - } -} +package j5; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +// telnetの原形となるプログラムT1.java +// このプログラムは,指定されたアドレスのポートに標準入出力を接続します +// 使い方 java j5.T1 サーバアドレス ポート番号 +// 起動の例 java j5.T1 localhost 6000 +// 接続後、サーバから接続を切るには quit を送信してください +// 終了にはコントロールC を入力してください + +// ライブラリの利用 +import java.net.Socket; +import java.net.UnknownHostException; + +// T1クラス +// T1クラスは,ネットワーク接続の管理を行います +// StreamConnectorクラスを用いてスレッド処理を行います +public class T1 { + // ソケットの準備 + protected Socket serverSocket;// 接続用ソケット + public OutputStream serverOutput;// ネットワーク出力用ストリーム + public BufferedInputStream serverInput;// 同入力用ストリーム + + // openConnectionメソッド + // アドレスとポート番号からソケットを作りストリームを作成します + public void openConnection(String host, int port) + throws IOException, UnknownHostException { + serverSocket = new Socket(host, port); + serverOutput = serverSocket.getOutputStream(); + serverInput = new BufferedInputStream(serverSocket.getInputStream()); + } + + // main_procメソッド + // ネットワークとのやりとりをするスレッドをスタートさせます + public void main_proc() + throws IOException { + try { + // スレッド用クラスStreamConnectorのオブジェクトを生成します + StreamConnector stdin_to_socket = new StreamConnector(System.in, serverOutput); + StreamConnector socket_to_stdout = new StreamConnector(serverInput, System.out); + // スレッドを生成します + Thread input_thread = new Thread(stdin_to_socket); + Thread output_thread = new Thread(socket_to_stdout); + // スレッドを起動します + input_thread.start(); + output_thread.start(); + } catch (Exception e) { + System.err.print(e); + System.exit(1); + } + } + + // mainメソッド + // TCP コネクションを開いて処理を開始します + public static void main(String[] args) { + try { + T1 t = null; + t = new T1(); + + // 引数の指定がなかった場合はlocalhost + if (args.length == 0) args = new String[] { "localhost" ,"6000"}; + + t.openConnection(args[0], Integer.parseInt(args[1])); + t.main_proc(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + } +} + +// StreamConnectorクラス +// ストリームを受け取り,両者を結合してデータを受け渡します +// StreamConnectorクラスはスレッドを構成するためのクラスです + +class StreamConnector implements Runnable { + InputStream src = null; + OutputStream dist = null; + + // コンストラクタ入出力ストリームを受け取ります + public StreamConnector(InputStream in, OutputStream out) { + src = in; + dist = out; + } + + // 処理の本体 + // ストリームの読み書きを無限に繰り返します + public void run() { + byte[] buff = new byte[1024]; + while (true) { + try { + int n = src.read(buff); + if (n > 0) + dist.write(buff, 0, n); + } catch (Exception e) { + e.printStackTrace(); + System.err.print(e); + System.exit(1); + } + } + } +} + diff --git a/src/j7/Test.java b/src/j7/Test.java new file mode 100644 index 0000000..0635d24 --- /dev/null +++ b/src/j7/Test.java @@ -0,0 +1,22 @@ +package j7; + +import java.awt.event.WindowEvent; +import java.awt.event.WindowAdapter; + +import javax.swing.JButton; +import javax.swing.JFrame; + +public class Test extends JFrame { + public static void main(String[] args) { + Test t = new Test(); + t.getContentPane().add(new JButton("hoge")); + t.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + System.exit(0); + } + }); + t.pack(); + t.setVisible(true); + } +} diff --git a/src/output.txt b/src/output.txt deleted file mode 100644 index 65d0a8b..0000000 --- a/src/output.txt +++ /dev/null @@ -1,2 +0,0 @@ -sdfsdfasdf -sdfsdfasdfasdfsdf diff --git a/src/run1-1.sh b/src/run1-1.sh index 97e9087..97b0dc0 100755 --- a/src/run1-1.sh +++ b/src/run1-1.sh @@ -24,6 +24,8 @@ # 一旦シェルスクリプトの実行をストップ。 echo "type Return(Enter) to run next command / CTRL+C to quit" +echo " エンターキーを押すと続きを実行します" +echo " コントロールキーを押しながらcキーを押すとスクリプトの実行を途中で終了します" read input_str # javac によるコンパイル @@ -42,11 +44,13 @@ sleep 5 echo '本実験では、コマンド入力の省力化のため、本来であれば1つずつ実行して理解すべき一連のコマンドを「シェルスクリプト」として提供しています。' sleep 5 -echo 'もし余裕があれば、自分でコマンドを1つずつ打ち込んでみることをおすすめします。Tabキー(x2)による補完と、↑↓キーによる履歴呼出しを活用しましょう。' +echo 'もし余裕があれば、自分でコマンドを1つずつ打ち込んでみることをおすすめします。' +sleep 5 +echo 'ターミナルで実行するときは、Tabキー(1回or2回連打)による補完と、↑↓キーによる履歴呼出しを活用しましょう。' sleep 5 echo '「なにが行われていたか」を理解するには、シェルスクリプトだけではなく、Javaソースコードを読む必要があります。' sleep 5 echo 'サーバの導通と応答速度を確認 ping -c 回数 IPaddr' -echo '>' ping -c 10 10.104.89.66 -ping -c 10 10.104.89.66 \ No newline at end of file +echo '>' ping -c 10 10.84.240.240 +ping -c 10 10.84.240.240 diff --git a/src/run2-1.sh b/src/run2-1.sh index 840021b..2137662 100755 --- a/src/run2-1.sh +++ b/src/run2-1.sh @@ -12,20 +12,41 @@ ip a | grep inet sleep 2 -echo "このあと、TimeServerが起動したら、別ターミナルで cd ~/NWP/src をしたあと、下のコマンドを入力してください。" +echo "TimeServer/TimeClientはコンソールで cd ~/NWP/src をしたあと、以下のようにして起動することができます。" +sleep 2 echo "" -echo ">>>> $ java j2.TimeClient 127.0.0.1 5555" +echo ">> $ java j2.TimeServer 0.0.0.0 9999 (コマンドライン引数を指定した例)" +echo "" +echo ">> $ java j2.TimeServer (コマンドライン引数なしの場合、デフォルト値 127.0.0.1 9999 が設定されたことになります)" +echo "" +sleep 2 +echo "TimeServerを終了するには CTRL+C をおしてください" echo "" sleep 3 -echo "それでは TimeServer を起動します。コマンドライン引数で、バインドアドレスとポート番号を指定することができます。" +echo "支援システムからTimeServerを起動するときは、ファイル一覧のj2/TimeServer.java を開き、Execボタンを押します。" sleep 2 -echo "TimeServerを終了するには CTRL+C をおしてください" +echo "Execボタン右のテキストフィールドで、コマンドライン引数を指定して実行することができます。" +sleep 1 +echo "例えば「0.0.0.0 9999」とすると、バインドアドレスとポート番号を設定できます。" +sleep 2 +echo "「バインドアドレス」に 127.0.0.1 を指定すると、自分のPCしか接続できません。" +sleep 2 +echo "「バインドアドレス」に 0.0.0.0 を指定すると、他のすべてのPCから接続できるようになります。" +sleep 2 +echo "「ポート番号」は1024〜65535までの範囲で、適宜変更することができます。" sleep 2 -echo '>' java j2.TimeServer 127.0.0.1 5555 -java j2.TimeServer 127.0.0.1 5555 +echo "" +echo "支援システムからTimeClientを起動するときも同様に、ファイル一覧のj2/TimeClient.java を開き、Execボタンを押します。" +sleep 2 +echo "コマンドライン引数で、接続するサーバのアドレス(サーバのPCで ip a を実行して調べたアドレス)と、ポート番号を指定することができます。" +sleep 2 +echo "コマンドライン引数を指定しないときの「デフォルト値」は、Javaのプログラムに記載されています。" +sleep 3 +echo "" +echo "(このシェルスクリプトはサーバやクライアントを実行せず、終了します)" - - +# echo '>' java j2.TimeServer 127.0.0.1 5555 +# java j2.TimeServer 127.0.0.1 5555 diff --git a/src/run2-2.sh b/src/run2-2.sh index 4851217..1cba4e9 100755 --- a/src/run2-2.sh +++ b/src/run2-2.sh @@ -12,25 +12,38 @@ ip a | grep inet sleep 2 -echo "このあと、EchoServerを起動します。" -sleep 2 -echo "別ターミナルで cd ~/NWP/src をしたあと、EchoClientを起動してください。" -sleep 2 -echo "EchoClientは、quit と入力すると、接続終了します。" -sleep 2 -echo "Now, open other terminal, and run EchoClient" +echo "EchoServer/EchoClientはコンソールで cd ~/NWP/src をしたあと、以下のようにして起動することができます。" sleep 2 echo "" -echo ">>>> $ java j2.EchoClient localhost 9999"; +echo ">>>> $ java j2.EchoServer 0.0.0.0 9999 (コマンドライン引数を指定した例)" echo "" - +echo ">>>> $ java j2.EchoServer (コマンドライン引数なしの場合、デフォルト値 127.0.0.1 9999 が設定されたことになります)" +echo "" sleep 2 - -echo "それでは、EchoServer を起動します。" +echo "EchoServerを終了するには CTRL+C をおしてください" + +sleep 3 + +echo "支援システムからEchoServerを起動するときは、ファイル一覧のj2/EchoServer.java を開き、Execボタンを押します。" sleep 2 +echo "Execボタン右のテキストフィールドで、コマンドライン引数を指定して実行することができます。例えば「0.0.0.0 9999」とすると、バインドアドレスとポート番号を設定できます。" +sleep 2 +echo "「バインドアドレス」に 127.0.0.1 を指定すると、自分のPCしか接続できません。" +sleep 2 +echo "「バインドアドレス」に 0.0.0.0 を指定すると、他のすべてのPCから接続できるようになります。" +sleep 2 +echo "「ポート番号」は1024〜65535までの範囲で、適宜変更することができます。" +sleep 2 + +echo "支援システムからEchoClientを起動するときも同様に、ファイル一覧のj2/EchoClient.java を開き、Execボタンを押します。" +sleep 2 +echo "EchoClient を終了するときは「quit」と入力してください。" +sleep 2 +echo "コマンドライン引数で、接続するサーバのアドレス(サーバのPCで ip a を実行して調べたアドレス)と、ポート番号を指定することができます。" +sleep 2 +echo "コマンドライン引数を指定しないときの「デフォルト値」は、Javaのプログラムに記載されています。" +sleep 3 +echo "(このシェルスクリプトはサーバやクライアントを実行せず、終了します)" -echo '>' java j2.EchoServer 127.0.0.1 9999 -java j2.EchoServer 127.0.0.1 9999 - - - +# echo '>' java j2.EchoServer 127.0.0.1 9999 +# java j2.EchoServer 127.0.0.1 9999 diff --git a/src/run2-3.sh b/src/run2-3.sh index bc90164..9f297fe 100755 --- a/src/run2-3.sh +++ b/src/run2-3.sh @@ -12,20 +12,16 @@ ip a | grep inet sleep 2 -echo "これから、ThreadTimeServerを起動します。" +echo "ThreadTimeServer は、ターミナルで以下のように起動するか、支援システムからファイルを開いて起動することができます。" sleep 2 -echo "起動したら、(2-1)(2-2)と同じように、TimeClientを起動して接続してください。" -sleep 2 -echo "Now, open other terminal, and run TimeClient by typing" +echo "コマンドライン引数の扱いや、デフォルト値は、TimeServerと同じです。" sleep 2 echo "" -echo ">>>> $ java j2.TimeClient localhost (portnum)"; +echo ">>>> $ java j2.ThreadTimeServer localhost 9999"; echo ""; echo "" -sleep 2 -echo "それでは、ThreadTimeServer を起動します。" +# sleep 2 +# echo "それでは、ThreadTimeServer を起動します。" -echo '>' java j2.ThreadTimeServer localhost 5555 -java j2.ThreadTimeServer localhost 5555 - - +# echo '>' java j2.ThreadTimeServer localhost 5555 +# java j2.ThreadTimeServer localhost 5555 diff --git a/src/run2-4.sh b/src/run2-4.sh index a9be100..8213c8f 100755 --- a/src/run2-4.sh +++ b/src/run2-4.sh @@ -12,19 +12,15 @@ ip a | grep inet sleep 2 -echo "このあと、ThreadEchoServerを起動します。" +echo "ThreadEchoServer (スレッドエコーサーバ)は、ターミナルで以下のように起動するか、支援システムからファイルを開いて起動することができます。" sleep 2 -echo "起動したら、別ターミナルでEchoClientを起動し接続してください。" +echo "コマンドライン引数の扱いや、デフォルト値は、EchoServerと同じです。" sleep 2 -echo ">>>> $ java j2.EchoClient (host) (port)"; +echo "" +echo ">>>> $ java j2.ThreadEchoServer localhost 9999"; echo ""; -sleep 2 -echo "それでは、ThreadEchoServerを、起動します。" -sleep 2 +echo "" -echo '>' java j2.ThreadEchoServer localhost 9999 -java j2.ThreadEchoServer localhost 9999 -#echo "type return to exit" -#read input_str - +# echo '>' java j2.ThreadEchoServer localhost 9999 +# java j2.ThreadEchoServer localhost 9999 diff --git a/src/run3-1.sh b/src/run3-1.sh index d2cc0b5..d532ddf 100755 --- a/src/run3-1.sh +++ b/src/run3-1.sh @@ -10,16 +10,29 @@ ip a | grep inet sleep 2 -echo "Now, open other terminal, and run Telnet(Java program)" -echo ">>>> $ java j3.Telnet localhost 8000"; -echo ""; -echo "start Thttpd" -echo "クライアントに返すコンテンツとして、とりあえず、適当なHTMLファイルをつかいます" +echo "Webサーバの例として、Thttpdを起動するには、" sleep 1 -echo "Thttpdを起動します。(Port = 8000)" -echo '>' java j3.Thttpd j3/index.html 8000 -java j3.Thttpd j3/index.html 8000 +echo "ターミナルに以下のようにコマンド入力するか、または" +sleep 1 +echo "支援システムでj3/Thttpd.java を開き、Execボタンを押してください。" +sleep 2 +echo '>>>' java j3.Thttpd j3/index.html 8000 +sleep 2 +echo "" +echo "コマンドライン引数の1番目には、クライアントに返すコンテンツを相対パスで指定します。" +sleep 1 +echo "コマンドライン引数の2番目には、ポート番号を指定します。" +sleep 3 +echo "" +echo "起動後、サーバのコンソールに表示されたURL (例:http://127.0.0.1:8000/ )を、ブラウザで開いてください。" +sleep 1 +echo "ブラウザでURLを開いたとき、ブラウザ画面やサーバのコンソールになにが表示されるか注意して見てください。" +sleep 1 +echo "また、その表示がJavaプログラムのどこで行われているか探してみましょう。" +sleep 1 +# echo "Thttpdを起動します。(Port = 8000)" +# java j3.Thttpd j3/index.html 8000 #echo "type return to exit" #read input_str diff --git a/src/run5-2.sh b/src/run5-2.sh index 667ad84..c0c456c 100755 --- a/src/run5-2.sh +++ b/src/run5-2.sh @@ -1,22 +1,22 @@ #!/bin/bash -echo '> javac -encoding UTF-8 j5/MCChat*.java' -javac -encoding UTF-8 j5/MCChat*.java +echo '> javac -encoding UTF-8 j5/MultiCastChat*.java' +javac -encoding UTF-8 j5/MultiCastChat*.java echo done. sleep 1 -echo "いまからMC(MultiCast)Chat を、起動します。通信に使用するポート番号を7000+(1〜6:班番号)で、入力してください" -echo -n "Input portnum = " +echo "いまからMultiCastChat を、起動します。通信に使用するポート番号を7000+(1〜6:班番号)で、入力してください" +echo "(以下に、7001〜7006の数字を入力して、Enterを押す)" read portnum -echo "別ホスト、または同一ホストの別ターミナルで、MCChatを起動してください。その際、同じ通信ポート番号を指定してください。" +echo "別ホスト、または同一ホストの別ターミナルで、MultiCastChatを起動してください。その際、同じ通信ポート番号を指定してください。" sleep 1 -echo "(run5-2.sh をもちいるか、java j5.MCChat ${portnum} で、起動してください)" +echo "(run5-2copy.sh をもちいるか、java j5.MultiCastChat ${portnum} で、起動してください)" sleep 1 -echo "それでは、MCChat を、通信ポート番号${portnum}で、起動します。" +echo "(または、j5/MultiCastChat.java の19行目のportで直接指定し、再コンパイル後に実行してください)" +sleep 1 +echo "それでは、 MultiCastChat を、通信ポート番号${portnum}で、起動します。" echo "終了する場合は、CTRL+D がつかえます。(quitはつかえません)" -echo '>' java j5.MCChat ${portnum} -java j5.MCChat ${portnum} - - +echo '>' java j5.MultiCastChat ${portnum} +java j5.MultiCastChat ${portnum} diff --git a/src/run5-2copy.sh b/src/run5-2copy.sh new file mode 100755 index 0000000..c0c456c --- /dev/null +++ b/src/run5-2copy.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +echo '> javac -encoding UTF-8 j5/MultiCastChat*.java' +javac -encoding UTF-8 j5/MultiCastChat*.java +echo done. +sleep 1 + +echo "いまからMultiCastChat を、起動します。通信に使用するポート番号を7000+(1〜6:班番号)で、入力してください" +echo "(以下に、7001〜7006の数字を入力して、Enterを押す)" +read portnum + +echo "別ホスト、または同一ホストの別ターミナルで、MultiCastChatを起動してください。その際、同じ通信ポート番号を指定してください。" +sleep 1 +echo "(run5-2copy.sh をもちいるか、java j5.MultiCastChat ${portnum} で、起動してください)" +sleep 1 +echo "(または、j5/MultiCastChat.java の19行目のportで直接指定し、再コンパイル後に実行してください)" +sleep 1 +echo "それでは、 MultiCastChat を、通信ポート番号${portnum}で、起動します。" +echo "終了する場合は、CTRL+D がつかえます。(quitはつかえません)" +echo '>' java j5.MultiCastChat ${portnum} +java j5.MultiCastChat ${portnum} + diff --git a/src/zizen/Frac.java b/src/zizen/Frac.java new file mode 100644 index 0000000..8337df7 --- /dev/null +++ b/src/zizen/Frac.java @@ -0,0 +1,95 @@ +package zizen; +public class Frac { + + // 確認用 + + public static void main(String[] args) { + Frac d1_3 = new Frac(2,3); + Frac d1_2 = new Frac(1,2); + Frac plus = d1_3.tasu(d1_2); + d1_3.print(); System.out.print("+ "); d1_2.print(); System.out.print("= "); + plus.println(); + + Frac minus = d1_2.hiku(d1_3); + d1_3.print("-"); d1_2.print("="); minus.println(); + + Frac d7_63 = new Frac(7,63); + d7_63.print("="); + d7_63.yakubun(); + d7_63.println(); + + Frac d2_1 = new Frac(2,1); + Frac mul = d1_2.kakeru(d2_1); + d1_2.print("*"); d2_1.print("="); + mul.print("="); + mul.yakubun().println(); + + Frac div = d1_2.waru(d2_1); + d1_2.print("/"); d2_1.print("="); + div.println(); + + Frac d = new Frac(4209,18453); + Frac e = new Frac(83, 324); + d.tasu(e).yakubun().println(); //メソッドチェーン + d.waru(e).yakubun().println(); //メソッドチェーン +} + +//メンバー変数 + int a; //bunsi + int b; //bumbo + + // コンストラクタ + public Frac() { + a = 2; b = 3; + } + public Frac(int ia, int ib) { + a = ia; b = ib; + } + + //メソッド + public void setBunsiBumbo(int fa, int fb){ + a = fa; b = fb; + } + public void print(){ + System.out.print(a+"/"+b+" "); + } + public void print(String append){ + System.out.print(a+"/"+b+" "+append+" "); + } + public void println(){ + System.out.println(a+"/"+b); + } + public Frac tasu(Frac f){ + int na = a * f.b + b * f.a; + int nb = b * f.b; + return new Frac(na,nb); + } + public Frac hiku(Frac f){ + int na = a * f.b - b * f.a; + int nb = b * f.b; + return new Frac(na,nb); + } + public Frac kakeru(Frac f){ + int na = a * f.a; + int nb = b * f.b; + return new Frac(na,nb); + } + public Frac waru(Frac f){ + int na = a * f.b; + int nb = b * f.a; + return new Frac(na,nb); + } + public Frac yakubun(){ //約分:破壊的メソッド + int g = gcd(a,b); + a = a/g ; b = b/g; + return new Frac(a,b); //一応新しいオブジェクトもつくって返す(メソッドチェーンするため) + } + private int gcd(int m, int n){ + while (m != n) { + if (m < n) { n -= m; } + else { m -= n; } + } + return n; + } +} + diff --git a/src/zizen/Main.java b/src/zizen/Main.java new file mode 100644 index 0000000..3a91693 --- /dev/null +++ b/src/zizen/Main.java @@ -0,0 +1,30 @@ +package zizen; +import java.io.BufferedReader; +import java.io.InputStreamReader; + +public class Main { + public static void main(String args[]){ + int x, y=0 ; + InputStreamReader isr = new InputStreamReader(System.in) ; //標準入力(=キーボード) + BufferedReader br = new BufferedReader(isr) ; + System.out.print("input integer: ") ; + String buf ; + try{ + buf = br.readLine() ; // キーボード入力を文字列として読み取る + x = Integer.parseInt(buf) ; // 文字列を整数に変換 + } catch(Exception e){ // 読み込んだ文字列が整数に変換できない場合 + x = 0; + } + System.out.println("Input Number = " + x) ; + + /*?? 変数yに値を設定する */ + + /*?? 和、差、積、商(小数部分は切り捨て)、剰余(演算子は%をつかいます)を表示する + * 答えがわかるように表示されれば、改行の有無や表記などは、気にしなくてよい */ + System.out.println("和は "+(x+y)+" です"); + + System.out.println("submitted by 17A5000") ; + // 出力する文字列を各自の学生番号に置き換えること + + } // end main +} diff --git a/src/zizen/PPAP.java b/src/zizen/PPAP.java new file mode 100644 index 0000000..e3e141f --- /dev/null +++ b/src/zizen/PPAP.java @@ -0,0 +1,53 @@ +package zizen; +import java.util.ArrayList; + +public class PPAP { + + public static void main(String[] args) { + ArrayList alist = new ArrayList(); //可変長配列 + Pen pen = new Pen(); + Apple apple = null; + alist.add(pen); + alist.add(new Pineapple()); + alist.add(apple = new Apple()); + alist.add(pen); + + for(BaseObj bo: alist) { + System.out.print(bo.getName()+"\t"); + } + System.out.println(""); + for(BaseObj bo: alist) { + System.out.print(bo.hashCode()+" "); // インスタンス/オブジェクト固有のID + } + System.out.println(""); + System.out.println(""); + + // 通常の配列Version + BaseObj[] ary = new BaseObj[4]; + ary[0] = pen; + ary[1] = new Pineapple(); + ary[2] = apple; + ary[3] = pen; + for(BaseObj bo: ary) { + System.out.print(bo.getName()+"\t"); + } + System.out.println(""); + for(BaseObj bo: ary) { + System.out.print(bo.hashCode()+" "); // インスタンス/オブジェクト固有のID + } + System.out.println(""); + System.out.println(""); + + System.out.println("生成したオブジェクトの総数は?です"); // ?の部分を、数字におきかえてください + } +} + +class BaseObj { + // インスタンス/オブジェクトが作られたときの「型」=「クラス名」を返す + public String getName() { + return getClass().getName(); + } +} +class Pen extends BaseObj { } +class Pineapple extends BaseObj { } +class Apple extends BaseObj { } \ No newline at end of file