关于文件传输的UDP协议,麻烦谁给解释一下下面的位运算这段和通信协议有什么关系?谢谢try { 
            DatagramSocket reciveSocket = new DatagramSocket(); 
            byte[] buf = new byte[40 * 1024]; 
            DatagramPacket dp; 
             
            FileInputStream fis = new FileInputStream("F:/testImage.bmp"); 
            int readlen; 
            int index = 0; 
             
            InetAddress addr = InetAddress.getByName("127.0.0.1"); 
            while ((readlen = fis.read(buf, 18, 40 * 1024 - 18)) > 0) { 
                index++; 
                
                buf[10] = (byte) (index & 0xFF); 
                buf[11] = (byte) (index >>> 8 & 0xFF); 
                buf[12] = (byte) (index >>> 16 & 0xFF); 
                buf[13] = (byte) (index >>> 24 & 0xFF); 
                 
                buf[14] = (byte) (readlen & 0xFF); 
                buf[15] = (byte) (readlen >>> 8 & 0xFF); 
                buf[16] = (byte) (readlen >>> 16 & 0xFF); 
                buf[17] = (byte) (readlen >>> 24 & 0xFF); 
                dp = new DatagramPacket(buf, 40 * 1024, addr, 7774); 
                 
                reciveSocket.send(dp); 
                sleep(5); 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 

解决方案 »

  1.   

    我觉得这个绑定的是80端口 
    所以用  DatagramSocket socket = new DatagramSocket(80);
      while (true) {
        byte buffer[] = new byte[40 * 1024];;
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        socket.receive(packet);
        for (int i = 0; i < buffer.length; i++) {
    if (buffer[i] != 0) {
    System.out.println("   " + buffer[i]);
        }
      }
      

  2.   

    不是很理解啊,udp协议不是很了解
    我把我的问题完整的说下吧:
    主要实现基于UDP的文件传输,需要自己定义传输协议
    主协议:
    len0len1+cmd+pack0pack1+Data+VC(校验)
    说明:
    len0,len1是整个数据包长度(包括自身),len0位高字节,len1位低字节
    cmd 位命令码
    pack0,pack1表示该包数据在整个文件中拆解后的包号
    Data表示实际传输的数据
    vc表示校验,方法位从len0开始的到Data的最后一个字节,所有字节的异或和请问再发送端该如何定义,再接收端又该如何解析请各位指点指点,初次接触这个udp协议,谢谢
      

  3.   

    位运算是用来计算图片分为多个UDP报后每个分块的标志的,接收数据的程序通过读取buffer的10-17这8个字节就能判断这个包的顺序,从而重新组装出图片。
      

  4.   

    TreeMap<Integer, byte[]> results = new TreeMap<Integer, byte[]>();
    int totalSize = 0;
    FOR 每个UDP包 {
    byte[] recievedData = new byte[]{1,1,0,0};
    int seq = 0;
    for (int i = 0; i < recievedData.length; i++) {
    seq |= recievedData[i+10] << (8 * i);
    }
    int size = 0;
    for (int i = 0; i < recievedData.length; i++) {
    size |= recievedData[i+14] << (8 * i);
    }
    totalSize += size;
    byte[] realData = new byte[size];
    System.arraycopy(recievedData, 18, realData, 0, size);
    results.put(seq, realData);
    }
    byte[] data = new byte[totalSize];
    int index = 0;
    for (Iterator<Integer> it = results.keySet().iterator(); it.hasNext(); ) {
    int key = it.next();
    byte[] arr = results.get(key);
    System.arraycopy(data, index, arr, 0, arr.length);
    index += arr.length;
    }大概就这样
      

  5.   

    答:楼主的程序表达得很清楚了
    你的UDP包中内容是这样的:
    1)buf[10]~~buf[13]放的是该UDP包在整个文件中拆解后的包号(注意:以低字节在前,高字节在后的方式存放的包号)
    2)buf[14]~~buf[17]放的是该UDP包中数据的实际长度(注意:以低字节在前,高字节在后的方式存放的数据的实际长度)
    3)buf[18]开始是真正的数据....具体是多少数据,是由2)中的长度决定的.
    4)UDP包中的内容(即:1),2),3)中数据的含义)与UDP的通信是一点关系都没有的.说明:显然楼主对UDP的程序设计的实际经验有点儿注意不够.
    即:UDP的包大小(40K)太大了(虽然UDP包最大理论值是:64k-UDP头长-IP包头长),你很快公发现,这样做,UDP包丢失的可能性增大了.