簡體   English   中英

Java UDP數據包發送和接收問題

[英]Java UDP packet sending and receiving issue

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

我有所有的工作。 當我與本地主機進行測試時,它似乎可以100%地正常工作。 當我將其從筆記本電腦發送到PC時,它似乎可以100%地正常工作。 但是,當我將其從PC發送到筆記本電腦時,它不起作用。

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

我最初的想法是,可能數據包的發送順序不正確。 我正在發送的第一個數據包指示接收器應預期接收多少個數據包。 我以為“ 46”可能表示大寫“ F”,所以我刪除了所有大寫“ F”,但仍然說我正在發送46個數據包。

我以為也許我一次發送了太多信息,所以我使用Thread.sleep()來給接收者一些時間來跟上它-也不起作用。

最后,我通讀了Oracle文檔和一些在線文章,發現UDP不可靠。 因此,我假設可能是那樣。 但是,我只想驗證那可能是問題。

或者,如果有人對導致問題的原因有一個更好的主意,那么這也太棒了!

謝謝你的幫助 :)

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

7個數據包變成46個數據包通常是由於IP數據包級別的碎片 IP下的協議級別(例如,物理以太網數據包,wifi數據包等)通常對可以“一次性”發送的最大IP數據包具有硬限制,並且網絡路由器,網關等也施加了類似的限制。 如果發送了一個大於限制的IP數據包,則會發生兩件事:

  • IP數據包可能會變成“碎片”,需要接收方重新組裝。

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

在這兩種情況下,最終結果都是發送給定大小的UDP消息所需的IP數據包數量可能會有所不同,具體取決於網絡。

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


但最重要的是UDP不可靠。 如果需要可靠性,簡單的解決方案是使用TCP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM