2011-05-27 104 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

相關問題