接收/发送数据报套接字数据
问题描述:
所以我正在做一个Java程序,通过DatagramSocket和DatagramPacket的帮助发送和接收数据。问题是,什么地方,当我发送数据/接收它之间 - 的数据变成了要在节目中我要送它也不同,但只在某些情况下是这样的:接收/发送数据报套接字数据
Sending: 378 Receiving: 3786
Sending: 374 Receiving: 3742
Sending: 360 Receiving: 3604
但作品有时,在这样的情况:
Sending: 376 Receiving: 376
Sending: 372 Receiving: 372
Sending: 344 Receiving: 344
我送两个坐标,先将其转换为字符串:
String message = Integer.toString(coord1) + " " + Integer.toString(coord2);
然后字符串转换为字节数组能够发送它与一个DatagramPacket类:
byte[] b = message.getBytes(Charset.forName("UTF-8"));
DatagramPacket packet = new DatagramPacket(b, b.length, remoteHost, remotePort);
try {
datagramSocket.send(packet);
} catch(Exception e) {
e.printStackTrace();
}
这是我的线程接收数据:
private DatagramSocket dSocket;
private DatagramPacket packet;
private byte[] buffer;
private PaintProgram prog;
public ReceiverThread(int myPort, PaintProgram prog) {
this.prog = prog;
try {
buffer = new byte[256];
dSocket = new DatagramSocket(myPort);
packet = new DatagramPacket(buffer, buffer.length);
} catch(Exception e) {
e.printStackTrace();
}
this.start();
}
@Override
public void run(){
do{
try {
dSocket.receive(packet);
String data = new String(buffer, "UTF-8");
prog.handlePacket(data);
} catch(IOException e) {
e.printStackTrace();
}
}
while(!this.currentThread().isInterrupted());
}
这是我的方法 “处理” 这是收到的数据包:
String[] xy = data.split(" ");
Point point = new Point(Integer.parseInt(xy[0].trim()), Integer.parseInt(xy[1].trim()));
然后,添加用我的程序的两个坐标创建的点。我不知道在这个过程中哪里出了问题。用一些新的视角会很酷!谢谢。
答
String data = new String(buffer, "UTF-8");
这应该是
String data = new Strung(packet.getData(), packet.getOffset(), packet.getLength(), "UTF-8");
+0
非常感谢! :) – Lemaru 2014-10-08 17:52:31
虽然我不知道答案,但Wireshark是一个程序,如果你正在开发自己的网络协议,它是必不可少的,它应该帮助你诊断这个问题太。 – biziclop 2014-10-08 17:00:03
似乎你需要考虑你收到的数据的长度。作为'DatagramSocket#receive(DatagramPacket)'状态的javadoc _数据报包对象的长度字段包含接收到的消息的长度_ – 2014-10-08 17:16:08