2012-03-06 129 views
2

似乎我写的客户端 - 服务器应用程序确实有效,但似乎并非每次都处理所有数据。Java - UDP通过套接字发送数据..没有记录。所有数据

我在Eclipse env的本地机器上测试它。

服务器:

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); 
    } 
} 

我曾经有过,如果别人在一段时间(true)循环来检查数据包长度小于512个字节,因此它知道何时打破;

我想有一个问题,那白衣,但似乎这是奥凯现在我只需等待几分钟,然后停止Client.java应用

文件不转移,但原文件是852KB,到目前为止,我得到了777,800,850,但是从来都没有。

+0

您是否尝试过冲洗溪流? – 2012-03-06 18:47:07

+2

UDP是不可靠的。对于UDP该规范规定,UDP将获得来自源的数据包接收器的“尽力而为”,但包可能被丢弃和接收/发送器将永远不会被通知。如果您需要可靠地发送数据,则需要实施某种丢包检测方案或使用TCP。有一点奇怪的是,你在本地意义上丢失了很多数据包,但没有合同规定本地UDP连接必须可靠。 – CodeBlind 2012-03-06 18:48:10

+0

我明白,但我仍然想弄清楚我可以如何帮助尽可能多地获得。 – 2012-03-06 18:50:43

回答

1

您的方法的根本问题是UDP不保证传递。如果您的使用UDP(而不是TCP),则必须实施一种方案,该方案可检测并处理丢失的数据包,不按顺序的数据包或多次传送的数据包。

When is it appropriate to use UDP instead of TCP?

0

你或许应该使用TCP来传输文件。您可能会丢失数据包,因为您在while循环中发送速度太快。

int a; 
while((a = fis.read(outgoingData,0,512)) != -1) 
{ 
    serverSocket.send(data); 
} 

既然你发送得太快,我非常怀疑它有机会以正确的顺序收到。一些数据包也可能因此而丢失。

此外,由于您发送512字节的固定大小,因此您发送的最后一个数据包可能不会完全符合该大小,因此您会看到该文件的末尾“显得较为粗糙”。