2016-10-24 25 views
0

我想知道是否有使用DatagramPacket的UDP消息的OnMessage()類型的功能類型?我希望能夠確保在遇到問題時能夠收到所有消息,這樣我就不會浪費資源隨機抓取定時器。UDP的OnMessage()功能

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訂閱OS套接字,並且一旦到達就會獲取數據。 沒有計時器參與,沒有資源「浪費」。 – zeppelin

+0

問題是我似乎缺少數據包。他們來得太快或什麼? – Tacitus86