2012-03-06 128 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字節的固定大小,因此您發送的最後一個數據包可能不會完全符合該大小,因此您會看到該文件的末尾「顯得較爲粗糙」。