我想知道是否有一种使用DatagramPacket的UDP消息的OnMessage()类型功能?我希望能够确保我得到所有的消息时,他们遇到,所以我不会浪费资源随机抓取计时器。
OnMessage我指的是在WebSocketClient中完成的。或者一些类似于。net中的"Available"的功能。
While (rxUdpClient.Available > 0)
我正在监视几个端口,因此调用一个线程,它将为每个端口执行run()。问题是我似乎有大量的消息以40+/秒的速度传入。
这是我目前拥有的:
public void run()
{
DatagramSocket sock = null;
sock = new DatagramSocket(port);
byte[] buffer = new byte[DataAdapterFB1.HEADER_SIZE + DataAdapterFB1.MAX_DATA_BYTES];
DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
while (true){
sock.receive(incoming);
byte[] data = incoming.getData();
String s = new String(data, 0, incoming.getLength());
//This is the processing code, but it isn't its own thread...
ScadaMsg newMessage = new ScadaMsg(data);
}
}
DatagramPacket receive()操作是阻塞的,所以您通常要做的是启动一个单独的线程,它将在循环中侦听传入的数据报,并将它们分派给进一步处理,如下所示:
void run() {
socket = new DatagramSocket(4445);
while(true) {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); //JVM will wait here, until there is an incoming packet
onMessage(packet.getData())
}
}
public abstract void onMessage(final byte[] pkt);