1. 概要

この記事では、ユーザーデータグラムプロトコル( UDP )を介したJavaとのネットワーク通信について説明します。

UDPは、がネットワークを介して独立したパケットを送信する通信プロトコルであり、到着の保証や配信の順序の保証はありません

インターネットを介したほとんどの通信は、伝送制御プロトコル(TCP)を介して行われますが、UDPには、次のセクションで説明する場所があります。

2. なぜUDPを使用するのですか?

UDPは、より一般的なTCPとはかなり異なります。 ただし、UDPの表面レベルの欠点を検討する前に、オーバーヘッドがないためにTCPよりも大幅に高速になる可能性があることを理解することが重要です。

速度とは別に、一部の種類の通信はTCPの信頼性を必要とせず、代わりに低遅延を重視することも覚えておく必要があります。 このビデオは、TCPではなくUDPを介して実行することでメリットが得られる可能性のあるアプリケーションの良い例です。

3. UDPアプリケーションの構築

UDPアプリケーションの構築は、TCPシステムの構築と非常によく似ています。 唯一の違いは、クライアントとサーバーの間にポイントツーポイント接続を確立しないことです。

セットアップも非常に簡単です。 Javaには、java.netパッケージの一部であるUDPの組み込みネットワークサポートが付属しています。 したがって、UDPを介してネットワーキング操作を実行するには、java.netパッケージからクラスをインポートするだけです。java.net.DatagramSocketおよびjava.net.DatagramPacket[X188X ]。

次のセクションでは、UDPを介して通信するアプリケーションを設計する方法を学習します。 このアプリケーションでは、一般的なエコープロトコルを使用します。

最初に、送信されたメッセージを送り返すエコーサーバーを構築し、次にサーバーに任意のメッセージを送信するエコークライアントを構築し、最後に、アプリケーションをテストしてすべてが正常に機能していることを確認します。

4. サーバー

UDP通信では、単一のメッセージが DatagramPacket にカプセル化され、DatagramSocketを介して送信されます。

簡単なサーバーをセットアップすることから始めましょう:

public class EchoServer extends Thread {

    private DatagramSocket socket;
    private boolean running;
    private byte[] buf = new byte[256];

    public EchoServer() {
        socket = new DatagramSocket(4445);
    }

    public void run() {
        running = true;

        while (running) {
            DatagramPacket packet 
              = new DatagramPacket(buf, buf.length);
            socket.receive(packet);
            
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            packet = new DatagramPacket(buf, buf.length, address, port);
            String received 
              = new String(packet.getData(), 0, packet.getLength());
            
            if (received.equals("end")) {
                running = false;
                continue;
            }
            socket.send(packet);
        }
        socket.close();
    }
}

パケットを送信するために全体で使用するグローバルDatagramSocket、メッセージをラップするバイト配列、およびrunningと呼ばれるステータス変数を作成します。

簡単にするために、サーバーは Thread を拡張しているため、runメソッド内にすべてを実装できます。

run 内に、エラーまたはクライアントからの終了メッセージによってrunningがfalseに変更されるまで実行されるwhileループを作成します。

ループの先頭で、DatagramPacketをインスタンス化して着信メッセージを受信します。

次に、ソケットでreceiveメソッドを呼び出します。 このメソッドは、メッセージが到着するまでブロックし、渡されたDatagramPacketのバイト配列内にメッセージを格納します。

メッセージを受信した後、応答を送り返すため、クライアントのアドレスとポートを取得します。

次に、クライアントにメッセージを送信するためのDatagramPacketを作成します。 受信パケットとの署名の違いに注意してください。 これには、メッセージの送信先のクライアントのアドレスとポートも必要です。

5. クライアント

次に、この新しいサーバー用の単純なクライアントを展開しましょう。

public class EchoClient {
    private DatagramSocket socket;
    private InetAddress address;

    private byte[] buf;

    public EchoClient() {
        socket = new DatagramSocket();
        address = InetAddress.getByName("localhost");
    }

    public String sendEcho(String msg) {
        buf = msg.getBytes();
        DatagramPacket packet 
          = new DatagramPacket(buf, buf.length, address, 4445);
        socket.send(packet);
        packet = new DatagramPacket(buf, buf.length);
        socket.receive(packet);
        String received = new String(
          packet.getData(), 0, packet.getLength());
        return received;
    }

    public void close() {
        socket.close();
    }
}

コードはサーバーのコードとそれほど変わりません。 グローバルDatagramSocketとサーバーのアドレスがあります。 これらをコンストラクター内でインスタンス化します。

サーバーにメッセージを送信し、応答を返す別のメソッドがあります。

最初に文字列メッセージをバイト配列に変換し、次にメッセージを送信するためのDatagramPacketを作成します。

次へ–メッセージを送信します。 すぐにDatagramPacketを受信側に変換します。

エコーが到着すると、バイトを文字列に変換して文字列を返します。

6. テスト

クラスUDPTest.javaでは、2つのアプリケーションのエコー機能をチェックするための1つのテストを作成するだけです。

public class UDPTest {
    EchoClient client;

    @Before
    public void setup(){
        new EchoServer().start();
        client = new EchoClient();
    }

    @Test
    public void whenCanSendAndReceivePacket_thenCorrect() {
        String echo = client.sendEcho("hello server");
        assertEquals("hello server", echo);
        echo = client.sendEcho("server is working");
        assertFalse(echo.equals("hello server"));
    }

    @After
    public void tearDown() {
        client.sendEcho("end");
        client.close();
    }
}

setup では、サーバーを起動し、クライアントも作成します。 tearDown メソッドでは、サーバーを閉じると同時にクライアントを閉じることができるように、サーバーに終了メッセージを送信します。

7. 結論

この記事では、ユーザーデータグラムプロトコルについて学び、UDPを介して通信する独自のクライアントサーバーアプリケーションを正常に構築しました。

この記事で使用されている例の完全なソースコードを入手するには、GitHubプロジェクトをチェックしてください。