0
所以我正在做一個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()));
然後,添加用我的程序的兩個座標創建的點。我不知道在這個過程中哪裏出了問題。用一些新的視角會很酷!謝謝。
雖然我不知道答案,但Wireshark是一個程序,如果你正在開發自己的網絡協議,它是必不可少的,它應該幫助你診斷這個問題太。 – biziclop 2014-10-08 17:00:03
似乎你需要考慮你收到的數據的長度。作爲'DatagramSocket#receive(DatagramPacket)'狀態的javadoc _數據報包對象的長度字段包含接收到的消息的長度_ – 2014-10-08 17:16:08