ソケットプログラミング

Javaのソケットプログラミングは、TCP/IPネットワーク上で通信を行うアプリケーションを作成するための機能です。Javaは、java.netパッケージ内のクラスを通じて、低レベルのネットワーク通信を簡単に扱えるようにしています。

以下に、Javaのソケットプログラミングの基本概念と主要クラス、具体的な使用方法について詳しく説明します。


1. ソケットとは

ソケット(Socket)とは、ネットワーク上で通信を行うエンドポイントを表します。TCP/IP通信では、ソケットを通じてデータの送受信が行われます。

  • クライアントソケット(Socket):通信を開始する側(クライアント)が使用。

  • サーバーソケット(ServerSocket):通信を待ち受ける側(サーバー)が使用。


2. 主要クラス

2.1 Socket(クライアント側)

java
Socket socket = new Socket("localhost", 5000); OutputStream out = socket.getOutputStream(); InputStream in = socket.getInputStream();
  • new Socket(String host, int port):指定されたホストとポートに接続します。

  • getInputStream():データ受信用のストリーム。

  • getOutputStream():データ送信用のストリーム。

2.2 ServerSocket(サーバー側)

java
ServerSocket serverSocket = new ServerSocket(5000); Socket clientSocket = serverSocket.accept();
  • new ServerSocket(int port):指定ポートでクライアントからの接続を待ち受けます。

  • accept():クライアントからの接続を受け入れてSocketを返します。


3. 通信の流れ(基本構造)

3.1 サーバー側

java
import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(5000); System.out.println("サーバー起動、ポート5000で待機中..."); 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); in.close(); out.close(); clientSocket.close(); serverSocket.close(); } }

3.2 クライアント側

java
import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 5000); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println("こんにちは、サーバーさん!"); String response = in.readLine(); System.out.println("サーバーからの応答: " + response); in.close(); out.close(); socket.close(); } }

4. 特徴と注意点

  • ブロッキングI/O:accept()やreadLine()などはブロッキング動作を行うため、非同期処理が必要な場合はスレッドの利用が推奨されます。

  • 例外処理:通信中にIOExceptionが頻繁に発生し得るため、適切な例外処理が必要です。

  • リソース管理:Socketやストリームは使用後に必ずclose()で明示的に閉じる必要があります。


5. 発展的な話題

  • マルチスレッド対応サーバー:複数のクライアントを同時に処理するために、接続ごとにスレッドを生成。

  • 非同期I/O(NIO):java.nioパッケージを使うことで、より高性能な非同期通信が可能になります。

  • セキュア通信(SSL/TLS):SSLSocket、SSLServerSocketクラスを使用。


Javaのソケットプログラミングは、ネットワーク通信の基礎を理解する上で非常に有効です。クライアントとサーバーの基本的な構成とデータの送受信の仕組みを把握すれば、さまざまなネットワークアプリケーションへと応用できます。

生成日:2025/05/03