2011-10-12 3 views
0

스레드가있는 다중 포트 서버를 빌드하려고합니다. 또한 ClientManager 클래스와 Client 클래스가 있습니다. 사용자가 포트 범위 ... 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으로 줄이면됩니다. 이것은 주 스레드 일 수도 있습니다.

물론 메시지 수에 대한 액세스가 적절하게 동기화되어야하며 정상적으로 완료되어야하는 경우 서버를 종료해야하는시기에 대해서는 설명하지 않습니다.

(Sidenote : 클라이언트가 연결되어있는 동안 새로운 연결을 허용하지 않는 것은 분명히 "실제"서버에서 허용되지 않으며 많은 클라이언트가있는 경우 클라이언트 당 하나의 스레드가이를 피하는 최적의 방법은 아닙니다.)

+0

실제로 서버를 정상적으로 종료해야합니다. –

+0

그런 다음 모든 스레드가 영원히 반복하지 않고 일종의 종료 조건을 갖도록해야합니다. 서버 소켓 스레드가 더 이상 없을 때의 주 스레드, 클라이언트 연결 처리가 끝날 때의 서버 스레드입니다. – millimoose

0

자세한 내용은 ThreadPoolExecutor을 참조하십시오. 그것은 당신의 단호한을 강력하게 만들 것입니다. 그리고 여러분의 요구에 맞게 구조화 할 수 있습니다. 당신이 집행자와 결코 일하지 않았다면 전혀 문제가되지 않습니다. 아주 간단합니다. 당신은 당신이 처리해야 할 Runnable을 주어야합니다.이 경우에는 일단 연결이되면 클라이언트와의 상호 작용이 생깁니다. 대부분의 부하가 줄어들 것입니다.