以下は、JavaのSocketとServerSocketクラスを使用して、シンプルなTCPクライアントとサーバーアプリケーション、そしてチャットアプリケーションを作成する完全な例です。クライアントとサーバーのコードは、TCP接続を介してメッセージを交換できます。
- TCP サーバープログラム
まず、特定のポートをリッスンし、クライアントからのメッセージを受信できるシンプルなTCPサーバーを作成します。
Server.java
package gpt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
private static final int listeningPort = 12345; // リッスンするポートを設定
public static void main(String[] args) {
System.out.println("サーバーを起動し、クライアントの接続を待機しています...");
try (ServerSocket serverSocket = new ServerSocket(listeningPort)) {
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("クライアントが接続しました: " + clientSocket.getInetAddress());
// クライアントのリクエストを処理する新しいスレッドを作成
new ClientHandler(clientSocket).start();
}
} catch (Exception e) {
System.err.println("サーバーでエラーが発生しました: " + e.getMessage());
}
}
// クライアントを処理する内部クラス
private static class ClientHandler extends Thread {
private Socket clientSocket;
public ClientHandler(Socket clientSocket) {
this.clientSocket = clientSocket;
}
@Override
public void run() {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
String receivedMessage;
while ((receivedMessage = in.readLine()) != null) {
System.out.println("メッセージを受信: " + receivedMessage);
out.println(receivedMessage.toLowerCase()); // 小文字に変換して応答を送信
}
} catch (Exception e) {
System.out.println("クライアント処理中にエラーが発生しました: " + e.getMessage());
} finally {
try {
clientSocket.close();
} catch (IOException e) {
System.out.println("接続のクローズ中にエラーが発生しました: " + e.getMessage());
}
}
}
}
}
- TCP クライアントプログラム
次に、サーバーに接続し、メッセージを送信できるシンプルなTCPクライアントを作成します。
Client.java
package gpt;
import java.io.*;
import java.net.Socket;
import java.time.LocalDateTime;
import java.util.Scanner;
public class Client {
private static final String host = "localhost"; // サーバーアドレス
private static final int serverPort = 12345; // サーバーポート
public static void main(String[] args) {
try (Socket socket = new Socket(host, serverPort);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
Scanner sc = new Scanner(System.in)) {
System.out.println("サーバーに接続しました。チャットを開始してください。");
// サーバーからのメッセージを受信するための新しいスレッド
new Thread(() -> {
try {
String serverMessage;
while ((serverMessage = in.readLine()) != null) {
System.out.println("サーバー: " + serverMessage);
}
} catch (Exception e) {
System.out.println("メッセージの受信中にエラーが発生しました: " + e.getMessage());
}
}).start();
// メインスレッドでメッセージを送信
String messageToSend;
while (true) {
messageToSend = sc.nextLine();
if (messageToSend.equalsIgnoreCase("exit")) {
break;
}
// メッセージにタイムスタンプを追加して送信
out.println("[" + LocalDateTime.now().toString() + "] " + messageToSend);
}
} catch (Exception e) {
System.err.println("サーバーへの接続中にエラーが発生しました: " + e.getMessage());
}
}
}
- 使用例
-
- コードのコンパイル:
javacを使用してServer.javaとClient.javaをコンパイルします。
- コードのコンパイル:
-
- サーバーの実行: まずサーバーを起動します:
java Server
- サーバーの実行: まずサーバーを起動します:
-
- サーバーが起動すると、「サーバーを起動し、クライアントの接続を待機しています…」と表示されます。
-
- クライアントの実行:
java Clientを実行します。任意のメッセージを入力し、Enterキーを押すとサーバーに送信されます。サーバーは受信したメッセージを小文字に変換して返信します。
- クライアントの実行:
-
- セッションの終了:
クライアントで
exitと入力して、クライアントプログラムを終了します。
- セッションの終了:
クライアントで