Java - UDP通过套接字发送数据..不是rec。所有数据
Posted
技术标签:
【中文标题】Java - UDP通过套接字发送数据..不是rec。所有数据【英文标题】:Java - UDP sending data over socket.. not rec. all data 【发布时间】:2012-03-24 07:08:43 【问题描述】:似乎我编写的客户端 - 服务器应用程序确实有效,但似乎并非每次都处理所有数据。
我正在 Eclipse 环境中的本地机器上对其进行测试。
服务器:
private void sendData() throws Exception
DatagramPacket data = new DatagramPacket(outgoingData, outgoingData.length, clientAddress, clientPort);
InputStream fis = new FileInputStream(responseData);
int a;
while((a = fis.read(outgoingData,0,512)) != -1)
serverSocket.send(data);
客户:
private void receiveData() throws Exception
DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length);
OutputStream fos = new FileOutputStream(new File("1"+data));
while(true)
clientSocket.receive(receiveData);
fos.write(incomingData);
我曾经在 while(true) 循环中使用 if else 来检查数据包长度是否小于 512 字节,以便知道何时中断;
我在想有一个问题,但现在似乎没关系,我只需等待几分钟,然后停止 Client.java 应用程序
文件确实传输了,但原始文件是 852kb,到目前为止我得到了 777、800、850,.. 但从来没有全部。
【问题讨论】:
你试过刷新流吗? UDP 不可靠。 UDP 规范规定 UDP 将尽最大努力将数据包从源发送到接收器,但数据包可能会被丢弃,并且永远不会通知接收/发送者。如果您需要可靠地发送数据,您将需要实现某种丢包检测方案或改用 TCP。从本地意义上讲,您丢失了这么多数据包,这有点奇怪,但是没有合同规定本地 UDP 连接必须可靠。 我明白这一点,但我仍然想弄清楚如何才能尽可能多地帮助他们。 必须检查 UDP 是如何工作的。然后,修改您的工作以处理丢失数据包的消息 【参考方案1】:您的方法的根本问题是 UDP 不保证传送。如果您必须使用 UDP(而不是 TCP),您必须实施一种方案来检测和处理丢失、乱序到达或多次传送的数据包。
见When is it appropriate to use UDP instead of TCP?
【讨论】:
【参考方案2】:您可能应该使用 TCP 来传输文件。您可能正在丢失数据包,因为您在 while 循环中发送它们的速度非常快。
int a;
while((a = fis.read(outgoingData,0,512)) != -1)
serverSocket.send(data);
由于您发送的速度如此之快,我非常怀疑它是否有机会以正确的顺序被接收。一些数据包也可能因此而丢失。
此外,由于您发送的是 512 字节的固定大小,因此您发送的最后一个数据包可能不会完全是该大小,因此您会看到文件末尾“看起来很奇怪”。
【讨论】:
以上是关于Java - UDP通过套接字发送数据..不是rec。所有数据的主要内容,如果未能解决你的问题,请参考以下文章