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。所有数据的主要内容,如果未能解决你的问题,请参考以下文章

TCP/UDP套接字 java socket编程实例

在UDP Socket java android上发送和接收数据

Java中使用UDP实现简单的聊天功能

Java网络编程之UDP网络编程

Python学习之——Socket套接字(UDP连接)

IOS4 - 在 Wifi 上使用 UDP 套接字发送数据