JavaのUDPガイド
1. 概要
この記事では、ユーザーデータグラムプロトコル(UDP)を介したJavaとのネットワーク通信について説明します。
UDPは、transmits independent packets over the network with no guarantee of arrival and no guarantee of the order of deliveryの通信プロトコルです。
インターネット上のほとんどの通信は、伝送制御プロトコル(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をインポートするだけで済みます。
次のセクションでは、UDPを介して通信するアプリケーションを設計する方法を学習します。このアプリケーションでは、一般的なエコープロトコルを使用します。
最初に、送信されたメッセージを送り返すエコーサーバーを構築し、次に任意のメッセージをサーバーに送信するエコークライアントを構築し、最後にアプリケーションをテストしてすべてが正常に機能することを確認します。
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とサーバーのアドレスがあります。 これらをコンストラクター内でインスタンス化します。
サーバーにメッセージを送信し、応答を返す別のメソッドがあります。
最初に文字列メッセージをバイト配列に変換し、次にメッセージを送信するための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 projectを確認してください。