请教关于UDP SOCKET丢包的问题

LW1981 2005-11-27 11:00:13
我在client端传了100个包,结果在server端却显示只收到了64个包。
请问这个可能么?虽然UDP协议就是容易丢包。。。能避免么?毕竟掉的太多了。。。
谢谢~!
...全文
258 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
LW1981 2005-11-27
  • 打赏
  • 举报
回复
我也觉得是我的程序问题。放火枪我并没有开。
我这个程序是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
}
}
}
gemouzhi 2005-11-27
  • 打赏
  • 举报
回复
是你的程序或防火墙的问题,UDP绝对不可能丢到这地步
skycncomp 2005-11-27
  • 打赏
  • 举报
回复
如果想避免,个人觉得只能用tcp来做。

62,626

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧