2016-02-11 273 views
1

我想模擬使用Java的UDP。我正在將一個文件從一臺主機發送到另一臺主機。這是接收器的一部分:Java - 關閉UDP套接字

server.setSoTimeout(10000);  
while (true) 
{ 
    try 
    { 
     DatagramPacket received = new DatagramPacket(receivedData,receivedData.length); 
     server.receive(received); 
     out.write(received.getData()); 
    } 
    catch (IOException e) { 
       break; 
      } 



    } 
server.close(); 

該解決方案有效,但由於某種原因,我不滿意它。

發送方發送所有的數據包,然後關閉DatagramSocket。 Receiver獲取所有數據包並終止,但由於超時而終止。

因此,如果打開我的接收器並且10秒內不執行任何操作,我的Receiver將關閉,因此不會發送任何內容。

有沒有辦法在不指定超時的情況下終止循環?

我還想知道是否有另一個主機建立連接的方法 - 像ServerSocket.accept(),它基本上等待另一個主機連接。但是,我決定使用DatagramSocket,我可以找不到解決這個問題的辦法。

有沒有人知道會執行此操作的方法?

+0

等等,你是否想讓接收器打開直到發送者發送文件? –

+1

UDP是無連接協議。沒有連接的概念,只有單個數據包。也不保證這些數據包將以正確的順序到達。這聽起來像你想TCP,而不是UDP ... –

+0

@RileyCarney好主意是不使用超時,但能夠表明所有的字節已發送 –

回答

2

數據報(UDP)套接字是固有無連接的。關閉DatagramSocket沒有任何對遠程系統可見的影響。它阻止應用程序在該套接字上發送或接收任何進一步的數據,並釋放端口供本地系統上的其他應用程序使用,但不會導致通過網絡發送任何通知。

如果您想通知遠程服務器您已完成發送數據,您需要向它們發送一個數據報,通知他們。

如果您試圖通過UDP傳輸文件,請記住UDP數據包不能保證被接收,也不能保證以相同的順序接收UDP數據包! (也就是說,它們可能會被網絡丟棄或重新排序。)

+0

是的,我知道他們不能保證到達,所以我只是想知道是否有更好的方法來編寫這部分代碼。 我的問題的第2部分呢?基本上現在,我有10秒鐘來啓動發件人,否則連接將到期。我知道理論上應該會發生,但是有沒有辦法在發件人啓動後開始傳輸? –

+1

@JohnnyBravo如果您希望能夠接受傳入連接,檢測遠程關閉並避免丟包和重新排序,請使用TCP套接字**。他們的全部目的是爲你解決這些問題。 – duskwuff