2016-07-01 6 views
1

Ich stoße auf ein seltsames Problem beim Arbeiten mit UDP in Java. Setup: Mein Android-Gerät initialisiert die Kommunikation, es ist über WLAN verbunden. Mein Computer betreibt einen Server in Java (JRE: 1.8) und ist über Ethernet verbunden.Java UDP DatagramSocket empfängt kein DatagramPacket

Ich bin ein UDP-Paket von einem Android-Gerät auf dem Computer zu senden:

address = InetAddress.getByName("192.168.178.57"); 
packet = new DatagramPacket(data, data.length, address, 61010); 
socket.send(packet); 

Es gibt keine Ausnahme ausgelöst wird, während das Paket sendet. Nachdem geöffnet Wireshark auf meinem Computer, ich das UDP-Paket empfangen werden sehen:

Wireshark: UDP packet received

In meiner Server-Anwendung Ich versuche, dieses UDP-Paket zu empfangen:

address = InetAddress.getByName("192.168.178.57"); 
socket = new DatagramSocket(61010, address); 
byte[] receiveBuffer = new byte[4096]; 
System.out.println("listening on " + socket.getLocalAddress().getHostAddress() + ":" + socket.getLocalPort() + "..."); 
// => listening on 192.168.178.57:61010... 

packet = new DatagramPacket(receiveBuffer, receiveBuffer.length); 
socket.receive(packet); 
System.out.println("UDP message received"); 

aber es, wird nicht empfangen: UDP message received wird nie gedruckt.

[Bearbeiten]
Die Firewall konfiguriert werden, sollten die Pakete (ufw allow 61010/udp) zu ermöglichen. Es gibt keinen Sicherheitsmanager in Java, der das Paket löscht (System.getSecurityManager() ist null). Aber wenn ich das UDP-Paket über die Server-Anwendung anstelle des Android-Geräts sende, wird es empfangen.
[/ edit]

Ich bin mir ziemlich sicher, dass dieser Code vor ein paar Monaten gearbeitet, und dass ich nicht zwischendurch auf es funktioniert.

Was vermisse ich, irgendwelche Ideen?

+1

Überprüfen Sie die Firewallkonfiguration auf dem Servercomputer. Es ist plausibel, dass die Pakete gelöscht werden, nachdem sie von Wireshark protokolliert wurden. –

+0

Soweit ich das beurteilen kann, gibt es keine Regel, die zu diesem Verhalten führen würde. Jetzt habe ich explizit erlaubt UDP-Kommunikation auf diesem Port über 'sudo ufw erlauben 61010/udp', ohne Wirkung. –

+0

Auf der Serverseite ist es oft vorzuziehen, an eine Platzhalteradresse zu binden, sodass der Server seine eigene Adresse nicht kennen oder bestimmen muss. Sie können dies erreichen, indem Sie den 'DatagramSocket'-Konstruktor verwenden, der nur den Port als Argument akzeptiert. –

Antwort

0

Dank @John Bollinger hatte ich einen zweiten und dritten Blick auf die Firewall-Einrichtung. Tatsächlich verursachte die Firewall dieses Problem.

Explizit erlaubte den bestimmten Port über ufw allow <port>/udp offenbar war nicht genug, um Regel zu umgehen, die externe UDP-Pakete blockiert hat.

Nach resetting the iptables rules kann die Android App jetzt wieder mit meiner Serveranwendung kommunizieren.

Vielen Dank für Ihre Eingabe!

Verwandte Themen