2016-06-25 8 views
1

Ich programmiere einen Server in Java. Hier ist mein Haupt-Thread-Code:Java-Pakete Chaos

public class EntryThread extends Thread { 

    volatile byte[] toSend; 

    public EntryThread() { 

    } 

    public void TreatRequest(byte[] data, InetAddress IPAddress) 
    { 
     try { 
      switch (data[0]) 
      { 
       case 0: // ping 
        toSend = new byte[] { (byte) 255, data[1], (byte) 255}; 
        Server.serverSocket.send(new DatagramPacket(toSend, 3, IPAddress, 17550)); 
        break; 
       case 2: 
        break; 
      } 
     } catch (Exception e) 
     { 
      System.out.println("Exception because of a packet malformation issue. You can ignore it."); 
      e.printStackTrace(); 
     } 
    } 

    public void run() { 
     Runtime.getRuntime().addShutdownHook(new Thread(){public void run(){ 
      try { 
       Server.serverSocket.close(); 
       System.out.println("The server is shut down!"); 
      } catch (Exception e) { /* failed */ } 
     }}); 

     try { 
      Server.serverSocket = new DatagramSocket(Configuration.port); 

      byte[] receiveData = new byte[512]; 

      DatagramPacket receivePacket = new DatagramPacket(receiveData, 
           receiveData.length); 
      while(true) { 
       Server.serverSocket.receive(receivePacket); 
       byte[] data = receivePacket.getData(); 
       System.out.println("RECEIVED: " + new String(data)); 
       InetAddress IPAddress = receivePacket.getAddress(); 

       /* 
       * data[0] : command/255 if 
       * data[1] : C-ID. 
       * data[2] : arguments/content 
       */ 

       TreatRequest(data, IPAddress); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Alles scheint gut, aber wenn ich ein paar Päckchen mit einiger Software (PacketSender) senden, es fängt an zu seltsam worden. Hier ist meine Konsole:

RECEIVED: [][][][][][]... // I sent 00 in hex, no problem there) 
RECEIVED: ÿ[]ÿ[][][][]... // here's the response of the server) 
RECEIVED: [][]ÿ[][][][]... // this ÿ is still there even if I just sent 00 in hex. 

So es nur auf einem Array überschreibt ich bin gezwungen, es groß zu machen.

Also ich würde gerne wissen:

  • Wie kann ich das Paket Datum machen jedes Mal zurückgesetzt viele 0s werden?
  • Kann ich nur ein Array der Größe des Pakets erhalten, anstatt dieser seltsamen "Pass das Array als Argument" -Methode?
+0

Sie auf der Konsole aufzulisten es unklar ist, was die tatsächliche Leistung ist und was Ihre commenton die Ausgabe. Bitte umformatieren, um die beiden klar zu trennen. –

Antwort

0

Der von DatagramPacket verwendete Puffer wird nicht jedes Mal gelöscht, wenn ein Paket empfangen wird. Die Methode getLength() teilt Ihnen jedoch mit, wie viele Daten im aktuellen Paket empfangen wurden, und Sie sollten diese verwenden, um zu begrenzen, was Sie aus dem Puffer extrahieren. Für Ihr Beispiel:

System.out.println("RECEIVED: " + new String(data,0,receivePacket.getLength())); 
+0

Wenn die Länge 1 ist, sollte ich eine -1 zur getLength tun? – PearlSek

+0

Nein, wenn die Länge 1 ist, verwenden Sie 1. Lesen Sie die Definition des Konstruktors 'String (Byte [] Puffer, int Offset, int Länge)'. –

0

Wie in dem receive javadoc dokumentiert:

Das Längenfeld des Datagramms Paket Objekts enthält die Länge des die empfangene Nachricht.

System.out.println("RECEIVED: " + new String(data, 0, receivePacket.getLength()));

Verwandte Themen