public void run(){ try{ while(true){ for (int x = 0; x < 512; x++) array[x] = ' '; receivePacket = new DatagramPacket(array, array.length); receiveSocket.receive(receivePacket); byte[] data = receivePacket.getData(); received = new String(data, 0, data.length); Date today = new Date(); displayArea.append("\n"+" "+today.getHours()+":"+today.getMinutes()+":"+today.getSeconds()+":\n "+received.trim());
try{
while(true){
for (int x = 0; x < 512; x++)
array[x] = ' ';
receivePacket = new DatagramPacket(array, array.length);
receiveSocket.receive(receivePacket);
byte[] data = receivePacket.getData();
received = new String(data, 0, data.length);
Date today = new Date();
displayArea.append("\n"+" "+today.getHours()+":"+today.getMinutes()+":"+today.getSeconds()+":\n "+received.trim());
}
}
catch (IOException ex) {
ex.printStackTrace();
}
}
try {
sendSocket = new DatagramSocket();
receiveSocket = new DatagramSocket(udpPORT);
System.out.println("udp ok");
} catch (SocketException se) {
se.printStackTrace();
System.out.println("false udp");
}
}
public Chat(String jicq){//prepareSplash();startSplash();
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
ip=jicq;
jbInit();
CreatUDP();
thread=new Thread(this);
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
}
答:改为:
received = new String(data,receivePacket.getOffset() , receivePacket.getLength());
这个貌似就是就是一次性发过去了udp传输本来就有它的不可靠性
lz不要期望过高啊我是一直在用tcp了
问什么丢报的现象都出现在汉字符上,传输英文不会出现。
接收方用new String()将byte数组转换回来,但前提是两个转换都用一种编码格式。
其实getBytes和new String方法都有一个参数encoding,若没有指定,则使用系统默认的编码。
看看是否发送方和接收方的默认编码不一样,导致在转换的过程中中文的编码格式不一致。
1、将代码作良好的格式化,以方便读者。
2、在发帖文本框的上方单击字体颜色右边的按钮,选择 Java
3、将代码粘贴到【code=Java】和【/code】之间。就会得到下面的效果:public class Hello { public static void main(String[] args) {
System.out.println("Hello!");
}
}
所以要建立一种重传机制,在每个包头描述包的一些信息,然后验证是否丢包,丢的哪个包,再去收那个包
这个在tcp里,默认已经给你实现了,在UDP里要自己去实现,这样才能做出一个比较健壮的UDP程序
再一个,分包大小最大不要超过1472字节,否则丢包情况更严重