2012-05-20 75 views
0

我试图创建一个TFTP服务器,但当它收到一个文件似乎并不是所有的都保存到服务器上(有些字节丢失)。该文件创建正常,大部分数据被写入,但由于文件不完整,它被归类为腐败和无法打开。有谁知道如何解决这个问题?BufferedOutputStream不写入所有文件

主类

  WRQ WRQ = new WRQ(); 
      ACK ACK = new ACK(); 
      DatagramPacket outPacket; 
      BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(filename)); 
      byte[] bytes; 
      byte[] fileOut; 
      outPacket = WRQ.firstPacket(packet); 
      socket.send(outPacket); 

      socket.receive(packet); 

      while (packet.getLength() == 516){ 

      bytes = WRQ.doWRQ(packet); 
      bufferedOutput.write(bytes); 

      outPacket = ACK.doACK(packet); 
      socket.send(outPacket); 

      socket.receive(packet); 

      } 

      bytes = WRQ.doWRQ(packet); 
      bufferedOutput.write(bytes); 

      bufferedOutput.close(); 

      outPacket = ACK.doACK(packet); 
      socket.send(outPacket); 

WRQ类

public class WRQ { 

public DatagramPacket firstPacket(DatagramPacket packet) throws IOException{ 

    ACK ACK = new ACK(); 
    DatagramPacket ACKpacket = ACK.doACK(packet); 

    //takes ACK packet and sets block # as 0 to signal that this is the first packet in a WRQ 
    byte[] ACKcontents = new byte[3]; 
    ACKcontents = ACKpacket.getData(); 
    ACKcontents[2] = 0; 
    ACKcontents[3] = 0; 
    ACKpacket.setData(ACKcontents); 

    return ACKpacket; 

} 

public byte[] doWRQ(DatagramPacket packet){ 

    int length = packet.getLength(); 
    byte[] packetData = packet.getData(); 
    byte[] data = new byte[length - 4]; 
    data = Arrays.copyOfRange(packetData, 4, length - 4); 

    return data; 

} 

} 
+0

您可以编辑您的上一个问题。 –

+0

感谢您的帮助。下次我会记住这一点。你能帮助解决这个问题吗? – DMo

+1

问题可能出在您没有向我们显示的代码中。例如WRQ.doWRQ()方法。尝试记录在客户端上发送的字节,并写入服务器上的文件,并对它们进行比较。 –

回答

1

这个代码看起来非常可疑对我说:

byte[] packetData = packet.getData(); 
byte[] data = new byte[length - 4]; 
data = Arrays.copyOfRange(packetData, 4, length - 4); 

你的输出数组(数据)的长度为length - 4,但你只复制length - 8字节。如果在分组数据忽略字节是第一个4个字节,它应该是

data = Arrays.copyOfRange(packetData, 4, length); 

因为最后一个参数是不是一个长度,但to索引(不包括)。详情请见the javadoc

+0

谢谢,我只是想到了这一点,但事实上这是问题所在。我在想这是一个长度的争论。 – DMo