2013-07-02 36 views
1

我需要一些幫助,我想我有一個簡單的網絡相關的問題。它還將幫助我更好地瞭解所有這些工作,知道什麼不是.close()'ed。我相信這很簡單,但對我來說它非常新穎。這是客戶端程序。如果我能弄明白的話,我很可能會追加服務器。由於java.net.BindException如何清除套接字或導致它的事件?

public class Server { 
    public static void main(String[] args) { 
     start(); 
    } 

    static int start = 0; 

    public static void start() { 
     try { 
      ServerSocket serverSocket = new ServerSocket(4567); 
      Socket socket = serverSocket.accept(); 
      //1) Take and echo input (In this case a message) 
      BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String message = bf.readLine(); 
      System.out.println("Message recieved from Client:" + message); 
      //2) Response of client message 
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
      printWriter.println("Server echoing back the message ' " + message + " ' from Client"); 
     } catch (IOException e) { 
      System.out.println("e " + e); 
      System.exit(-1); 
     } 
     start++; 

      clearUp(); 

     if (start < 5) { 
      System.out.println("Closing binds and Restarting" + start); 

      start(); 
     } 
    } 

    public void clearUp(){ 
     //How would I clear the stuff that is left bound 
      so I can restart via start() and avoid the 
      java.net.BindException: Address already in use: JVM_Bind ? 
    } 

} 

我怎麼會清除()被留下裝訂,這樣我可以通過開始重新啓動的東西,避免java.net.BindException:地址已在使用:JVM_Bind?

+1

你打算讓'start'遞歸調用嗎? –

+0

你能發佈錯誤信息嗎? – Houseman

+1

這個代碼的結構有幾個主要的問題。主要問題是您沒有關閉服務器套接字。我建議你閱讀可用於描述Java中套接字編程的_many_教程之一,並應用其中描述的技術。具體而言,您只需要打開一次服務器套接字,然後啓動一個單獨的線程來處理每個連接。 –

回答

3

問題在於這些行中。

public static void start() { 
    try { 
     ServerSocket serverSocket = new ServerSocket(4567); 
     //tells server to listen on 4567 
.... 

if (start < 5) { 
     System.out.println("Closing binds and Restarting" + start); 

     start(); 
} 

您正在反覆啓動並告訴ServerSocket在同一端口上偵聽。

相反,你想要做的,是有一個ServerSocket,由服務器持有待監聽。然後,一個普通的Socket連接到ServerSocket和服務器的連接,並且這將返回一個新的Socket供他們進行通信。你的問題似乎表明這是客戶端代碼,並且傳輸客戶端不應該有一個ServerSocket,因爲它不在某個端口上偵聽。

你想要做什麼是 服務器:某些端口上

  1. 製作的ServerSocket。循環內。
  2. 等待客戶端連接
  3. 接受連接。這將導致創建一個新的socket爲您和客戶端上

客戶溝通:

  1. 通過socket連接到服務器套接字
  2. 它對話。

如果這沒有意義,我可以舉一些代碼示例。

被警告,爲了讓您的服務器與多個客戶端通信,您需要使用線程。

0

我不知道你爲什麼重新綁定,所以我已經刪除了那一點。

你也沒有關閉任何你的套接字。

他們是資源,所以你不應該依靠java自己清理它們。

public static void start() { 
    ServerSocket serverSocket = null; 
    int exitCode = 0; 
    try { 
     serverSocket = new ServerSocket(4567); 
     while(start < 5){ 
      Socket socket = serverSocket.accept(); 
      //1) Take and echo input (In this case a message) 
      BufferedReader bf = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String message = bf.readLine(); 
      System.out.println("Message recieved from Client:" + message); 
      //2) Response of client message 
      PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
      printWriter.println("Server echoing back the message ' " + message + " ' from Client"); 
      // close resource 
      socket.close(); 
      start++; 
     } 
    } catch (IOException e) { 
     System.out.println("e " + e); 
     exitCode = -1; 
    } finally { 
     if (serverSocket != null){ 
      try { 
       // close server 
       serverSocket .close(); 
      } catch (IOException e) { 
       System.out.println("e " + e); 
      } 
     } 
    } 
    if (exitCode != 0){ 
     System.exit(exitCode); 
    } 
} 
相關問題