Javaネットワーク入門|SocketとTCP通信
TCPソケット、ServerSocket/Socket、入出力ストリーム、簡易エコーサーバー/clientの作り方とポート・ファイアウォールなど失敗例を学びます。
結論:Javaのネットワーク通信はSocketでTCP接続を張り、入出力ストリームでデータをやり取りする
TCPは信頼性のある双方向通信です。サーバー側は ServerSocket で待ち受け、クライアントは Socket で接続します。
簡易サーバー
try (ServerSocket server = new ServerSocket(8080)) {
System.out.println("Listening...");
try (Socket client = server.accept();
var in = new BufferedReader(new InputStreamReader(client.getInputStream()));
var out = client.getOutputStream()) {
String line = in.readLine();
out.write(("Echo: " + line + "\n").getBytes(StandardCharsets.UTF_8));
}
}
クライアント
try (Socket socket = new Socket("localhost", 8080);
var out = new PrintWriter(socket.getOutputStream(), true);
var in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
out.println("Hello");
System.out.println(in.readLine());
}
失敗例:サーバー未起動で接続
ConnectException: Connection refused — ポート・ホスト・ファイアウォールを確認します。
失敗例:ポート占有
BindException: Address already in use — 前回のプロセスが残っていないか、別ポートを試します。
HTTPとの関係
WebのHTTPもTCPの上で動きます。実務では java.net.http.HttpClient(Java 11+)やSpring WebClientを使うことが多いですが、Socket理解はトラブルシュートの基礎になります。
まとめ
ネットワークプログラミングはリソース解放(try-with-resources)とエラー処理が重要です。localhostでエコーサーバーを動かし、次回はスレッドで複数クライアントに対応する方向を学びます。
まとめ
JavaのTCP通信はServerSocket/Socketとストリームで実装します。Connection refusedとポート占有は初学者がよく遭遇するエラーです。localhost:8080のエコーサーバー/クライアントをペアで動かしてみましょう。
次にやること
ポート8080のエコーサーバーとクライアントを作り、サーバー起動後にクライアントから1行送って応答を確認してください。
よくある質問
UDPは?
DatagramSocket/DatagramPacketで扱います。TCPより軽量だが到達保証なし。動画配信などに使われます。
localhost と 127.0.0.1?
同じ意味のループバックアドレス。自分のマシン上のサービスに接続します。
本番でServerSocketを直接書く?
学習目的では有効。本番WebはServlet/Spring、HTTPクライアントはHttpClientを使います。
タイムアウトは?
socket.setSoTimeout(ms) で読み取り待ちを制限できます。
TLS/HTTPSは?
SSLSocketで暗号化。証明書管理が必要で、HttpClient利用が現実的です。
次に読むべき記事
同カテゴリ「プログラミング」の記事
人気記事
- TS2307: Cannot find module '@components/Widget601' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget591' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget581' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget571' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget561' or its corresponding type declarations の原因と解決法
- TS2307: Cannot find module '@components/Widget551' or its corresponding type declarations の原因と解決法
学習ルート
体系的に学びたい方はこちらから。
エラー解決コース →あわせて読みたい
- Javaのファイル入出力ストリームの基礎
- Javaのスレッドプログラミング同じ講座の次の回
- Javaの例外処理IOException
- Javaの例外処理IOException
- Javaのプロジェクト開発実アプリ構成