UDP Broadcast

J

JimmyJo1987

Gast
Hallo zusammen

ich versuche gerade im lokalen Netzwerk ein bestimmtes Gerät zu finden. Dazu schicke ich einen bestimmten Code an die Broadcast Adresse. Daraufhin Antwortet das Gerät.
Bin im moment soweit, dass das Paket geschickt wird und das Gerät auch Antwortet (laut Wireshark netzwerk analyse)
Beim empfangen hängt er sich jedoch bei receive auf. Warum auch immer vielleicht hat jemand von euch ja einen
Vorschlag.

Vielen Dank

[Java]
DatagramSocket clientSocket = new DatagramSocket();
IPAddress = InetAddress.getByName("192.168.1.255");
String mee;
mee="Code";
byte[] sendData = new byte[256];
sendData=mee.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 8001);
clientSocket.send(sendPacket);

clientSocket.close();


DatagramSocket serverSocket = new DatagramSocket(8001);
byte[] receiveData = new byte[256];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
//InetAddress IPAddress1 = receivePacket.getAddress();

[/Java]
 

dayaftereh

Top Contributor
Hey, also der Code ist so weit inordnung.. Bist du dir sich, dass das gerät auf den Port 8001 antwortet. Also wenn du recive aufrufst dann hängt der ausführen so lannge bist Daten auf dem Socket ankommen!Daher denke ich das keine Daten auf dem UDP Port 8001 ankommen!
 
J

JimmyJo1987

Gast
Danke erstmal für deine Antwort.
Kann es sein, dass das Telegramm beim senden so schnell Antwortet das es der receiver nicht mehr mitbekommt?
Da ich definitiv ein Telegramm zurück erhalte.
Das nächste Thema wäre dann, wie kann ich das abbrechen? Da es ja sein könnte, dass kein Gerät zum Antworten da ist.
 
J

JimmyJo1987

Gast
Ja gut,
aber dann hängt es ja erst recht wenn er auf eine Antwort wartet.
Da die Anfrage ja erst danach versendet werden würde, oder versteh ich was falsch?
 

c_sidi90

Top Contributor
Wieso hängt der dann erstrecht? Starte den ServerSocket in einem Thread und lasse ihn dauerhaft auf dem bestimmten Port lauschen und lege ihn für ein paar ms schlafen.

P.S ich würde das receive und send in einen Try-Catch block setzen um mögliche exceptions abzufangen und gegebenfalls die message ausgeben lassen.

LG
 

dayaftereh

Top Contributor
Hey, versuche das mal:
Java:
DatagramSocket serverSocket = new DatagramSocket(8001);

DatagramSocket clientSocket = new DatagramSocket();
IPAddress = InetAddress.getByName("192.168.1.255");           
byte[] sendData = new byte[256];
sendData="Code".getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 8001);
clientSocket.send(sendPacket);        
            
byte[] receiveData = new byte[256];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);

Also der ServerSocket ist jetzt offen und Buffered alle eingehenden Daten sollange bis du receive Aufrufst!
 
J

JimmyJo1987

Gast
Aso in einem separaten Thread, ok daran habe ich nicht gedacht.
Werde das direkt mal versuchen.
 
J

JimmyJo1987

Gast
Hey hab das nun mal versucht so wie du es mir gepostet hast,
nur sagt er mir jetzt bei der Broadcast Adresse:

Address is already in use can not bind
 

Dit_

Bekanntes Mitglied
hatte mal so ähnliches Problem. Habe as mit einer Sendepause von 300ms(sleep()) gelöst. also senden,empfangen,pause,senden,empgangen, pause...
 

dayaftereh

Top Contributor
Hey, also bei mir Klappt es, schau mal mein Code an. Ich nutze nur ein Socket.
Java:
DatagramSocket socket = new DatagramSocket();
				
InetSocketAddress a = new InetSocketAddress("localhost", 10100);
byte[] buf = "Hallo".getBytes();
DatagramPacket p = new DatagramPacket(buf, buf.length, a);
socket.send(p);
						
buf = new byte[256];
DatagramPacket p2 = new DatagramPacket(buf, buf.length);
socket.receive(p2);
 
J

JimmJo1987

Gast
Hey,
herzlichen Dank an alle!!! nun klappt es soweit. Nur kann es auch sein, dass ich zum Beispiel zwei Geräte
habe die sich melden.
Mache ich nun zweimal receive und es ist nur ein Gerät da hängt er wieder.
Mache ich nur einmal receive kann es sein das eventuell andere Geräte übergangen werden.

Kann man abfragen ob noch was zum empfangen bereit ist?
 
J

JimmyJo198

Gast
Hey,
herzlichen Dank an alle!!! nun klappt es soweit. Nur kann es auch sein, dass ich zum Beispiel zwei Geräte
habe die sich melden.
Mache ich nun zweimal receive und es ist nur ein Gerät da hängt er wieder.
Mache ich nur einmal receive kann es sein das eventuell andere Geräte übergangen werden.

Kann man abfragen ob noch was zum empfangen bereit ist?

Habe Es jetzt mal vorher mit getLength() versucht Scheint zu gehen leider nur ein Testgerät da!

Java:
while (p2.getLength()==1024)
	{
	socket.receive(p2);
	JOptionPane.showMessageDialog(null, p2.getAddress());
					
}
 

dayaftereh

Top Contributor
Also eigentlich erzeugt man eine Thread der in einer Schleife läuft und die ganze zeit schau ob daten reihn kommen, wenn ja dann die daten vom socket lesen und dann wider auf daten warten! DIe eingelesenen daten können dann entweder direkt vom Thread verarbeitet werden oder man über gibt sie an einen anderen Thread(oder ThreadPool) der dann die daten weiter verarbeitet.
 

Ähnliche Java Themen


Oben