Newer
Older
my90NWP / src / j2 / ThreadTimeServer.java
package j2;
// 時刻を答えるサーバプログラムThreadTimeServer.java

// このプログラムはポート番号9999番で動作するサーバです
// クライアントから接続がきたら、一方的に時刻を返します
// このプログラムを停止させるにはコントロールCを入力してください
// 使い方: java ThreadTimeServer

// ライブラリの利用
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("(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 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("(サーバ→クライアント) " + outstr);
			Thread.sleep(3000); // 3秒まつ
			outstr = "Thank you.";
			os.println(outstr);
			System.out.println("(サーバ→クライアント) " + outstr);
			os.close();
			// 接続終了
			sock.close();
			System.out.println("(ThreadTimeServer) クライアントからの接続を閉じました");
		} 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] = "9999";
		}
		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);
		}
	}
}