【发布时间】:2015-06-09 01:43:52
【问题描述】:
我正在开发一个简单的应用程序来演示 P2P 文件传输。应用程序获取一个文件,并发送数据包大小的数据块。接收者等待这些块到达。它假设不断地将传入的字节数组添加到一个更大的字节数组中,一旦所有字节都到达,该数组稍后将成为完整的文件。这是假设没有丢包。为了调试,我一直在尝试传输一个小的 txt 文件。我尝试使用 for 循环,现在使用 System.arraycopy,但 packetData 的字节数组似乎没有正确复制到 completeFile 数组。
public void run() {
try {
byte[] completeFile = new byte[fileSize];//will become the complete file when all bytes have arrived
receivingSocket = new DatagramSocket(49000);
while (bytesReceived<fileSize) {
System.out.println("@@@ Receiver waiting for packet");
byte[] buf = new byte[1500]; // Actual Ethernet packet size is 1500 bytes
// receive request
DatagramPacket packet = new DatagramPacket(buf, buf.length);
receivingSocket.receive(packet);
byte[] packetData = Arrays.copyOf(packet.getData(), packet.getLength());
deliverData(packetData);
if(headerReceived && packetsReceived>1)
{
//add incoming bytes to the completeFile
System.arraycopy(packetData, 0, completeFile, bytesReceived, packetData.length);
bytesReceived = bytesReceived + packetData.length;
}
}
FileOutputStream fops = new FileOutputStream("D:\\Desktop\\testing2"+fileExtension);
System.out.println("@@@ BUILDING FILE");
fops.write(completeFile);
fops.close();
} catch (Exception e) {
System.out.println("@@@ SOMETHING WENT WRONG!!!!!!!!!!!!!!");
stopListening();
}
}
【问题讨论】:
-
“似乎没有正确复制到 completeFile 数组”它在做什么呢?
-
好吧,当我使用 for 循环并使用打印语句打印出索引时,它只会打印出第一个索引然后崩溃。使用 system.arraycopy 它只是在那一行崩溃。
-
我通常建议为此使用 NIO 缓冲区,因为它们是专门为这种数据操作而设计的。
标签: java udp bytearray p2p fileoutputstream