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..543efee 100644 --- a/src/j2/EchoServer.java +++ b/src/j2/EchoServer.java @@ -9,26 +9,27 @@ 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+" 向け) がすでにつかわれているようです"); @@ -36,11 +37,12 @@ System.exit(1); } 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..0883e7a 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; @@ -74,7 +73,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..7222afb 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]); 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..748b3f8 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,66 @@ // 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.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(); } } }