1概要

この記事では、ユーザーデータグラムプロトコル(https://en.wikipedia.org/wiki/User

Datagram

Protocol[UDP])を介した、Javaとのネットワーク通信を探っていきます。

UDPは、到着の保証や配信順序の保証なしに、ネットワーク上で独立したパケットを送信する通信プロトコルです。

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


2なぜUDPを使うのですか?

UDPは一般的なTCPとはまったく異なります。しかし、UDPの表面レベルのデメリットを検討する前に、オーバーヘッドがないためにTCPよりもはるかに高速になることを理解することが重要です。

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


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

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

設定もとても簡単です。 JavaにはUDPの組み込みネットワークサポートが付属しています。これは

java.net

パッケージの一部です。

したがって、UDPを介してネットワーク操作を実行するには、

java.net

パッケージからクラスをインポートするだけで済みます。


java.net.DatagramSocket

および

java.net.DatagramPacket

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

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


4サーバー

UDP通信では、単一のメッセージは

DatagramSocket

を介して送信される

DatagramPacket

にカプセル化されます。

簡単なサーバーを設定することから始めましょう。

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

とサーバーのアドレスがあります。コンストラクタ内でこれらをインスタンス化します。

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

最初に文字列messageをバイト配列に変換してから、メッセージを送信するための

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を介して通信する独自​​のクライアントサーバーアプリケーションを正常に構築しました。

この記事で使われている例の完全なソースコードを入手するには、https://github.com/eugenp/tutorials/tree/master/core-java/src/test/java/com/baeldung/networking/をチェックしてください。 udp[GitHubプロジェクト]