TCP通信の実装:Javaでシンプルなクライアント・サーバアプリケーション構築

ServerSocketクラスの概要

ServerSocketクラスは、TCPプロトコルを使用するサーバ側の通信を実現するためのクラスです。

ServerSocketの主なコンストラクタ

メソッド 説明
ServerSocket(int port) 指定されたポート番号でサーバソケットを作成し、バインドします。

ServerSocketの主なメソッド

メソッド 説明
Socket accept() クライアントからの接続を待機し、接続が確立されたらSocketオブジェクトを返します。
void close() サーバソケットを閉じます。

Socketクラスの概要

Socketクラスは、クライアント側またはサーバ側で確立された接続を表すクラスです。

Socketの主なコンストラクタ

メソッド 説明
Socket(String host, int port) 指定されたホストとポートに接続するクライアントソケットを作成します。

Socketの主なメソッド

メソッド 説明
InetAddress getInetAddress() 接続先のIPアドレスを取得します。
InputStream getInputStream() ソケットの入力ストリームを取得します。
OutputStream getOutputStream() ソケットの出力ストリームを取得します。

TCPの長距離接続と短距離接続

TCPは接続指向型プロトコルであり、データ送信の前に接続を確立する必要があります。

  • 短距離接続: 一度の送受信ごとに接続を確立し、終了後に切断します。
  • 長距離接続: 接続を維持し続け、複数回の送受信が可能です。

TCPエコー通信の実装

サーバ側の実装


import java.io.*;
import java.net.*;

public class TcpEchoServer {
    private ServerSocket serverSocket;

    public TcpEchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }

    public void run() throws IOException {
        System.out.println("サーバ起動中...");
        Socket clientSocket = serverSocket.accept();
        handleConnection(clientSocket);
    }

    private void handleConnection(Socket socket) {
        System.out.println("クライアント接続: " + socket.getInetAddress());
        try (InputStream input = socket.getInputStream();
             OutputStream output = socket.getOutputStream()) {
            Scanner scanner = new Scanner(input);
            PrintWriter writer = new PrintWriter(output, true);
            while (scanner.hasNextLine()) {
                String request = scanner.nextLine();
                String response = process(request);
                writer.println(response);
                System.out.println("受信: " + request + ", 応答: " + response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private String process(String request) {
        return request;
    }

    public static void main(String[] args) throws IOException {
        TcpEchoServer server = new TcpEchoServer(9090);
        server.run();
    }
}
  

クライアント側の実装


import java.io.*;
import java.net.*;

public class TcpEchoClient {
    private Socket socket;

    public TcpEchoClient(String host, int port) throws IOException {
        socket = new Socket(host, port);
    }

    public void run() {
        System.out.println("クライアント起動");
        Scanner scanner = new Scanner(System.in);
        try (InputStream input = socket.getInputStream();
             OutputStream output = socket.getOutputStream()) {
            PrintWriter writer = new PrintWriter(output, true);
            while (true) {
                System.out.print("> ");
                String request = scanner.nextLine();
                if (request.equalsIgnoreCase("exit")) break;
                writer.println(request);
                Scanner responseScanner = new Scanner(input);
                if (responseScanner.hasNextLine()) {
                    String response = responseScanner.nextLine();
                    System.out.println(response);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            TcpEchoClient client = new TcpEchoClient("127.0.0.1", 9090);
            client.run();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  

タグ: Java Socketプログラミング TCP/IP

8月9日 23:20 投稿