# Non blocking recv UDP



## Kalkulon (7. Apr 2010)

Hallo, gibt es noch eine andere Möglichkeit eines non blocking receive bei einem UDP Datagram Socket als das setzen eines Timeouts? Wenn nein, wie sollte man den Timeout wählen? tritt der Timeout auch auf, wenn das Paket nicht vollständig in der angegebenen Zeit empfangen wurde? oder wird der timeout gestoppt, wenn ein Paket zum Empfang bereit steht? vielen Dank für eure Bemühungen.


----------



## Lord_Aratorn (7. Apr 2010)

Was du beschreibst, regelt man als Thread. Der Thread ruft in seiner run-Method das Socket.receive auf. Anschließend muss eine Schnittstelle implementiert werden, die die letzte Referenz des Packetes speichert und der Außenwelt bereitstellt.


----------



## Kalkulon (7. Apr 2010)

Hmmm versteh ich noch nicht so ganz! das Socket wird auch von mehreren Threads aufgerufen, die Methoden sind synchronized. Also wird das Socket ja für alle Threads blockiert, wenn einer in einer synchronized Methode receive aufruft.


----------



## Lord_Aratorn (7. Apr 2010)

Ich denke mal, du willst nicht, dass dein Thread, der das receive aufruft blockiert.
Dies realisiert man in dem Man einen Thread erstellt, der für das empfangen von Paketen zuständig ist (Server).
Dieser Server kann wieder rum unterschiedliche Schnittstellen haben um auf Anweisungen zu agieren, oder das erhaltene Paket zu Verfügung zu stellen. Folgenden Code habe ich mir mal kurz aus den Fingern gezogen.


```
class MYUDP-Server extends Thread{
private LinkedBlockingQueue <DatagramPacket> lbq = null;
private DatagramSocket d = null;
private DatagramPacket p = null;

public MYUDP-Server(int port){
lbg  = new LinkedBlockingQueue<DatagramPacket>();
d = new DatagramSocket(port);
p = new DatagramPacket();
}


public void run()
{
p= d.receive();
lbg.put(p);
}

public DatagramPacket getPacket(){
return lbg.take();
}
}
```

Um den Code gescheit nutzen zu können musst du ihn in ein SingleTon Pattern stopfen und nach dem instantieren starten (Thread server = new MYUDP-Server("tolle Port nummer"); server.start()).


----------



## Kalkulon (7. Apr 2010)

ok danke hat mir schon mal sehr geholfen bin leider noch etwas unerfahren.


----------



## tuxedo (7. Apr 2010)

Non-Blocking UDP gibts im aktuellen Java nicht. Man muss entweder Threads verwenden oder ein Timeout setzen.

Im nächsten Java NIO isses aber glaub ich drin. In 99,9% der Fälle wird die Sache aber auch mit Threads hinreichend gut zu regeln sein.

- Alex


----------

