package j2; // 時刻を答えるサーバプログラムTimeServer.java // このプログラムはポート番号5555番で動作するサーバです // クライアントから接続がきたら、一方的に時刻を返します // このプログラムを停止させるにはコントロールCを入力してください // 使い方: java TimeServer // ライブラリの利用 import java.io.IOException; import java.io.PrintStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; // TimeServerクラス class ThreadTimeServer implements Runnable { Socket sock; Thread thread; ThreadTimeServer(Socket sc) { sock = sc; } public void startRunning() { thread = new Thread(this); thread.start(); } @Override public void run() { PrintStream os; String outstr; // 出力データを格納する文字列 Date d; // 日付時刻処理用オブジェクト System.out.println("(TimeServer) 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); // データの出力(1回目) os.println(outstr); Thread.sleep(3000); // 3秒まつ outstr = new Date().toString(); os.println(outstr); // データの出力(2回目) System.out.println("(Server-side message) " + outstr); Thread.sleep(3000); // 3秒まつ outstr = "Thank you."; os.println(outstr); System.out.println("(Server-side message) " + outstr); os.close(); // 接続終了 sock.close(); System.out.println("(TimeServer) クライアントからの接続を閉じました"); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String args[]) { ServerSocket svsock = null;// サーバ用ソケット Socket sock;// ソケットの読み書き用オブジェクト if (args.length < 2) { args = new String[2]; // バインドするアドレスとポートを指定 args[0] = "127.0.0.1"; // ポート9999番を開く args[1] = "5555"; } String bindaddress = args[0]; int port = Integer.parseInt(args[1]); try { // サーバソケットの作成 svsock = new ServerSocket(); svsock.bind(new InetSocketAddress(bindaddress, port)); System.out.println("(ThreadTimeServer) at ["+bindaddress+":"+port+"] "); System.out.println(" ThreadTimeServerを停止するには CTRL+C をおしてください"); // サーバ側の処理の繰り返し while (true) { sock = svsock.accept();// 接続がくるまで待つ ThreadTimeServer tts = new ThreadTimeServer(sock); tts.startRunning(); // ThreadTimeServerオブジェクトに残りの処理を任せる // これで、次の接続に対応できる } } catch (IOException e) { System.out.println("*** Exception ***"); System.out.println(e); System.exit(1); } } }