Newer
Older
ServerTester / src / main / java / info / istlab / ServerTester / ThreadEchoServer.java
package info.istlab.ServerTester;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class ThreadEchoServer implements Runnable {
	Socket sock;
	Thread thread;

	ThreadEchoServer(Socket sc) {
		sock = sc;
		thread = new Thread(this);
		thread.start(); // 別のスレッドでrun()を動作させる。メインのスレッドはrun()の終了を待たずにmain()に戻る
	}

	@Override
	public void run() { 
		String line = null;
		BufferedReader br = null;
		PrintStream os = null;

		System.out.println("accept");
		try {
			br = new BufferedReader(new InputStreamReader(sock.getInputStream()));
			os = new PrintStream(sock.getOutputStream());
			// クライアントからのメッセージを待ち、受け取ったメッセージをそのまま返す
			while ((line = br.readLine()) != null) {
				System.out.println("(Server received) " + line);
				os.println(line);
			}
		} catch (IOException e) {
			// os.close();
			System.out.println(e);
		} finally {
			System.out.println("disconnected " + sock.toString());
		}
	}

	@SuppressWarnings("resource")
	public static void main(String args[]) {
		// ソケットの宣言
		ServerSocket echoServer = null;
		Socket clientSocket = null;

		if (args.length < 2) { // 引数の数が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 {
			echoServer = new ServerSocket();
			echoServer.bind(new InetSocketAddress(bindaddress, port));  // サーバソケットにバインドする=ポートでの待ち受け開始
		} catch (IOException e) {
			System.err.println(e);
			System.err.println("バインド失敗。ポート番号 "+port+" (Bind-address: "+bindaddress+" 向け) がすでにつかわれているようです");
			System.err.println("ポート番号またはバインドアドレスを変更してください。");
			System.out.println("またはコマンド killall java を実行して全てのJavaプロセスを終了してください。");
			System.exit(1);
		}
		System.out.println("ThreadEchoServer ["+bindaddress+":"+port+"] started.");

		while (true) {
			// クライアントからの要求を受けるソケットを開く
			try {
				clientSocket = echoServer.accept();
			} catch (IOException e) {
				e.printStackTrace();
			}
			new ThreadEchoServer(clientSocket); //クライアントからの要求をスレッドで捌く
		}
	}
}