UDP Receive und Send am gleichen Port

Status
Nicht offen für weitere Antworten.
F

finalcu

Gast
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

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

Code:
	@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.
 
F

finalcu

Gast
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben