2012-08-16 7 views
0

Я строю систему слежения GPS в реальном времени, которая будет получать данные GPS, отправленные с нескольких устройств Arduino с использованием UDP. У меня есть этот код до сих пор:Получение данных GPS в реальном времени через UDP

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 - Позволяет сказать, что у меня есть 50 Arduinos, отправляющих данные. Мне нужно использовать потоки или что-то вроде этого?

3 - Лучше всего использовать поток на «соединение» (UDP без установления соединения), как ответ ниже или использовать фреймворки/библиотеки, такие как Apache Mina или Netty?

ответ

2

В этом случае нет проблем с использованием бесконечного цикла. Вызов receive ждет, пока не будет доставлена ​​новая датаграмма:

Этот метод блокируется до получения дейтаграммы. T ...

Таким образом, мощность процессора здесь не используется, она просто ждет новых данных.

Если у вас много клиентов или если обработка пакета не является полностью тривиальной, вы должны начать новый поток для обработки каждого из них, чтобы основной поток, получающий дейтаграммы, не блокировался. Вероятно, лучший подход - использовать thread pools, который будет создавать потоки для вас и в то же время предотвращать создание слишком большого количества потоков, если ваше приложение будет перегружено запросами.

Я бы действовать следующим образом:

  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; 
        } 
    } 
    
+0

Спасибо за ответ. Вы знаете, что имеет лучшую производительность: ваш код с потоками или NIO-based, например Apache Mina или Netty? Я говорю о 50 или более подключениях для начала. Каково поведение этого кода с тысячами подключений? – fonini

+0

@fonini Я бы сказал, что NIO имеет лучшую производительность (это была одна из причин, почему они это сделали). Но я думаю, что NIO более важен для TCP, где у вас есть связи с состоянием, с которыми вам нужно управлять. IIUC у вас есть только апатритные датаграммы, поэтому это делает намного проще без NIO. ИМХО, здесь встает вопрос: (1) вы хотите/можете использовать несколько процессоров? (2) обрабатывает ли отдельные запросы длительное время? Если да, то я буду использовать потоки для обработки независимо от того, используете ли вы NIO или нет. –

1

Я рекомендую вам взглянуть на Apache MINA (http://mina.apache.org/), отличную инфраструктуру для сетевых приложений. В MINA вам не нужно внедрять петлю или беспокоиться о потоковом режиме.

+0

или NETTY как вариант (https://netty.io/) – whiter4bbit

+0

Что лучше всего работает с Apache Tomcat? Или есть легкий сервер, чем Tomcat? – fonini

+0

Я использую Mina с приложением Java SE, не знаю, как хорошо или плохо работает с Tomcat ... –

1

Фактическая проблема, которую я вижу в вашем вопросе, - термин «в реальном времени». Что вы имеете в виду? Вам нужно очень предсказуемое (с точки зрения времени) приложение, важно ли это для безопасности/миссии? Если это может быть проблемой при использовании Java, так как это происходит по многим причинам (т. Е. Сборщик мусора и т. Д.), А не в реальном времени. Однако есть несколько JVM в реальном времени, как http://www.atego.com/products/aonix-perc/. Мне нравится Java, но я думаю, в этом случае, если вам действительно нужна система RT, C++ будет лучшим выбором.

Смежные вопросы