2012-10-10 79 views
0

我寫了一個簡單的服務器客戶端套接字程序,當我重新編譯服務器,我得到:如何殺死windows7下打開的服務器套接字?

java.net.BindException: Address already in use: JVM_Bind 
    at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.bind(Unknown Source) 
    at java.net.PlainSocketImpl.bind(Unknown Source) 
    at java.net.ServerSocket.bind(Unknown Source) 
    at java.net.ServerSocket.<init>(Unknown Source) 
    at java.net.ServerSocket.<init>(Unknown Source) 

所以我的問題是如何殺死在Windows 7下的插座?有沒有可能的解決方案在eclipse中殺死它?

我感謝您的回答!

回答

0

這裏是我的服務器端代碼:

import java.io.*; 
import java.net.*; 

public class ServerSide { 


    public static void main(String[] args) { 

     try 
     { 
      ServerSocket myServerSocket = new ServerSocket(9999); 
      System.out.println("Server is waiting on host" + InetAddress.getLocalHost().getCanonicalHostName() + "port= "+ myServerSocket.getLocalPort()); 
      Socket skt = myServerSocket.accept(); 

      BufferedReader myInput = new BufferedReader(new InputStreamReader(skt.getInputStream())); 
      PrintStream myOutput = new PrintStream(skt.getOutputStream()); 

      String buf = myInput.readLine(); 
      System.out.println("Server readLine"); 
      if(buf!=null) 
      { 
       System.out.println("Buf = " + buf); 
       myOutput.print("Got it?"); 
      } 
      else 
      { 
       System.out.println("Nothing returned in server sidex`x "); 
      } 
      skt.close(); 
      System.out.println("Server shutdown"); 
     } 
     catch(IOException e) 
     { 
      e.printStackTrace(); 
      System.out.println("Whooops"); 
     } 
    } 

} 

正如你可以看到清理我已經寫了:

 skt.close(); 

但也許這不是你的問題,也許你的問題是我1小時前的;)我曾經運行一個程序,但結果不是我所期望的,所以我修改它並再次運行,但端口很忙或已經在使用!我在eclipse上做什麼?在出現錯誤的控制檯下,在窗口的右側有紅色矩形按鈕!它說「終止」。如果你點擊你的端口將是免費的。順便說一下,不要忘記檢查兩個(服務器/客戶端)兩側的控制檯。

2

殺死jvm,當我遇到它時就解決了這個問題。在停止簡單服務器之前,您是否在代碼中關閉了套接字?

2

就像RGdev我假設你仍然有一個javaw進程在後臺運行,它保持連接打開。但它也可能是您的機器上的一個不同的服務器程序,它佔用了您要使用的端口。

您可以通過cmd shell中的netstat命令找出哪些進程在監聽哪個端口。以下參數列出(a)包括服務器在內的所有連接,(b)顯示打開連接的可執行文件,以及(n)禁止用知名端口的服務名稱替換端口號。

netstat -abn 
0

當進程已經終止時,你也可以得到這個錯誤信息。 TCP有時間等待狀態。此狀態用於確保沒有來自舊連接的TCP數據包可以傳送到在同一端口偵聽的新進程。通常你應該使用ServerSocket.setRuseAddress(true)來避免這個問題。