我正在尝试通过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();
}
}
}
答案 0 :(得分:2)
如果最后一个数据包大小小于我们正在读取的字节数组的大小,那么前一个数据包的冗余数据将被附加到它。
没有。问题是来自第一个数据包的字节仍然包含在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();
}
}
}