EchoServer.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | package jp.ac.utsunomiya_u.is; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; public class EchoServer { public static void main(String[] args) { // Scannerクラスのインスタンス(標準入力System.inからの入力) try (Scanner scanner = new Scanner(System.in)) { System.out.print( "EchoServer (" + getMyIpAddress() + ") > Input server port > " ); // ポート番号入力 int port = scanner.nextInt(); // ServerSocketクラスのインスタンスをポート番号を指定して生成 try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println( "EchoServer (" + getMyIpAddress() + ") > Started and Listening for connections on port " + serverSocket.getLocalPort()); // EchoTaskクラスのインスタンスをServerSocketクラスのacceptメソッドで返されるSocketを元に生成 EchoTask echoTask = new EchoTask(serverSocket.accept()); // データ送受信 echoTask.call(); } catch (IOException ex) { Logger.getLogger(EchoServer. class .getName()).log(Level.SEVERE, null , ex); } } } /** * 自ホストのIPアドレス取得 * * @return 自ホストのIPアドレス */ private static String getMyIpAddress() { try { // 自ホストのIPアドレス取得 return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException ex) { Logger.getLogger(EchoServer. class .getName()).log(Level.SEVERE, null , ex); } return null ; } /** * EchoServerでStringの送受信を担うクラス */ private static class EchoTask { /** * Socketクラスのインスタンス */ private final Socket socket; /** * コンストラクタ * * @param socket Socketクラスのインスタンス */ EchoTask(Socket socket) { this .socket = socket; } public Void call() { System.out.println( "EchoServer (" + getMyIpAddress() + ") > Accepted connection from " + socket.getRemoteSocketAddress()); // クライアントからの読み込み用のBufferedReaderクラスのインスタンスをSocketのInputStreamから生成 try (BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); // クライアントへの書き込み用のPrintWriterクラスのインスタンスをSocketのOutputStreamから生成(自動フラッシュ) PrintWriter writer = new PrintWriter(socket.getOutputStream(), true )) { String inputLine; // クライアントからの入力待機し,それを受け取ったらStringに収納 while ((inputLine = reader.readLine()) != null ) { System.out.println( "EchoClient (" + socket.getRemoteSocketAddress() + ") > " + inputLine); // 受け取ったStringをそのままクライアントへ書き込み writer.println(inputLine); } } catch (IOException ex) { Logger.getLogger(EchoServer. class .getName()).log(Level.SEVERE, null , ex); } finally { System.out.println( "EchoServer (" + getMyIpAddress() + ") > Terminated connection from " + socket.getRemoteSocketAddress()); try { // ソケットのクローズ処理 socket.close(); } catch (IOException ex) { Logger.getLogger(EchoServer. class .getName()).log(Level.SEVERE, null , ex); } } return null ; } } } |
EchoClient.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package jp.ac.utsunomiya_u.is; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import java.util.logging.Level; import java.util.logging.Logger; public class EchoClient { public static void main(String[] args) { String myIpAddress = null ; try { // 自ホストのIPアドレス取得 myIpAddress = InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException ex) { Logger.getLogger(EchoClient. class .getName()).log(Level.SEVERE, null , ex); } // Scannerクラスのインスタンス(標準入力System.inからの入力) try (Scanner scanner = new Scanner(System.in)) { System.out.print( "EchoClient (" + myIpAddress + ") > Input IP address of EchoServer > " ); // サーバのIPアドレスを標準入力から設定 InetAddress serverAddress = InetAddress.getByName(scanner.next()); System.out.print( "EchoClient (" + myIpAddress + ") > Input port number of EchoServer > " ); // サーバのポート番号を標準入力から設定 int serverPort = scanner.nextInt(); // SocketクラスのインスタンスをサーバのIPアドレスとポート番号から生成 try (Socket socket = new Socket(serverAddress, serverPort); // サーバからの読み込み用のBufferedReaderクラスのインスタンスをSocketのInputStreamから生成 BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); // サーバへの書き込み用のPrintWriterクラスのインスタンスをSocketのOutputStreamから生成(自動フラッシュ) PrintWriter writer = new PrintWriter(socket.getOutputStream(), true )) { System.out.print( "EchoClient (" + myIpAddress + ") > " ); // 入力が存在する限りループ while (scanner.hasNext()) { // Scannerからトークンを読み込み String str = scanner.next(); if (str.equals( "quit" )) { break ; } // 読み込んだStringをSocketに送信 writer.println(str); System.out.println( "EchoServer (" + serverAddress.getHostAddress() + ") > " + reader.readLine()); System.out.print( "EchoClient (" + myIpAddress + ") > " ); } } catch (IOException ex) { Logger.getLogger(EchoClient. class .getName()).log(Level.SEVERE, null , ex); } } catch (UnknownHostException ex) { Logger.getLogger(EchoClient. class .getName()).log(Level.SEVERE, null , ex); } } } |
C:\Users\fujii>ipconfig Windows IP 構成 イーサネット アダプター イーサネット: 接続固有の DNS サフィックス . . . . .: リンクローカル IPv6 アドレス. . . . .: IPv4 アドレス . . . . . . . . . . . .: 192.168.11.100 サブネット マスク . . . . . . . . . .: 255.255.255.0 デフォルト ゲートウェイ . . . . . . .: 192.168.11.1
MultiEchoServer.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | package jp.ac.utsunomiya_u.is; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; public class MultiEchoServer { public static void main(String[] args) { // Scannerクラスのインスタンス(標準入力System.inからの入力) try (Scanner scanner = new Scanner(System.in)) { System.out.print( "EchoServer (" + getMyIpAddress() + ") > Input server port > " ); // ポート番号入力 int port = scanner.nextInt(); // スレッドプールの生成 ExecutorService executorService = Executors.newCachedThreadPool(); // ServerSocketクラスのインスタンスをポート番号を指定して生成 try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println( "EchoServer (" + getMyIpAddress() + ") > Started and Listening for connections on port " + serverSocket.getLocalPort()); while ( true ) { // ServerSocketに対する要求を待機し,それを受け取ったらSocketクラスのインスタンスを生成しEchoTaskを実行 executorService.submit( new EchoTask(serverSocket.accept())); } } catch (IOException ex) { Logger.getLogger(MultiEchoServer. class .getName()).log(Level.SEVERE, null , ex); } finally { // スレッドプールの停止 executorService.shutdown(); } } } /** * 自ホストのIPアドレス取得 * * @return 自ホストのIPアドレス */ private static String getMyIpAddress() { try { // 自ホストのIPアドレス取得 return InetAddress.getLocalHost().getHostAddress(); } catch (UnknownHostException ex) { Logger.getLogger(MultiEchoServer. class .getName()).log(Level.SEVERE, null , ex); } return null ; } private static class EchoTask implements Callable<Void> { /** * Socketクラスのインスタンス */ private final Socket socket; /** * コンストラクタ * * @param socket Socketクラスのインスタンス */ EchoTask(Socket socket) { this .socket = socket; } @Override public Void call() { System.out.println( "EchoServer (" + getMyIpAddress() + ") > Accepted connection from " + socket.getRemoteSocketAddress()); // クライアントからの読み込み用のBufferedReaderクラスのインスタンスをSocketのInputStreamから生成 try (BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); // クライアントへの書き込み用のPrintWriterクラスのインスタンスをSocketのOutputStreamから生成(自動フラッシュ) PrintWriter writer = new PrintWriter(socket.getOutputStream(), true )) { String inputLine; // クライアントからの入力待機し,それを受け取ったらStringに収納 while ((inputLine = reader.readLine()) != null ) { System.out.println( "EchoClient (" + socket.getRemoteSocketAddress() + ") > " + inputLine); // 受け取ったStringをそのままクライアントへ書き込み writer.println(inputLine); } } catch (IOException ex) { Logger.getLogger(MultiEchoServer. class .getName()).log(Level.SEVERE, null , ex); } finally { System.out.println( "EchoServer (" + getMyIpAddress() + ") > Terminated connection from " + socket.getRemoteSocketAddress()); try { // ソケットのクローズ処理 socket.close(); } catch (IOException ex) { Logger.getLogger(MultiEchoServer. class .getName()).log(Level.SEVERE, null , ex); } } return null ; } } } |