2016-06-25 13 views
1

私はJavaでサーバーをプログラミングしています。ここに私のメインスレッドのコードがあります:Javaパケットの混乱

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

それを列挙し、実際の出力が何であるかは不明であり、あなたのcommentonが出力するものです。 2つを明確に区別するために再フォーマットしてください。 –

答えて

0

DatagramPacketで使用されるバッファは、パケットが受信されるたびにクリアされません。しかし、方法getLength()は、現在のパケットでどれだけのデータが受信されたかを示しています。バッファから抽出するものを制限するには、その値を使用する必要があります。 receive javadocの文書化したよう

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

:あなたたとえば

データグラムパケットオブジェクトのlengthフィールドは 受信したメッセージの長さが含まれています。あなたのコンソールで

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