Java入門:TCPクライアントとサーバーアプリケーションの作成

以下は、JavaのSocketとServerSocketクラスを使用して、シンプルなTCPクライアントとサーバーアプリケーション、そしてチャットアプリケーションを作成する完全な例です。クライアントとサーバーのコードは、TCP接続を介してメッセージを交換できます。


  1. 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());
                }
            }
        }
    }
}
  1. 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());
        }
    }
}
  1. 使用例

    1. コードのコンパイル: javac を使用して Server.javaClient.java をコンパイルします。
    1. サーバーの実行: まずサーバーを起動します: java Server
    1. サーバーが起動すると、「サーバーを起動し、クライアントの接続を待機しています…」と表示されます。
    1. クライアントの実行: java Client を実行します。任意のメッセージを入力し、Enterキーを押すとサーバーに送信されます。サーバーは受信したメッセージを小文字に変換して返信します。
    1. セッションの終了: クライアントで exit と入力して、クライアントプログラムを終了します。

タグ: Java TCP socket ServerSocket ネットワークプログラミング

5月22日 08:38 投稿