gpt4 book ai didi

java - UDP客户端服务器文件传输

转载 作者:行者123 更新时间:2023-12-02 05:55:07 25 4
gpt4 key购买 nike

我正在尝试通过 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 java.net.*;

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();
}
}
}

最佳答案

if the last packet size is less than the size of the byte array in which we are reading, then redundant data from previous packet is being appended to it.

没有。问题在于第一个数据包中的字节仍然包含在 recData 字节数组中。随后的读取会用第二个数据包的内容覆盖字节数组的开头,但数组的其余部分仍然填充第一个数据包中的数据。

根本问题是您忽略了收到的实际字节数。您还应该使用 FileOutputStream,而不是 Writer。试试这个:

class Server
{
public static void main(String args[]) throws IOException
{
...

while(true)
{
DatagramPacket recPacket = new DatagramPacket(recData, recData.length);
serverSocket.receive(recPacket);
System.out.println("\n Packet length: " + recPacket.getLength());
out.write((recPacket.getData(), 0, recPacket.getLength());
System.out.println("\nPacket" + ++i + " written to file\n");
out.flush();
}
}
}

关于java - UDP客户端服务器文件传输,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23177351/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com