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();
}
}
}