2011-05-27 89 views
4

在我的应用程序创建一个ServerSocket实例与一些端口后关闭端口。我完成后,我关闭套接字,但是当我尝试做一个新的ServerSocket同一端口上,它抛出:如何使用服务器套接字

"java.net.BindException: Address already in use" 

如果我创建ServerSocket用不同的端口,然后它的作品。

ServerSocket.isClosed也返回true

问题是什么?

public void run() { 
    try { 
     BufferedInputStream bufferedinputstream = new BufferedInputStream(
                 new FileInputStream(fileReq)); 
     BufferedOutputStream outStream = new BufferedOutputStream(
                 cs.getOutputStream()); 
     byte buffer[] = new byte[1024]; 

     int read; 
     System.out.println(cs); 
     while ((read = bufferedinputstream.read(buffer)) != -1) 
     { 
      outStream.write(buffer, 0, read); 
      outStream.flush(); 
     } 
     System.out.println("File transfered"); 
     outStream.close(); 
     bufferedinputstream.close(); 

     try { 
      this.finalize(); 
     } catch (Throwable e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    } 
} catch (Exception e) { 
    System.out.println("Exce...."); 
    System.out.println(e.getMessage()); 
} 
finally 
{ 
    if (cs != null) 
     try { 
      int usedPort=cs.getLocalPort(); 
      System.out.println("Closing "+cs); 
      cs.close(); 
      System.out.println(cs+" Closed"); 
      System.out.println("asd"+cs.isClosed()); 
      portManager.getInstance().mp.put(usedPort,true); 
     } catch (IOException e) { 
      System.err.println("in sendToClient can't close sockt"); 
      System.err.println(e.getMessage()); 
     } 
} 

回答

0

这是因为有一些O.S.实施冷却期如果稍等一会(例如几分钟),那么您应该可以再次访问该端口。

话虽这么说,这是不是一个好主意来打开和端口关闭serversockets。只要有必要,最好打开它并保持打开状态。完成后关闭它。不要打开/关闭/开启/关闭/开启/关闭......

+0

我等待10分钟,但它仍然不是让MT使用此端口agien直到我结束我的服务器程序... – dan 2011-05-27 07:56:48

0

完成时就关闭套接字。它会自动关闭它正在监听的端口。完成后切勿保持打开插座(端口)。

+0

好这个我在做什么(比如你可以在我的代码中看到的)......但它不是帮助!!!!我尝试evrey的事情,以释放此端口.. – dan 2011-05-27 07:54:34

2

您是否尝试过在服务器套接字上调用setReuseAddress(true)? TCP状态机正常输入TIME_WAIT状态。详细的解释请看here

+0

首先感谢您的帮助你们所有人。是的,我想这(我需要你使用它时,插座开始吧?)任何它不工作的妇女警察端口八方通在使用“使用地址已:JVM_Bind”哎呀如何其能可能,我无法使用那个端口遍布程序运行,直到我关闭了java程序..肯定是某种方式 – dan 2011-05-27 10:01:37

+0

它是什么平台?如果是Linux,请尝试netstat -pan | grep 1234并查看状态。在Windows上,你也可以尝试netstat -an。 – 2011-05-27 10:04:55

-1

这意味着服务器已经打开你需要用户输入或客户端输入的支票,上面写着关闭像

while(bufferedinputstream != "quit") 

try{ 

... 

} 

服务器一旦你的服务器打开它只是开到东西关闭它。

+0

'BuuferedInputStreams'永远不会等于'Strings',== ==并不是正确的测试方法,即使它们是。 – EJP 2018-01-06 21:10:02

相关问题