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/.project b/.project
index 1868ab8..14fb1fb 100644
--- a/.project
+++ b/.project
@@ -16,12 +16,12 @@
- 1635165177317
+ 1669602465207
30
org.eclipse.core.resources.regexFilterMatcher
- node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
+ node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__
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..1821dd5 100644
--- a/src/j2/EchoClient.java
+++ b/src/j2/EchoClient.java
@@ -8,29 +8,36 @@
import java.net.UnknownHostException;
public class EchoClient {
+ // プログラムの本体main
public static void main(String[] args) {
+ if (args.length < 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..3ce2752 100644
--- a/src/j2/EchoServer.java
+++ b/src/j2/EchoServer.java
@@ -9,38 +9,42 @@
import java.net.Socket;
public class EchoServer {
- @SuppressWarnings("resource")
public static void main(String args[]) {
- // ソケットや入出力用のストリームの宣言
- ServerSocket echoServer = 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";
+ args[1] = "9999"; // ポート9999番を開く
}
- String bindaddress = args[0];
- int port = Integer.parseInt(args[1]);
+ new EchoServer(args[0], args[1]);
+ }
+
+ public EchoServer(String bindaddress, String strport) {
+ // ソケットや入出力用のストリームの宣言
+ ServerSocket echoServer = null;
+ Socket clientSocket = null;
+ String line;
+ BufferedReader br;
+ PrintStream os;
+
+ 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..c25fb70 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;
@@ -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..ec02ac5 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) {
@@ -72,7 +72,7 @@
// バインドするアドレスとポートを指定
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..7fad0e1 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) {
args = new String[2];
args[0] = "127.0.0.1";
- args[1] = "5555";
+ args[1] = "9999";
}
+ 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..540a662 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) {
+ args = new String[2];
+ // ローカルホストからの接続のみを受け付ける場合 "127.0.0.1"
+ // 別のホストからの接続も受け付ける場合 "0.0.0.0"
+ args[0] = "127.0.0.1";
+ 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/run1-1.sh b/src/run1-1.sh
index 97e9087..a4bc853 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,11 @@
sleep 5
echo '本実験では、コマンド入力の省力化のため、本来であれば1つずつ実行して理解すべき一連のコマンドを「シェルスクリプト」として提供しています。'
sleep 5
-echo 'もし余裕があれば、自分でコマンドを1つずつ打ち込んでみることをおすすめします。Tabキー(x2)による補完と、↑↓キーによる履歴呼出しを活用しましょう。'
+echo 'もし余裕があれば、自分でコマンドを1つずつ打ち込んでみることをおすすめします。ターミナルで実行するときは、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
diff --git a/test b/test
new file mode 100644
index 0000000..3cf5c18
--- /dev/null
+++ b/test
@@ -0,0 +1 @@
+hello!!!!!!!!!
\ No newline at end of file