我的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');
}
}
}
我这个程序是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');
}
}
}
解决方案 »
- ibatis的between and的语句 怎么写啊,参数怎么传
- protected void doValidate(Errors errors, Object arg1, Object... arg2) {
- JFileChooser 使用的问题
- java调用自己写的win32程序debug目录下的exe失败
- socket多线程问题
- 请问如何进行图片格式转换bmp,jpg等
- 文件的问题
- 【江湖救急啊】**JEditPane显示html页面,怎么可以实现点击下载链接能够象在IE里那样可以下载(可以选择保存或运行)**up有分
- 50相送
- 用jdbc连接sybase数据库失败,大家看看怎么回事?
- 理行承诺,xuender(徐强) 来接分。
- 如何获得文件创建日期?
int filelength = 2048; 应该改成
int filelength = (int)filename.length()*2;
//set max data array size as two times file's length
你试试发送大于50个包,肯定server能收到的包就非常少了:(