我的UDP Socket程序有问题。防火墙我并没有开。情况是这样的:
我这个程序是client端在本地读取一个文件abc.bmp并且放到byte[]流里。然后用DatagramPacket.setData(sendData,offset,size)方法来进行分包,传送到Server。在Server端接收并且显示收到了多少个包。
我不知道程序错在哪一快,每次Client发送的UDP包远远多于Server接收到的。
比如说一个文件是10000bytes,如果设置packet size是512bytes,那么应该被分成20个packet进行传送。但是在Server端却只收到了10个包而已~!!甚至是,文件越大,收到的包比例就越小。本来应该收到1000个包,结果只收到了400~!
有朋友能帮我改一下么?谢谢!下面是所有程序并附带了解释://UDPClient.java
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 = 2048;  
    byte[] sendData = new byte[filelength]; //set max data array size is 2048
    inFromFile.read(sendData);  //put file byte stream into data array    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
   }
    clientSocket.close(); //close datagramsocket
    }
}
//.
//.
//.
///UDPServer.java
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');
        }
    }
}

解决方案 »

  1.   

    有个地方我要更正一下,在UDPClient.java
    int filelength = 2048; 应该改成
    int filelength = (int)filename.length()*2; 
    //set max data array size as two times file's length
      

  2.   

    我用JB测试的,收到15个包,每个包大小512B,我看了一下测试图片,大小是7K,占用空间8K,大致是没出现数据丢失
      

  3.   

    to tramp73:
    你试试发送大于50个包,肯定server能收到的包就非常少了:(
      

  4.   

    UDP  - 用户数据报协议,是一种不可靠的连接协议,丢包现象很平常.