Java读取文件并通过DatagramSocket发送

时间:2018-10-12 14:58:24

标签: java

使用Java,我正在尝试通过DatagramSocket发送一些文件数据。我需要读取1000字节的文件块并将其作为数据包发送出去。我的代码:

  1. 将文件读入包裹在字节缓冲区中的字节数组
  2. 将数据放入数据包并发送
  3. 让接收者打开数据包并将内容重新写入新文件。

我在将字节数组写回到文件时遇到问题。请在下面查看我的代码。

客户/发件人:

byte[] data = new byte[1000];
ByteBuffer b = ByteBuffer.wrap(data);
DatagramPacket pkt;
File file = new File(sourceFile);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
CRC32 crc = new CRC32();

while(true){
    b.clear();
    b.putLong(0); // I need to put the checksum at the beginning for easy retrieval
    bytesRead = bis.read(data);
    if(bytesRead==-1) { break; }
    crc.reset();
    crc.update(data, 8, data.length-8);
    long chksum = crc.getValue();
    b.rewind();
    b.putLong(chksum);
    pkt = new DatagramPacket(data, 1000, addr); // addr is valid, works fine
    sk.send(pkt);
}

bis.close();
fis.close();

服务器/接收器:

DatagramSocket sk = new DatagramSocket(port);

File destfile = new File("hello.txt");
FileOutputStream fos = new FileOutputStream(destfile);
BufferedOutputStream bos = new BufferedOutputStream(fos);
PrintStream ps = new PrintStream(fos);

byte[] data = new byte[1000];
DatagramPacket pkt = new DatagramPacket(data, data.length);
ByteBuffer b = ByteBuffer.wrap(data);
CRC32 crc = new CRC32();

while(true) {
    pkt.setLength(data.length);
    sk.receive(pkt);
    b.rewind();

    // compare checksum, print error if checksum is different
    // if checksum is the same:
    bos.write(data);  // Where the problem seems to be occurring.

    // send acknowledgement packet. 
}
bos.close();
fos.close();

在这里,我主要是在写回文件时遇到问题。使用一个小的文本文件Hello World!,我得到一个奇怪的输出vˇ]rld!。另外,输入文件只有12个字节,但是接收方创建的文件是1KB。

我认为我的问题是处理字节缓冲区-我编写了一个程序,该程序使用文件流和缓冲流复制文件,效果很好。但是我对流在这种情况下的工作方式感到困惑,我将非常感谢您的帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

在发件人的数据[]中,您覆盖了crc从文件读取的文本!您必须阅读很长一段时间后的内容。在发件人中更正此错误时,它会起作用:

//int bytesRead = bis.read(data); --old code
int bytesRead=bis.read(data,8,data.length-8);

此外,您发送1000字节,因此将接收1000字节,这些字节将进入destfile。

顺便说一句:您不检查服务器中的crc。...为什么要发送它?