2011-12-29 66 views
1

下面的代码可以重现该问题: INT errAt = -1;DatagramSocket类口岸后仍然使用关闭

try { 
    System.out.println("start..."); 
    for (int i = 0; i < 4000; i++) { 
     errAt = i; 
     DatagramSocket result = new DatagramSocket(null); 
     result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005)); 
     result.close(); 
     //System.out.println(i); 
    } 

    } catch (Exception e) { 
    System.out.println("Error: " + e.getMessage()); 
    System.out.println("ErrAt: " + errAt); 
    e.printStackTrace(); 
    } finally { 
    System.out.println("end..."); 
    } 

在我的电脑,我会看到“java.net.BindException:地址已在使用:无法绑定”运行后异常2K +倍。

我不知道,就是这意味着close方法并没有立即关闭本机插座?

回答

2

即使我将它设置为运行40,000次迭代,此代码也可以在我的Mac上运行。我认为这里可能存在的问题是,套接字没有立即在Windows上关闭,但是您又试图在可能的毫秒内进行数千次迭代。

下面的代码将不断重试和睡觉的少量时间,让你看看它的延迟问题,在插座会的时间一定空间内被关闭:

long tCumulative = 0; 
    int errAt = -1; 
    System.out.println("start..."); 
    for (int i = 0; i < 4000; i++) { 
     try { 
      errAt = i; 
      DatagramSocket result = new DatagramSocket(null); 
      result.bind(new InetSocketAddress(InetAddress.getLocalHost(), 9005)); 
      result.close(); 

      //success at last 
      tCumulative = 0; 

     } catch (Exception e) { 
      System.out.println("Error (at="+errAt+") (waited="+tCumulative+"ms): " + e.getMessage()); 

      tCumulative+=50; 
      Thread.sleep(50); 
      i--; 
     } 
    } 
    System.out.println("end..."); 
+0

确实没有在Windows上立即关闭套接字。 – 2011-12-29 05:48:25

+0

鉴于您可以在失败之前运行代码约2000次,可能最有可能的问题是关闭和重新绑定是一种竞争条件(即Windows非常快速地执行操作,但在2000次之后,您遇到了您在它关闭之前尝试重新绑定),或者您的Windows资源不足,因为它没有足够快地清除它们。你是否发现当它失败时会等待一小段时间,然后在失败之前或之后对另一个套接字工作正常,是否似乎必须等待一段时间才能关闭每个套接字? – AntonyM 2011-12-29 17:51:13

+0

我之所以问这个问题的原因是因为如果它在大约2000个套接字后似乎失败了,但是当你等待50ms之后再工作到另外2000个套接字时,那么它可能只是一个竞争条件。如果它在2000个套接字之后失败了,并且你发现你被限制为可能每隔几百毫秒或几秒关闭和重新绑定一个套接字,那么这就意味着Windows仅在超时之后才清理资源。如果它的第一个确定 - 你只需要等待+重试,如果它发生,如果第二你可能想要查找关于套接字清理的注册表设置。请参阅代码 – AntonyM 2011-12-29 17:56:07

1

如果创建套接字但随后得到例如一个BindException你没有关闭套接字。它应该在finally {}块中关闭。

很难看出这个测试的重点。正常的UDP程序打开一个DatagramSocket并在整个过程中保持打开状态。没有一个理智的程序会通过数以千计的UDP套接字。

+0

。套接字已关闭。 – 2011-12-29 09:46:04

+1

@SunilKumarSahoo请亲自看看代码。如果bind()调用引发异常,则该套接字为* not *关闭。 – EJP 2011-12-30 00:51:57

+0

@downvoters请解释,除非你希望它被视为纯粹的网站破坏行为。 – EJP 2012-10-03 12:04:54

相关问题