Java数据包一团糟

时间:2016-06-25 16:17:47

标签: 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次?
  • 我可以只获取数据包大小的数组,而不是这个奇怪的“将数组作为参数传递”方法吗?

2 个答案:

答案 0 :(得分:0)

每次收到数据包时,DatagramPacket使用的缓冲区都不会被清除。但是,方法getLength()告诉您当前数据包中收到了多少数据,您应该使用它来限制从缓冲区中提取的内容。以你的例子:

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

答案 1 :(得分:0)

receive javadoc:

中所述
  

数据报包对象的长度字段包含长度   收到的消息。

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