package j2; 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) { 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.exit(1); } System.out.println("ThreadEchoServer ["+bindaddress+":"+port+"] started."); while (true) { // クライアントからの要求を受けるソケットを開く try { clientSocket = echoServer.accept(); } catch (IOException e) { e.printStackTrace(); } new ThreadEchoServer(clientSocket); //クライアントからの要求をスレッドで捌く } } }