2014-09-19 146 views
0

我正在使用Java和UDP發送者和接收者的類的項目。問題的前提是讀入文本文件,將內容存儲在數據包中,發送數據包,接收數據包,並在屏幕上讀出文件,並在接收計算機上創建一個相同文本文件的新文本文檔。Java UDP數據包發送和接收問題

我有所有的工作。當我使用本地主機進行測試時,它似乎在100%的時間內工作。當我從我的筆記本電腦發送到我的電腦時,它似乎在100%的時間內工作。但是,當我從我的PC發送到我的筆記本電腦時,它不起作用。

我有幾個System.out調試語句來驗證我發送的一些信息。我知道文本文件應該包含7個數據包。但是,每當我從我的PC發送到我的筆記本電腦時,它說我正在發送46個數據包。

我最初的想法是,數據包可能是無序發送的。我發送的第一個數據包指示接收器應該接收多少個數據包。我想也許出於某種原因,「46」可能表示大寫字母「F」,所以我刪除了所有大寫字母「F」,它仍然表示我發送了46個數據包。

我以爲也許我一次發送太多的信息,所以我使用Thread.sleep()來給我的接收器時間跟上 - 這也沒有工作。

最後,我通讀了Oracle文檔和一些在線文章,發現UDP是不可靠的。所以,我假設它可能是這樣的。但是,我想驗證這可能是問題。

或者如果任何人有更好的主意,可能會導致問題,這將是真棒!

感謝您的幫助:)

回答

0

是的,UDP是一種不可靠的協議。 UDP消息可能會丟失,發送方或接收方都不會收到任何通知。

7個數據包變成46個數據包通常是由於IP數據包級別的fragmentation造成的。 IP之下的協議級別(例如,物理以太網分組,WiFi分組等)通常對可以「一次性」發送的最大IP分組具有硬限制,並且類似的限制由網絡路由器,網關等實施。如果發送的是比限制的IP數據包,有兩種情況:

  • 的IP數據包可能變成需要由接收方進行重組「片段」。

  • 中間設備可以發回一個ICMP消息給發送者,告訴它發送較小的IP數據包。

在任一情況下,最終結果是,發送一個給定尺寸的UDP消息所需的IP數據包的數量可以變化,這取決於在網絡上。

當然,如果需要將UDP消息作爲多個IP數據包發送,並且網絡中存在本地擁塞,那麼會增加數據包的可能性,從而導致消息失敗。


但是底線是UDP不可靠。如果你想要可靠性,簡單的解決方案是使用TCP代替。

+0

非常好的答案,謝謝!我決定對它進行測試。我不確定這是否只是巧合,但似乎是泛泛而談。我用我的筆記本電腦在我的電腦上播放了大量Youtube視頻,UDP Receiver表示它收到了106個數據包,最終無法正常接收信息。我把它們全部關掉,然後再次發送它,並且工作。我從我的電腦到我的筆記本電腦做了同樣的實驗,結果也一樣。再次,不知道這是否是巧合,但從你說的和我的實驗看來,這似乎是我的問題的答案。謝謝:) – BearForceOne 2014-09-19 18:52:24

+0

@BearForceOne - 指出數據包丟失是問題所在。如果丟失了一個數據包,則會丟失整個UDP消息,因此文件傳輸將失敗。 – 2014-09-19 22:44:03