Client soll mehrere Antworten von Servern gleichzeitig empfangen

  • Themenstarter Themenstarter NCMS
  • Beginndatum Beginndatum
N

NCMS

Gast
Hello,

für eine Applikation habe ich ein paar Rechner (Netzwerk). Von einem (fungiert als Client) wird nun ein UDP-Broadcast an alle anderen (alle sozusagen Server) geschickt. Diese sollen dann mit einer Info antworten, die sich der Anfragende merken soll (Liste oder so).

Aber wie mache ich das, dass er gleichzeitig oder evtl. zeitlich versetzt mehrere Antworten auf dem gleichen Port verarbeiten kann?
 
Du verschickst die Antworten des Servers halt nach und nach, Timer oder Thread sind gefragt. Du könntest auch alle Informationen mit einem DatagramPackage schicken und es bei Ankunft am Client aufsplitten und speichern.
 
Es sollen aber alle mit dem selben Programm arbeiten. Sollen dann die verschiedenen "Antworter" ne Zufallszahl generieren und erst nach Ablauf dieser Zeit ihr Zeug an den "Frager" senden?
 
Also ich versteh nicht wirklich wie du denkst. Hat man doch einen Server welcher in einem Thread dauerhaft auf Anfragen von Clients wartet. Sobald eine Nachricht eingeht, antwortet der Client an den Absender des eingehenden Packetes. Die Reihenfolge spielt keine Rolle und kann via UDP sowieso variieren.

PseudoServer

while(running)
warte auf Anfragen

if(eingehendeAnfrage)
erzeugeAntwort
sendeAntwort(eingehendeAnfrage.getAbsender)

)

Das Abarbeiten mehrerer Anfragen an den Server macht der DatagramSocket meines Wissens nach automatisch, darum musst du dich nicht kümmern (kann mich auch irren).
 
Nein. Sie senden sie sobald sie es können. Der Empfänger arbeitet diese dann in Threads ab. D.h. es entsteht eine "Parallelität"
 
Ich weiß nicht, ob ihr mich richtig versteht:

Teilnehmer: Station A, Station B1, Station B2, Station B3

Station B1...3 warten auf eine Anfrage. Sie horchen auf bestimmten Port und wenn dort eine Anfrage kommt, senden sie eine Antwort. (Server) Sie haben alle die selbe Applikation.

Station A schickt nun an 255.255.255.255 eine Anfrage auf den bestimmten Port. (Client)

Die StationenB1...3 antworten nun alle sofort darauf. Zum Beispiel indem sie ihre eigene Uhrzeit auslesen und an A schicken oder MAC-Adresse usw.

A muss nun die Infos von 1...3 empfangen und am besten gleich in der Konsole ausgeben oder sonst wo hin speichern. Aber ich denke, dass die Antworten (z. B. Uhrzeit) alle gleich ankommen. Und ich kann immer nur eine Antwort empfangen. Möchte aber ALLE empfangen.
 
Also implementiert jeder Client gleichzeitig auch eine Server funktion ? So ein Vorhaben habe ich damals auch mal umgesetzt.

Ich hatte das so gelöst, dass zum Start jedes Clients versucht wird, einen Socket auf dem festgelegten Port zu eröffnen. Wenn dies aufgrund einer "PortAlreadyInUseException" nicht gelingt, wird anstatt des Portgebundenen DatagramSocket(port) ein normaler DatagramSocket() erstellt.

In der run() Methode wird gehorcht ob was eingeht (socket.receive(in), bei einem Broadcast bekommt also jeder Client eine Nachricht und antwortet mit einer Information. Der Absender des Broadcasts bekommt also von jedem Client eine Nachricht zurück und kann diese beim Eintreffen des Packetes speichern oder halt in der Konsole ausgeben.
 
Ungetestet


Jedes Programmiert implementiert:

Java:
public void run (){
	
		running = true;
		DatagramSocket socket = null;
		
		try {
			socket = new DatagramSocket(5001);
		}
		
		catch (SocketException e) {
			
			System.out.println(e.getMessage());
			
			try {
				socket = new DatagramSocket();
			}
			
			catch (SocketException e1) {
				
				System.out.println(e1.getMessage());
			}
		}


Java:
 while(running){
			 
			byte[] inData = new byte[1024];
			String message;
			DatagramPacket in = new DatagramPacket(inData, inData.length);
			
			try {
				
				//Verusche Nachricht zu empfangen
				socket.receive(in);
				
				String senderName = in.getAddress().getHostName();
				message = new String(in.getData(),0,in.getLength());
				System.out.println("received from: " + senderName + " Message: " + message);
	
			} catch (IOException e) {
				System.out.println(e.getMessage());
				running = false;
				socket.close();
			}
			
			socket.close();
		}
 

Zurück
Oben