2011-10-12 47 views
0

我想用線程建立一個多端口服務器。我也有一個ClientManager類和一個客戶端類。需要發生的事情是用戶輸入一系列端口......比如端口8000-8010。服務器需要監聽所有這些端口的連接。 ClientManager然後獲取端口範圍併爲每個端口創建一個Client實例。然後客戶端以0-1秒的間隔隨機發送消息到服務器。客戶端發送100條消息後,應斷開連接。服務器需要每5秒打印一次收到的消息數量。建立一個多端口服務器:Java

到目前爲止,我已經設法獲取端口範圍的用戶輸入,然後通過Runtime.exec()參數將它們發送到ClientManager。這裏是我當前的代碼爲服務器和ClientManager:

import java.io.*; 

public class Server{ 

    public static void main(String[] args){ 
     try{   
      InputStreamReader isr = new InputStreamReader(System.in); 
      BufferedReader userInputReader = new BufferedReader(isr); 
      String lowPortRange = null; 
      String highPortRange = null; 

      System.out.println("Enter low end of port range:"); 
      if((lowPortRange = userInputReader.readLine())!=null){ 
       System.out.println("Low Range: " + lowPortRange); 
      } 
      System.out.println("Enter high end of port range:"); 

      if((highPortRange = userInputReader.readLine()) != null){ 
       System.out.println("High Range: " + highPortRange); 
      } 


      int lowPort = Integer.parseInt(lowPortRange); 
      int highPort = Integer.parseInt(highPortRange); 
      int totalPorts = highPort - lowPort+1; 

      System.out.println("Total ports: " + totalPorts); 
      System.out.println("...Port numbers..."); 

      for(int port = lowPort; port<=highPort; port++){ 
       System.out.println(port); 
      } 

      System.out.println("Done!"); 
      System.out.println(); 

      Process p = Runtime.getRuntime().exec("java ClientManager " + lowPort + " " + highPort); 

      BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); 
        String line = null; 
        while ((line = in.readLine()) != null) { 
         System.out.println(line); 
        } 
     }catch(IOException e){ 
      System.out.println("IOException!"); 
      e.printStackTrace(); 
     } 
    } 
} 

import java.io.*; 

public class ClientManager{ 
    private int lowPort; 
    private int numPorts; 

    public static void main(String[] args){ 
     System.out.println("ClientManager Started."); 

     int firstPort = Integer.parseInt(args[0]); 
     int lastPort = Integer.parseInt(args[1]); 

     System.out.println("First Port: " + firstPort); 
     System.out.println("Last Port: " + lastPort); 
    } 

} 

我的問題基本上是這樣的:可能有人解釋,從理論上講,我應該何去何從?

回答

0

您需要爲您正在監聽的每個端口創建一個ServerSocket。由於accept()阻塞,直到客戶端連接,您需要創建一個線程來偵聽每個ServerSocket。如果不止一個客戶端可能同時連接到給定的端口(似乎不像您的描述那樣),您還必須爲每個客戶端連接創建一個線程。還有一個要打印並每5秒鐘清零消息計數 - 這也可能是主線程。

當然,訪問消息計數必須進行適當的同步,並且描述中沒有提及服務器何時必須完全關閉才能關閉。 (旁註:當客戶端連接時不接受新的連接在「真實」服務器中顯然是不可接受的,而且如果客戶端很多,每個客戶端並不是最佳的方式)。

+0

服務器關閉確實需要優雅地完成。 –

+0

然後,您還必須確保所有線程都有某種關閉條件,而不是永遠循環 - 當沒有更多服務器套接字線程存在時的主線程,服務器線程完成處理客戶端連接時的線程。 – millimoose

0

查看ThreadPoolExecutor瞭解更多信息。它會使你的服務器健壯。你可以構造它來滿足你的需求。如果您從未使用過Executors,那完全沒有問題。很簡單。你必須給它Runnable,你需要處理,在這種情況下,一旦你獲得了連接,然後與客戶端進行交互等等,你的大部分負載將會減少。

相關問題