EchoServer.java
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
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
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; } } }