2016-09-25 1 views
-1

Ich versuche, ein Multiplayer-Formular zu einem einfachen Pong-Spiel hinzuzufügen, aber wenn ich versuche, DatagramPacket zu starten und versuchen, die IP-Adresse und Port zu lesen, heißt die IP null und der Port ist -1. Weiß jemand, warum es das tun würde? Ich dachte, vielleicht lag es daran, dass die Steckdose das Paket noch nicht erhalten hatte, aber als ich es sah, sah ich, dass der gesamte Code nach socket.recieve(packet) nicht lief.Keine Adresse in DatagramPacket

-Code, wo ich den Server zu starten:

public GameServer(PongEngine engine) { 
    this.engine = engine; 
    try { 
     this.socket = new DatagramSocket(4269); 
    } catch (SocketException e) { 
     e.printStackTrace(); 
    } 
} 

public void run() { 
    while(true) { 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 
     System.out.println(packet.getAddress() + ":" + packet.getPort()); 
     try { 
      socket.receive(packet); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     String message = new String(packet.getData()); 
     if(message.trim().equalsIgnoreCase("ping")) { 
      System.out.println("CLIENT[" + packet.getAddress() + ":" + packet.getPort() + "] > " + message); 
      sendData("pong".getBytes(), packet.getAddress(), packet.getPort()); 
     } 
    } 
} 
+1

Ihr erster Gedanke war richtig. Die IP- und Port-Werte werden erst nach dem Aufruf der Empfangsfunktion aufgefüllt. Wenn der Code nach diesem Punkt nicht ausgeführt wird, wird entweder eine Ausnahme ausgelöst oder es wird einfach keine Verbindung hergestellt. Der Empfänger wird blockieren, bis er ein Paket erhält. – ccarton

+0

Ich führe den Client und den Server korrekt aus, soweit ich weiß. Hier ist mein Klient: http://pastebin.com/2zMdgNVP. Siehst du irgendwelche Probleme? – TheGamerPlayz

Antwort

1

zu Robert Antwort hinzuzufügen, ist Ihr Code einfach in der falschen Reihenfolge. Sobald Sie das behoben haben, können Sie sich damit befassen, warum Sie möglicherweise kein Paket von einem anderen PC erhalten, wie es ccarton vorgeschlagen hat.

Versuchen Sie dieses, und beachten Sie die beiden Kommentare

public void run() { 
    while(true) { 
     byte[] data = new byte[1024]; 
     DatagramPacket packet = new DatagramPacket(data, data.length); 

     try { 
      //Wait for packet (The code will not move on until a packet is received or there is an error) 
      System.out.println("Waiting for packet"); 
      socket.receive(packet); 

      //Move your socket/port info after receiving a packet so you don't get null or -1 
      System.out.println("Packet received: "+ packet.getAddress() + ":" + packet.getPort()); 

      //Move your code inside try, rather than after 
      String message = new String(packet.getData()); 
      if(message.trim().equalsIgnoreCase("ping")) { 
       System.out.println("CLIENT[" + packet.getAddress() + ":" + packet.getPort() + "] > " + message); 
       sendData("pong".getBytes(), packet.getAddress(), packet.getPort()); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Jetzt haben Sie immer noch die gleichen Probleme bekommen?

2

DatagramPacket 's getAddress gibt die IP-Adresse der Maschine zurück, an die dieses Datagramm gesendet wird oder von der das Datagramm empfangen wurde.

In der ersten System.out.println haben Sie gerade das Objekt erstellt, aber keine Netzwerk-I/O damit gemacht.

Dann ignorieren Sie die Ausnahme und versuchen einfach, mit dem Datagramm zu arbeiten. Wenn ein E/A-Fehler aufgetreten ist, ist es wahrscheinlich, dass das Datagramm nicht initialisiert wurde und daher immer noch die IP-Adresse null und Port -1 hat.

Wenn nichts passiert nach socket.receive() würde ich annehmen, dass der Anruf blockiert ist, warten auf ein Paket zu kommen. Führen Sie tatsächlich den Client, der mit Ihrem Server-Code verbindet?

Verwandte Themen