UDP 本来就是不可靠的协议, 你需要可靠,使用 TCP 了

解决方案 »

  1.   

    本人写的测试程序,大家看看有没有可以优化的。发送端:
    String strServer = textServer.getText();
          InetAddress target = InetAddress.getByName(strServer);
          //得到目标机器的地址实例
          int nPort = Integer.parseInt(textPort.getText());      long lInterval =Long.parseLong(textInterval.getText());
          int nTimes = Integer.parseInt(textTimes.getText());
          DatagramSocket ds = new DatagramSocket(nPort);
          //从端口发送数据报
          String strContent = textContent.getText();
          //要发送的数据
          //byte[] buf = strContent.getBytes();
          byte[] buf = new byte[1024*8];//一个包8K
                //将数据转换成Byte类型
          DatagramPacket op = new DatagramPacket(buf, buf.length, target, nPort);
          //将BUF缓冲区中的数据打包
          int i = 0;
          for(i = 0; i < nTimes; i++){
            ds.send(op);
            Thread.sleep(lInterval);      }
          //发送数据
          ds.close();
          //关闭连接
              }
        catch (Exception ex) {
          labInfo.setText(ex.getMessage());
        }
      }接收端:
    byte[] buf = new byte[1024*10];
        int i = 0;    long lBegin = 0;
        int nPackNum = Integer.parseInt(textPackNum.getText());
        try {
          int nPort = Integer.parseInt(textPort.getText());
          DatagramSocket ds = new DatagramSocket(nPort);      DatagramPacket ip = new DatagramPacket(buf, buf.length);
          //创建接收数据报的实例      ds.setSoTimeout(30000);      
          while (true)
          {
            
            ds.receive(ip);
            if(i == 1){
              lBegin = System.currentTimeMillis();
            }
            i++;
            //阻塞,直到收到数据报后将数据装入IP中
            //labInfo.setText((new String(buf)) + i);
            if(i == nPackNum) break;
          }       labInfo.setText("共接收包[" + i + "]个,时长:["+ (System.currentTimeMillis() - lBegin) +"]");
        }
        catch (Exception ex) {
          labInfo.setText(ex.getMessage() + "[" + i + "]" + (System.currentTimeMillis() - lBegin));    }
      

  2.   

    UDP协议本身是不可靠传输,如果需要可靠传输,可以考虑自己作包检测重发。
      

  3.   

    在局域网上,其实如果网络比较好,丢包发生少, TCP 的速度也不会比 UDP 慢多少的.而且局域网的带宽那么大, 对于 TCP 产生的附加字节,根本就可以忽略不计
      

  4.   

    这样测出来,java每秒只能发1000个4K的包左右,而且丢包也挺严重的,远不及c语言的,有那位高手来发表一下意见。
      

  5.   

    看一下下面这里方法有没有帮助。
    DatagramSocket.setTrafficClass()