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;
}
}
}