クライアントとサーバの実装

Javaのネットワーキングにおける「クライアントとサーバの実装」は、java.netパッケージを利用して、TCP通信を行う形でよく実装されます。ここでは、**Socket(クライアント側)ServerSocket(サーバ側)**を使用した基本的な同期通信の例をもとに、詳細に解説します。


1. サーバの実装

サーバは、まずServerSocketを使って特定のポートで待ち受けを行い、クライアントからの接続を受け付けます。

サーバ側コード例

java
import java.io.*; import java.net.*; public class SimpleServer { public static void main(String[] args) { int port = 12345; try (ServerSocket serverSocket = new ServerSocket(port)) { System.out.println("サーバがポート " + port + " で待機中..."); // クライアントの接続を待つ Socket clientSocket = serverSocket.accept(); System.out.println("クライアントが接続しました: " + clientSocket.getInetAddress()); // 入出力ストリームの取得 BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); // クライアントからのメッセージを読み取り、応答を返す String message = in.readLine(); System.out.println("受信メッセージ: " + message); out.println("サーバからの応答: " + message.toUpperCase()); // クローズ処理 in.close(); out.close(); clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }

2. クライアントの実装

クライアントは、Socketクラスを使って指定したIPアドレスとポートに接続し、サーバと通信を行います。

クライアント側コード例

java
import java.io.*; import java.net.*; public class SimpleClient { public static void main(String[] args) { String host = "localhost"; int port = 12345; try (Socket socket = new Socket(host, port)) { System.out.println("サーバに接続しました"); // 入出力ストリームの取得 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); // メッセージを送信し、応答を受信する out.println("こんにちは、サーバさん!"); String response = in.readLine(); System.out.println("サーバからの応答: " + response); // クローズ処理 in.close(); out.close(); } catch (IOException e) { e.printStackTrace(); } } }

3. 実行の流れ

  1. サーバプログラムを起動して、指定ポートで接続待ち状態にします。

  2. クライアントプログラムを起動すると、サーバに接続を試みます。

  3. サーバは接続を受け付け、クライアントからのメッセージを読み取り応答します。

  4. 双方が通信を完了した後、接続を閉じます。


4. 補足

  • BufferedReader / PrintWriter は、テキストベースの通信に便利です。

  • 複数クライアント対応をするには、accept()のたびに新しいスレッドを立ち上げて処理を分離する必要があります。

  • ネットワーク遅延や切断などの例外処理も現実的には重要です。


このように、JavaではSocketとServerSocketを使って簡潔にクライアント・サーバ型の通信を実装できます。実際のアプリケーションでは、より高度なプロトコル設計や並行処理が必要になることもあります。

生成日:2025/05/03