我在client端传了100个包,结果在server端却显示只收到了64个包。
请问这个可能么?虽然UDP协议就是容易丢包能避免么?毕竟掉的太多了
谢谢~!

解决方案 »

  1.   

    如果想避免,个人觉得只能用tcp来做。
      

  2.   

    是你的程序或防火墙的问题,UDP绝对不可能丢到这地步
      

  3.   

    我也觉得是我的程序问题。放火枪我并没有开。
    我这个程序是client端在本地读取一个文件abc.bmp并且放到byte[]流里。然后用DatagramPacket.setData(sendData,offset,size)方法来进行分包,传送到Server。在Server端接收并且显示收到了多少个包。
    我不知道程序错在哪一快,每次Client发送的UDP包远远多于Server接收到的。有朋友能帮我改一下么?谢谢!下面是所有程序并附带了解释://Client
    import java.io.*;
    import java.net.*;
    import java.util.Date;public class UDPClient {
        public static void main(String [] args) throws Exception {    byte[] ip={(byte)127,(byte)0,(byte)0,(byte)1};  
        InetAddress serverIPAddress = InetAddress.getByAddress(ip); //set server's IP address
        int serverPort = 9876;  //set server's port    DatagramSocket clientSocket = new DatagramSocket(); //create datagramsocket    File filename = new File("c:\\abc.bmp");  //set file with path
        System.out.println("File Name: " + filename.getName() + '\n');
        System.out.println("File Length: " + filename.length() + " (bytes)" + '\n');    FileInputStream fileinputstream = new FileInputStream(filename);  
        //obtains input bytes from chosen file in a file system.
        BufferedInputStream inFromFile = new BufferedInputStream(fileinputstream);
        //create an internal buffer array
        int filelength = (int)filename.length()*2;  
        byte[] sendData = new byte[filelength]; //set max data array size as two times file's length
        inFromFile.read(sendData);  //put file byte stream into data array    Date d1 = new Date(); //get date before sending the first packet    int size = 512; //set packet size
        for(int offset=0; offset<filename.length(); offset=offset+size){ //loop, for sending packet
        DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIPAddress, serverPort);  //create datagram
        sendPacket.setData(sendData,offset,size); //set data range of a packet and offset
        clientSocket.send(sendPacket); //send data to client
       }    Date d2 = new Date(); //get date after sending the last packet
        long transferTime = d2.getTime()-d1.getTime(); //get transfer time
        System.out.print("Start Time: " + d1.getTime() + " (ms)" + '\n');
        System.out.print("Sending Packet Size: " + size + " (bytes)" + '\n');
        System.out.print("End Time: " + d2.getTime() + " (ms)" + '\n');
        System.out.print("Transfer Time: " + transferTime + " (ms)");    clientSocket.close(); //close datagramsocket
        }
    }
    //.
    //.
    //.
    ///Server
    import java.io.*;
    import java.net.*;public class UDPServer {    public static void main(String[] args) throws Exception{
            int serverPort = 9876;  //set server's port as 9876.
            DatagramSocket serverSocket = new DatagramSocket(serverPort);  //create a datagramsocket
            byte[] receiveData = new byte[2048];  //the max single packet size is 2048            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                //set DatagramPacket
        int i=0;
            while(true){
                serverSocket.receive(receivePacket); //receive packet from client
        i=i+1;
        System.out.println("The Number: " + i + " packet has been received" + '\n');
        //the file has been divided by number of packets to transfer
        System.out.println("Received Packet size: " + receivePacket.getLength() + '\n');            InetAddress IPAddress = receivePacket.getAddress(); // get client's IP
                int port = receivePacket.getPort(); // get client's port
            }
        }
    }