2016-10-24 3 views
0

Мне было интересно, существует ли тип функций OnMessage() для сообщений UDP с использованием DatagramPacket? Я хочу быть в состоянии обеспечить, чтобы я получал все сообщения, когда они сталкивались, поэтому я не трачу ресурсы, случайно захватывающие таймер.Функция OnMessage() для UDP

OnMessage Я имею в виду то, что сделано в WebSocketClient. Или некоторые функции, похожие на «Доступные» в .net.

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

ответ

1

DatagramPacket получить() операция блокировки, так что вы обычно делаете, просто запустить отдельный поток, который будет прослушивать входящие датаграммы в и отправьте их для дальнейшей обработки, например:

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

Просмотреть правки для OP. – Tacitus86

+0

Тогда вы должны быть настроены, так как socket.receive() сделает JVM подписаться на сокет ОС и получит данные после его поступления. Не задействован таймер, и никаких ресурсов «нет». – zeppelin

+0

Проблема в том, что я, кажется, не хватает пакетов. Они идут слишком быстро или что-то в этом роде? – Tacitus86

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