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/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/run1-1.sh b/src/run1-1.sh index 97e9087..828da57 100755 --- a/src/run1-1.sh +++ b/src/run1-1.sh @@ -42,11 +42,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.96 +ping -c 10 10.84.240.96 \ No newline at end of file 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} +