Newer
Older
22a5021_NWP / src / j2 / ThreadTimeServer.java
@Motoki Miura Motoki Miura on 22 Sep 2020 3 KB first commit for NWP exp
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 ;// ソケットの読み書き用オブジェクト
	try{
	    // サーバソケットの作成
	    svsock = new ServerSocket() ;
	    // バインドするアドレスとポートを指定
	    svsock.bind(new InetSocketAddress("0.0.0.0"  , 5555)) ; //別のホストからの接続も受け付ける場合
	    //			svsock.bind(new InetSocketAddress("127.0.0.1", 5555)) ; //ローカルホストからのみ受け付ける場合
			
	    System.out.println("(TimeServer) 停止するには 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) ;
	}
    }
}