使用Java,我正在尝试通过DatagramSocket发送一些文件数据。我需要读取1000字节的文件块并将其作为数据包发送出去。我的代码:
我在将字节数组写回到文件时遇到问题。请在下面查看我的代码。
客户/发件人:
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。
我认为我的问题是处理字节缓冲区-我编写了一个程序,该程序使用文件流和缓冲流复制文件,效果很好。但是我对流在这种情况下的工作方式感到困惑,我将非常感谢您的帮助。谢谢!
答案 0 :(得分:0)
在发件人的数据[]中,您覆盖了crc从文件读取的文本!您必须阅读很长一段时间后的内容。在发件人中更正此错误时,它会起作用:
//int bytesRead = bis.read(data); --old code
int bytesRead=bis.read(data,8,data.length-8);
此外,您发送1000字节,因此将接收1000字节,这些字节将进入destfile。
顺便说一句:您不检查服务器中的crc。...为什么要发送它?