2016-10-24 5 views
0

DatagramPacketを使用するUDPメッセージにOnMessage()タイプの機能があるかどうか疑問に思っていましたか?私はすべてのメッセージが届くようにしたいので、タイマーでランダムにリソースを浪費することはありません。UDPのOnMessage()機能

OnMessage私はWebSocketClientで行われたものを指しています。あるいは、.netの "Available"に類似した機能です。

While (rxUdpClient.Available > 0) 

いくつかのポートを監視しているので、各ポートに対してrun()を実行するスレッドが呼び出されます。問題は、私は40 +/secという大きな速度でメッセージが入っているようです。

これは私が現在持っているものです。

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

関連する問題