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);
}
}
}