如何在使用服务器套接字后关闭端口

在我的应用程序中,我使用一些端口创建一个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()); } } 

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

这是因为在某些操作系统上实现了冷却时间。如果您稍等一下(例如几分钟),那么您应该能够再次访问该端口。

话虽这么说,打开和关闭端口上的服务器套件并不是一个好主意。 只要有必要,最好打开它并保持打开状态。 完成后关闭它。 不要打开/关闭/打开/关闭/打开/关闭……

完成后只需关闭套接字即可。 它会自动关闭正在侦听的端口。 完成后切勿打开sockets(端口)。

这意味着服务器已经打开,您需要检查用户输入或客户端输入,这样可以关闭服务器

 while( bufferedinputstream != "quit" ) try{ ... } 

一旦你让服务器打开它刚刚打开,直到某些东西关闭它。