最近在使用UDP传输的时候,接受方总是出现字符丢失,出现乱码.
请教解决方法.谢谢~

解决方案 »

  1.   

    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());

    }
    }
    catch (IOException ex) {
    ex.printStackTrace();
    }
    }
      

  2.   

    public void CreatUDP() {
    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();
    }


    }
      

  3.   

    received = new String(data, 0, data.length); 
    答:改为:
    received = new String(data,receivePacket.getOffset() , receivePacket.getLength()); 
      

  4.   

    既然想不出现字符丢失,为何不用TCP。字符丢失,可能是因为你的发送包,之间的间隔太短了。
      

  5.   

    呵呵
    这个貌似就是就是一次性发过去了udp传输本来就有它的不可靠性
    lz不要期望过高啊我是一直在用tcp了
      

  6.   

    我也在尝试改成TCP的,对,我同意6楼的意见,是因为间隔太小,会出现丢包现象。
    问什么丢报的现象都出现在汉字符上,传输英文不会出现。
      

  7.   

    数据发送方使用String.getBytes()将字符串转换为byte数组,
    接收方用new String()将byte数组转换回来,但前提是两个转换都用一种编码格式。
    其实getBytes和new String方法都有一个参数encoding,若没有指定,则使用系统默认的编码。
    看看是否发送方和接收方的默认编码不一样,导致在转换的过程中中文的编码格式不一致。
      

  8.   

    嗯   这个我晓得      我想了一下还是用UDP     我写的是聊天程序,我并不能要求用户必须在建立连接后在进行聊天,我想UDP会帮我解决好这个问题,大家帮着出出主意,怎么才能解决好丢包的问题~
      

  9.   

    UDP 并没有检测机制,不能完全避免丢包。实际上局域网里面通信,没有断网的情况下,丢包几乎是不可能发生的。你那个乱码不是因为丢包,而是因为把多字节字符拆开了。你怎么拆的代码没贴出来,但我猜应该是这样。PS:楼主我教你怎么贴代码:
    1、将代码作良好的格式化,以方便读者。
    2、在发帖文本框的上方单击字体颜色右边的按钮,选择 Java
    3、将代码粘贴到【code=Java】和【/code】之间。就会得到下面的效果:public class Hello {    public static void main(String[] args) {
            System.out.println("Hello!");
        }
    }
      

  10.   

    UDP丢包是在所难免的,局域网里可能表现不是那么明显
    所以要建立一种重传机制,在每个包头描述包的一些信息,然后验证是否丢包,丢的哪个包,再去收那个包
    这个在tcp里,默认已经给你实现了,在UDP里要自己去实现,这样才能做出一个比较健壮的UDP程序
    再一个,分包大小最大不要超过1472字节,否则丢包情况更严重