2016-06-25 33 views
1

我正在用Java編寫一個服務器。這裏是我的主線程代碼:Java Packets mess

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(); 
     } 
    } 
} 

一切似乎不錯,但是當我發送數據包的一些軟件(PacketSender),它開始變得怪異。這裏是我的控制檯:

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. 

所以它只覆蓋陣列上,我不得不讓它變大。

所以我想知道:

  • 我怎樣才能使分組數據被重置爲0手每次?
  • 我可以只是得到一個包的大小的數組,而不是這個奇怪的「傳遞數組作爲參數」的方法?
+0

在您的控制檯上市,目前還不清楚是實際的輸出,什麼是你的評析輸出。請重新格式化,將兩者分開。 –

回答

0

每次收到數據包時,DatagramPacket所使用的緩衝區都不會被清除。但是,方法getLength()會告訴您在當前數據包中接收了多少數據,並且您應該使用它來限制從緩衝區中提取的內容。對於示例:

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

如果長度是1,我應該對getLength做-1? – PearlSek

+0

不,如果長度爲1,則使用1.讀取'String(byte [] buffer,int offset,int length)'構造函數的定義。 –

0

receive Javadoc中記載:

數據報包對象的長度字段包含的 所接收的消息的長度。

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

相關問題