繁体   English   中英

Java读取文件并通过DatagramSocket发送

Java reading a file and sending it via DatagramSocket

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

使用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 个回复

在发件人的data []中,您将覆盖crc从文件中读取的文本! 您必须阅读很长一段时间后的内容。 在发件人中更正此错误时,它的工作原理是:

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

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

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

2 在Java EE(EJB 3.0)环境中从DatagramSocket读取

在基于JBoss(版本5)的应用程序中,我需要侦听UDP数据包。 最简单的方法(可能是唯一的一种方法)是在某些端口上打开DatagramSocket(使用JBoss @Service单例bean)并调用receive(...)方法。 第一部分非常简单-我已经对其进行了测试并按预期工作。 ...

3 通过DatagramSocket发送列表?

我有一个使用Java的电子表格应用程序,它提供的功能(由我开发)是工作表共享。 基本上,任何人都可以成为客户端或服务器,因为该应用程序同时具有服务器和客户端代码。 作为服务器的用户创建共享,指定IP,然后在服务器监听其IP和选定端口上的客户端的情况下,创建共享并激活该共享(最佳情况)。 ...

4 Java套接字-发送文件然后读取行不起作用

我正在尝试将字符串列表与文件一起从服务器发送到客户端。 一切正常,直到我实现了文件。 现在发生的情况是文件已发送,保存在我的计算机上,然后line = in.readLine()返回null', resulting in '!line.equals("DONE")引发错误。 甚至更奇怪的是 ...

5 通过DatagramSocket广播的问题

我从一个Android手机向另一个Android手机广播数据报数据包时遇到问题。 我已经将我的应用程序设置为能够使用2个不同的数据报套接字。 这一切都很好,我可以在套接字之间切换。 我使用两部手机来测试该应用程序,以及能够与我的应用程序进行通信的基于PC的应用程序。 当我尝试从2 ...

6 通过Java发送保存在Chrome上的HAR文件

可以在Chrome中打开开发人员工具(Ctrl + Shift + J)将HAR文件保存在Chrome中,然后点击“网络”标签,最后右键单击并选择将条目保存为HAR。 下载后,如何使用该文件作为Java输入来发送HTTP请求? ...

2012-07-26 17:06:28 1 1517   java/ har
8 Java:DatagramSocket和代理(防火墙)

可能是我不了解UDP协议... 我正在尝试使用UDP协议从服务器接收数据,但是我坐在防火墙后面。 URLConnection构造函数可以采用Proxy的实例(以及设置此类代理服务器的用户名和密码的方式)。 如何使用UDP协议(DatagramSocket)通过代理服务器进行连接? ...

9 如何通过DatagramSocket传输int

我想做一个简单的应用程序来通过DatagramSockets传输整数,但是我不想做变通办法,例如使用字符串并将其强制转换为int,我想知道是否存在通过DatagramSocket传递整数的即席方式。 此代码的一部分只是为了演示我想要的。 我想知道如何在发送方写一个int以及如何在接收方 ...

10 从Java应用程序发送xml文件并在jsp中读取它

我有一个包含main方法的Java应用程序。 如果我要使用Httpclient的post方法将xml文件传递到服务器端的jsp文件,如何获取它并从请求对象的jsp文件中读取它? 我知道有一种在servlet中获取xml文件的方法,但是,有没有办法在jsp文件中获取它? ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM