UDP Client Server Communication Go Back-N
UDP Client Server Communication Go Back-N
クライアントサーバ間でUDPを用いた通信プログラムについて説明します。
開発言語はJAVAです。自動再送要求の方式としてGo Back-Nを採用します。
開発環境
JDK(Javaを開発するためのソフトウェア)
https://bell-sw.com/pages/downloads/#/java-11-lts
IDE(開発を助けてくれる親切なソフトウェア・しかも無料・ありがとう)
https://www.jetbrains.com/ja-jp/idea/download/#section=windows
そもそも何なのって話
UDPってなんなの。
2つのデバイス間で通信するための規約。プロトコル。ソケット通信の1つです。よく使われるのがTCPとUDP。UDP自体の説明は参考資料を読んだほうがわかりやすいので譲ります。感謝
Go-Back-Nは?なんなの。2つのデバイス間で通信しているとたまにパケットが破損したり、衝突したり、して相手に届かないことがある。そういうエラーが起きること前提で、再送する方法がGo Back-N。詳細は参考資料を。
どこから手を付けるか・マイルストーン
1.UDP Echo Server *エコーサーバは、クライアントが"Hello"とおくると"Hello"と返してくるサーバ。簡単なのでチュートリアルにぴったりです。
2.UDP Echo Client *上記のクライアント版
3.UDP Echo Server -> Go Back-N対応
4.UDP Echo Client -> Go Back-N対応
おそらくこの手順でつくると理解しやすいのだと思います。
おすすめです。
ソケット系のテストの方法
上記の1でUDP Echo Serverを作成したときに、どうやってテストするかって話です。
良いツールがあります。
これはソケットデバッガといって、無料です。(感謝)
テストの対象とは、反対側のプログラムの代わりをしてくれます。例えばサーバ側のテストの場合は、クライアントの役割をやってくれます。
https://www.udom.co.jp/sdg/freeedition.html
使い方をナレッジにしました。
https://menta.work/post/detail/41230/41k7dwVhPHET9N0GDiox
1.エコーサーバーのソース
サンプルソース:テストしてませんが大丈夫と思います。
下記を実行するとUDPPort5000番がリッスン状態になります。
確認方法は、Windows のコマンドプロンプトを開きます(黒い画面)
netstat -anと入力
すると以下のようになれば成功です。
Echo Server ソース
package com.company;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Main {
//port_number
static int PORT_NUMBER = 5000;
public static void main(String[] args) throws IOException {
var socket = new DatagramSocket(PORT_NUMBER);
var buf = new byte[256];
while(true)
{
var packet = new DatagramPacket(buf, buf.length);
System.out.print("recive packet");
socket.receive(packet);
var address = packet.getAddress();
int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
String received
= new String(packet.getData(), 0, packet.getLength());
socket.send(packet);
}
}
}
Echo Clientソース
package com.company;
import java.io.IOException;
import java.net.*;
public class Main {
//Your client must take an IP address or Hostname and port number as
//arguments IpAddress port message
public static void main(String[] args) throws IOException {
var socket = new DatagramSocket();
var bytes = args[2].getBytes();
var packet = new DatagramPacket(bytes,bytes.length,InetAddress.getByName(args[0]), Integer.parseInt(args[1]));
socket.send(packet);
packet = new DatagramPacket(bytes,bytes.length);
socket.receive(packet);
String received = new String(
packet.getData(), 0, packet.getLength());
System.out.print(received);
}
}
参考資料
- Socket通信における基本的な用語を説明してくれてます。最初に読むとよいでしょう(https://www.tutorialspoint.com/java/java_networking.htm)TCPのサンプルソース付き
- UDPに対して簡単に説明してくれます。UDPのサンプルソース:https://www.baeldung.com/udp-in-java
- Stop and Wait方式についての説明:https://www.javatpoint.com/stop-and-wait-protocol
- Go Back Nに関しての説明:https://www.javatpoint.com/go-back-n-arq
https://www.tutorialspoint.com/a-protocol-using-go-back-n
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓おすすめ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
https://www.otsubo.info/contents/network/network06.html