我想通过UDP将数据包从客户端发送到服务器。我面临的问题是,如果最后一个数据包大小小于我们正在读取的字节数组的大小,那么来自先前数据包的冗余数据将被附加到它。我试着只将最后一个数据包的正确部分复制到一个新的字节数组中,然后发送它,但客户端以某种方式发送错误的数据包。请任何人都可以指出我做错了什么。提前致谢。UDP客户端服务器文件传输
Client.java:
class client
{
static int serverPort;
static String filename;
public static void main(String args[]) throws SocketException, IOException
{
int count=0;
int MAX_SIZE = 1048;
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IpAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[MAX_SIZE];
String filePath = "C:\\in.txt";
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
int totLength = 0;
while((count = fis.read(sendData)) != -1) //calculate total length of file
{
totLength += count;
}
System.out.println("Total Length :" + totLength);
int noOfPackets = totLength/MAX_SIZE;
System.out.println("No of packets : " + noOfPackets);
int off = noOfPackets * MAX_SIZE; //calculate offset. it total length of file is 1048 and array size is 1000 den starting position of last packet is 1001. this value is stored in off.
int lastPackLen = totLength - off;
System.out.println("\nLast packet Length : " + lastPackLen);
byte[] lastPack = new byte[lastPackLen-1]; //create new array without redundant information
fis.close();
FileInputStream fis1 = new FileInputStream(file);
//while((count = fis1.read(sendData)) != -1 && (noOfPackets!=0))
while((count = fis1.read(sendData)) != -1)
{
if(noOfPackets<=0)
break;
System.out.println(new String(sendData));
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IpAddress, 9876);
clientSocket.send(sendPacket);
System.out.println("========");
System.out.println("last pack sent" + sendPacket);
noOfPackets--;
}
//check
System.out.println("\nlast packet\n");
System.out.println(new String(sendData));
lastPack = Arrays.copyOf(sendData, lastPackLen);
System.out.println("\nActual last packet\n");
System.out.println(new String(lastPack));
//send the correct packet now. but this packet is not being send.
DatagramPacket sendPacket1 = new DatagramPacket(lastPack, lastPack.length, IpAddress, 9876);
clientSocket.send(sendPacket1);
System.out.println("last pack sent" + sendPacket1);
}
}
Server.java:
import java.io.*;
import .*;
class server
{
public static void main(String args[]) throws IOException
{
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] recData = new byte[1024];
int i =0;
FileWriter file = new FileWriter("C:\\Users\\ayushi\\Documents\\Semester 2\\Misc\\setups\\eclipse\\ip_1\\ip_second\\src\\out.txt");
PrintWriter out = new PrintWriter(file);
//BufferedOutputStream bos = new BufferedOutputStream(fos);
while(true)
{
//PrintWriter out = new PrintWriter(file);
DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
serverSocket.receive(recPacket);
String line = new String(recPacket.getData());
System.out.println("\n Data: " + line);
out.println(line);
System.out.println("\nPacket" + ++i + " written to file\n");
out.flush();
}
}
}