我正在构建一个实时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 - 假设我有50个Arduinos发送数据。我需要使用线程或类似的东西吗?
3 - 最好使用每个“连接”的线程(UDP是无连接的),如下面的答案或使用Apache Mina或Netty等框架/库?
答案 0 :(得分:2)
在这种情况下使用无限循环没有问题。调用receive会一直等到新的数据报传递完毕:
此方法将一直阻塞,直到收到数据报。的...
因此,没有浪费CPU功率,它只是等待新数据可用。
如果您有许多客户端或者处理数据包并不是完全无关紧要的,那么您应该启动一个新线程来处理每个客户端,这样接收数据报的主线程就不会被阻塞。可能最好的方法是使用thread pools为您创建线程,同时防止在请求超载您的应用程序时创建太多线程。
我将按以下步骤进行:
创建用于接收数据报的专用线程。它还可以创建一个线程池来分派处理请求。类似的东西:
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));
}
创建处理数据报的类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;
}
}
答案 1 :(得分:1)
我建议您查看Apache MINA(http://mina.apache.org/),这是一个适用于网络应用程序的优秀框架。使用MINA,您不需要实现循环或担心线程。
答案 2 :(得分:1)
我在你的问题中看到的实际问题是“实时”一词。你那是什么意思?您是否需要高度可预测的(在时间方面)应用程序,它是安全/关键任务吗?如果是这样,使用Java可能会有问题,因为它有很多原因(即垃圾收集器等)不是实时的。然而,有一些实时JVM为http://www.atego.com/products/aonix-perc/。 我喜欢Java,但我想在这种情况下,如果你真的需要一个RT系统,C ++将是一个更好的选择。