# UDP Receive und Send am gleichen Port



## finalcu (10. Nov 2009)

Hallo Zusammen,

für eine Anwendung brauche ich einen Thread der zu bestimmten Events ein UDP Paket über einen bestimmten Port versendet. Zwischenzeitlich soll er aber auf dem gleichen Port auf eintreffende UDP Pakete warten.Wie realisiere ich das am einfachsten ohne dass das Empfangen das Senden blockiert?

Gruss und Danke im Voraus!

finalcu


----------



## Empire Phoenix (11. Nov 2009)

Update wird von einem anderen Thread aufgerufen wie der Thread zu dem das run gehört


```
@Override
	public void run() {
		while(running){
			try {
				DatagramPacket packetcache = new DatagramPacket(new byte[1024],1024);;
				this.socket.receive(packetcache);
				recivecache.add(packetcache);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				Thread.sleep(5);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} //Don't overdo it
		}
	}
	
	public void Update(){
		//Process all data in the recivecache!
		while(!recivecache.isEmpty()){
			DatagramPacket current = recivecache.pop();
			ClientMessage recivedmessage;
			try {
				recivedmessage = ConvertToClientMessage(current);
				address = current.getAddress();
				port = current.getPort();
				listeneriterator = listeners.iterator();
				client = GetClient(address,port);
				while(listeneriterator.hasNext()){
					currentlistener = listeneriterator.next();
					currentlistener.messageRecived(client,recivedmessage,address,port);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} 
		}
		
		//Send all data in the sendcache!
		while(!sendcache.isEmpty()){
			try {
				DatagramPacket current = sendcache.pop();
				this.socket.send(current);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
```


Macht bislang bei mir keine Probleme, und hat den Vorteil wenn man nicht threadsafe Anwendungen hat, das sie trotzdem funktionieren, solange man Update() aus deren update funktion aufruft.


----------



## finalcu (11. Nov 2009)

Hi,

erstmals danke fuer deine rasche Antowrt. Leider verstehe ich deinen Code nicht ganz - ich fasse mal zusammen was ich soweit verstanden habe:

1. Der Thread (zudem das Run gehoert) empfaengt solange er laeuft UDP Pakete mittels this.socket. Alle empfangene Pakete fuegt er in einen receive cache...

2. Zwischendurch schlaeft er damit die update Funktion aufgerufen werden kann.

3. Wird die update Funktion von einem anderen Thread aufgerufen werden die Packete im receive cache verarbeitet (was ist die Aufgabe des listeners?)

4. Danach werden alle Packete im send cache mittels des gleichen sockets (this.socket) versendet.

Wo ich nun Schwierigkeiten habe: Angenommen der thread befindet sich in der run() Funktion und wartet auf ein UDP Paket aber keines kommt. Ist der Thread dann nicht fuer immer blockiet (oder zumindest solange bis ein neues UDP Paket kommt) und kann daher auch keine weiteren Paket versenden?

Gruss,
finalcu


----------



## Empire Phoenix (11. Nov 2009)

Der thread der sich um run kümmert ist gefangen, ja
Aber der Thread der die Update macht kümmert sich ums senden.

Ein listener kann empfangene Packete verarbeiten.

Hier mein halb kompletter code dazu (es fehlt noch ein Client seitiges Timeout)

RapidShare: 1-CLICK Web hosting - Easy Filehosting


----------

