2015-04-03 222 views
0

我正在研究一个简单的应用程序来演示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(); 
    } 
} 
+0

“似乎没有正确地复制到completeFile数组”,它在做什么呢? – 2015-04-03 23:44:10

+0

当我使用for循环并使用打印语句打印索引时,它只会打印出第一个索引然后崩溃。与system.arraycopy它只是在该行崩溃。 – user3657834 2015-04-04 00:17:10

+0

我通常会推荐使用NIO缓冲区,因为它们是专门为这种数据操作而设计的。 – chrylis 2015-04-04 00:30:54

回答

0

你不需要复制任何东西。您可以直接从用于构建DatagramPacket,的字节数组直接写入文件,并且可以将该字节数组直接传递给其他方法,以及来自数据包的长度。

+0

我不确定我关注。对不起 – user3657834 2015-04-04 00:18:08

+0

你不需要构建一个包含整个文件数据的巨大数组,并在最后写入它。您可以在循环前打开文件,每次循环时将接收到的数据写入文件,并在循环后关闭文件。基本上'fops.write(packet.getData(),packet.getOffset(),packet.getLength());' – EJP 2015-04-04 00:20:08

+0

哦很酷。谢谢 – user3657834 2015-04-04 01:34:48

相关问题