我用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)
每次收到数据包时,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()));