0

私はリアルタイムGPS追跡システムを構築しています。これはUDPを使用していくつかのArduinoデバイスから送信されたGPSデータを受信します。私はこれまでにこのコードを持っています:

PreparedStatement stmt ...

DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];

while(true){
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    serverSocket.receive(receivePacket);
    String received = new String( receivePacket.getData());
    System.out.println("RECEIVED: " + received);

    stmt.set...
    stmt.execute();
}

1-これを行うためのより良い方法があるかどうか、より多くの知識を持っている人は私に言うことができますか?JVMがこれをどのように処理するかは本当にわかりませんが、その無限ループは好きではありません。

2-データを送信しているArduinoが50台あるとします。スレッドなどを使用する必要がありますか?

3-以下の回答のように「コネクション」ごとにスレッドを使用する(UDPはコネクションレス型)か、Apache MinaやNettyなどのフレームワーク/ライブラリを使用するのが最善ですか?

4

3 に答える 3

2

この場合、無限ループを使用しても問題はありません。receiveの呼び出しは、新しいデータグラムが配信されるまで待機します。

このメソッドは、データグラムが受信されるまでブロックします。T..。

したがって、ここではCPUパワーが無駄になることはなく、新しいデータが利用可能になるまで待機するだけです。

クライアントが多数ある場合、またはパケットの処理が完全に簡単ではない場合は、データグラムを受信するメインスレッドがブロックされないように、各クライアントを処理するための新しいスレッドを開始する必要があります。おそらく最善のアプローチは、スレッドを作成するスレッドプールを使用すると同時に、アプリケーションがリクエストによって過負荷になった場合にスレッドが多すぎないようにすることです。

私は次のように進めます:

  1. データグラムを受信するための専用スレッドを作成します。また、リクエストをディスパッチして処理するためのスレッドプールを作成することもできます。何かのようなもの:

    int maxNumberOfThreads = ...; // your choice
    int bufSize = ...; // your choice
    
    ExecutorService exec = Executors.newFixedThreadPool(maxNumberOfThreads);
    DatagramSocket serverSocket = new DatagramSocket(9876);
    
    while (true) {
        // we need to create a new buffer every time because
        // multiple threads will be working with the data
        DatagramPacket receivePacket = 
            new DatagramPacket(new byte[bufSize], bufSize);
        serverSocket.receive(receivePacket);
        exec.submit(new YourTask(receivePacket));
    }
    
  2. YourTaskデータグラムを処理するクラスを作成します。

    // We don't use return values for anything here, so
    // we just use Object.
    public class YourTask extends Callable<Object> {
        private DatagramPacket received;
    
        public YourTask(DatagramPacket received) {
            this.received = received;
        }
    
        public Object call() {
            // do your processing here
            System.out.println("RECEIVED from " +
                received.getAddress() +
                ": " + new String(received.getData(),
                                  0, received.getLength()));
            return null;
        }
    }
    
于 2012-08-20T13:39:16.473 に答える
1

ネットワークアプリケーションの優れたフレームワークであるApacheMINA(http://mina.apache.org/)をご覧になることをお勧めします。MINAを使用すると、ループを実装したり、スレッド化について心配したりする必要はありません。

于 2012-08-20T12:26:22.533 に答える
1

あなたの質問で私が実際に目にする問題は、「リアルタイム」という用語です。それはどういう意味なの?非常に予測可能な(タイミングの観点から)アプリケーションが必要ですか?それは安全性/ミッションクリティカルですか?その場合、Javaの使用に問題がある可能性があります。これは、多くの理由(つまり、ガベージコレクターなど)がリアルタイムではないためです。ただし、 http: //www.atego.com/products/aonix-perc/のようなリアルタイムJVMがいくつかあります。私はJavaが好きですが、この場合、本当にRTシステムが必要な場合は、C++の方が適していると思います。

于 2012-08-20T12:27:48.687 に答える