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と入力
すると以下のようになれば成功です。
image

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);

    }
}

参考資料

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓おすすめ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
https://www.otsubo.info/contents/network/network06.html