中級 Java エンジニア向け:Linux 上での TCP/UDP 通信とネットワークトラブルシューティング


はじめに

Javaでネットワークプログラミングを行う際、Linux環境特有の挙動や設定に悩むことはありませんか?
本記事では、中級Javaエンジニアを対象に、以下のポイントを中心に解説します。

  • JavaによるTCP/UDP通信の基礎と実装例
  • Linux環境でのポート設定・確認方法
  • ネットワークトラブルの実践的な調査・解決法

1. Linux環境におけるネットワーク通信の基礎

1.1 TCPとUDPの違い

項目TCPUDP
特徴信頼性の高い通信(コネクション型)軽量・高速(コネクションレス型)
代表例HTTP、SMTP、FTPDNS、ストリーミング、ゲーム通信
JavaクラスSocket, ServerSocketDatagramSocket, DatagramPacket

2. JavaでのTCP通信実装(クライアント/サーバー)

2.1 サーバー側コード例

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

public class TcpServer {
    public static void main(String[] args) throws IOException {
        int port = 5000;
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("Server listening on port " + port);

        while (true) {
            Socket socket = serverSocket.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            String message = in.readLine();
            System.out.println("Received: " + message);
            out.println("Echo: " + message);
        }
    }
}

2.2 クライアント側コード例

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

public class TcpClient {
    public static void main(String[] args) throws IOException {
        String host = "127.0.0.1";
        int port = 5000;
        Socket socket = new Socket(host, port);

        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        out.println("Hello from client");
        System.out.println("Response: " + in.readLine());

        socket.close();
    }
}

3. JavaでのUDP通信実装

import java.net.*;

public class UdpExample {
    public static void main(String[] args) throws Exception {
        DatagramSocket socket = new DatagramSocket();
        byte[] sendData = "Hello UDP".getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address, 6000);
        socket.send(sendPacket);
        socket.close();
    }
}

UDP通信はコネクションレスなため、サーバー側での受信確認が重要です。
tcpdumpnc -luを利用してLinux上でパケットを監視できます。


4. Linux上でのネットワーク確認コマンド

コマンド説明
netstat -tuln現在開いているポートを確認
ss -ltnpポートを使用しているプロセスを特定
ping <host>通信可能か確認
telnet <host> <port>特定ポートへの接続確認
tcpdump -i eth0 port 5000パケットキャプチャで通信確認
iptables -L -nファイアウォール設定確認

5. よくあるトラブルと対処法

トラブル内容原因対処方法
ポートがバインドできない別プロセスが使用中ss -tulnで確認し、killで解放
クライアントが接続できないファイアウォール制限sudo ufw allow <port> で開放
通信が遅い/途切れるバッファやMTU設定/etc/sysctl.confnet.core パラメータを調整
UDPパケットが届かないNAT越え・フィルタリングtcpdumpで送受信確認、iptables設定を確認

6. 実践:Java+Linuxでのネットワークデバッグ手順

  1. ポートが開いているか確認 ss -tuln | grep 5000
  2. プロセスが正しく起動しているか確認 ps aux | grep TcpServer
  3. ファイアウォールの確認 sudo ufw status
  4. パケットの流れを確認 sudo tcpdump -i eth0 port 5000 -n

7. まとめ

Linux上でのJavaネットワーク通信は、TCP/UDPの特性を理解し、環境設定とトラブルシューティングの手順を押さえることで安定化します。
本記事で紹介したコマンドやコード例を活用し、通信処理の信頼性を高めていきましょう。

タイトルとURLをコピーしました