2016-02-11 226 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