2013-04-10 3 views
0

남자! 간단한 서버 클라이언트 (udp) 응용 프로그램을 작성했습니다. 지금 나는 많은 클라이언트를 받아들이는 서버를 만들려고 노력하고있다. 알다시피, 나는 클라이언트를 받아들이고 처리하는 함수를 만들어야하지만, 애플 리케이션 구조에 대해서는 혼란 스럽다. 내 애플 리케이션에 맞는 해골이 있는지 확인할 수 있습니까? Mayb u는 나에게 약간의 암시 또는 예를 줄 수있다. 모든 조언을 부탁드립니다! :)많은 클라이언트를 다루는 서버 자바

class MultiServer { 

    private DatagramSocket serversocket; 

    public MultiServer() { 
     try { 
      this.serversocket = new DatagramSocket(6789); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void start() throws IOException { 
     while(true) { 
      DatagramSocket serversock = serversocket.accept(); 
      new Thread(new ClientHandler(serversock)).start(); 
     } 
    } 

    public static void main(String[] args) { 
     Server1 server = new Server1(); 
     try { 
      server.start(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

class ClientHandler implements Runnable { 

     private final DatagramSocket clientsocket; 

     ClientHandler(DatagramSocket sock) { 
      this.clientsocket = sock; 
     } 

     @Override 
     public void run() { 
      //receive packet, send msg, get ip, get portnumber ? 
     } 

    } 

} 

답변

0

당신은 스레드 풀 서버를 찾고 있습니다. 네가 시작한 방식이 좋다. 이제 Java 실행 서비스를 구현하여 요청을 처리하기 만하면됩니다. 스레드 풀에는 고정 된 스레드가 있습니다. 그것은 당신의 요청을 받아 대기열에 넣고 요청이 완료되면 다음 요청을받습니다. 그래서 당신은 어떤 요청을 잃지 않습니다. 난 스레드가없는 경우에 상기 요청을 수행 할 시점에 this.threadPool.execute(new ThreadHandler(clientSocket));

public class PoolServer implements Runnable { 
    private static final int DEFAULT_PORT = 8080; 
    private static final String CONFIG = "config.xml"; 
    protected ServerSocket serverSocket = null; 
    protected boolean isStopped = false; 
    protected Thread runningThread = null; 
    protected ExecutorService threadPool = Executors.newFixedThreadPool(100); 
    protected int serverPort; 

    public PoolServer() { 
     // getting the port from the XML 
     this.serverPort = getPortFromXML(); 
    } 

    public void run() { 
     synchronized (this) { 
      this.runningThread = Thread.currentThread(); 
     } 
     openServerSocket(); 
     // accepting loop 
     while (!isStopped()) { 
      Socket clientSocket = null; 
      try { 
       // accept the client 
       clientSocket = this.serverSocket.accept(); 
       clientSocket.setSoTimeout(2000); 

      } catch (IOException e) { 
       if (isStopped()) { 
        return; 
       } 
       throw new RuntimeException("Error accepting client connection", 
         e); 
      } 
      this.threadPool.execute(new ThreadHandler(clientSocket)); 
     } 
     // loop end 
     // server stopped shut down the ThreadPool 
     this.threadPool.shutdown(); 
    } 

    private synchronized boolean isStopped() { 
     return this.isStopped; 
    } 

    public synchronized void stop() { 
     this.isStopped = true; 
     try { 
      this.serverSocket.close(); 
     } catch (IOException e) { 
      throw new RuntimeException("Error closing server", e); 
     } 
    } 

    private void openServerSocket() { 
     try { 
      this.serverSocket = new ServerSocket(this.serverPort); 
     } catch (IOException e) { 
      throw new RuntimeException("Cannot open port " + this.serverPort, e); 
     } 
    } 

: 여기

내가 만든 작은 예이다. 그렇지 않으면 Threadpool의 큐에 들어간다.

Fixed에서 다른 Threadpools로 변경할 수도 있습니다! 집행자를 살펴보고 필요한 것을 가져 가십시오. Executors
희망이 도움이됩니다.

+0

감사합니다. 시도해 보겠습니다.) – chajka

1

그래서 서버가 동시에 여러 요청을 처리 할 수있게하려면? 대부분의 웹 서버가 작동하는 방식입니다. 멀티 스레딩 및 동시성의 기본 개념을 이해해야합니다.

간단한 서버는 한 번에 하나만 처리 할 수 ​​있습니다. 서버가 다른 것을 처리하는 동안 다른 요청이 수신되면 어떻게됩니까? 아무것도, 그래서 응용 프로그램이 매우 효율적이고 전혀 확장되지 않습니다.

아직 응용 프로그램에서 다중 스레드를 사용하지 않았고 동시성에 대해 잘 모르는 경우 이동하거나 Oracle Concurrency Lesson을 읽거나 온라인 자습서를 찾을 수있는 좋은 시간입니다.

이제는 스레딩이 어떻게 작동하는지 알고 있으므로 가능한 한 많은 기능을 분해하고 동시에 어떤 기능이 발생할 수 있는지 확인하십시오. 내가 생각할 수있는 웹 서버의 예는 다음과 같습니다.

  • 요청에 대해 포트에서 수신 대기하는 별도의 스레드. 요청이 수신되면, '요청 풀'에 배치하고이 같은

귀하의 구조가 보이는 요청을 처리하는이

  • 별도의 스레드 (또는 다중 스레드/스레드 풀을) 처리 될 대기열 둘 다 동일한 Runnable에서 수신하고 처리합니다. 어쨌든, 이것은 단지 아이디어 일 뿐이며, 여러분은 여러분의 어플리케이션에 더 적합한 것을보아야 할 것입니다. 또한 최신 Java 버전에서 제공하는 동시성 도구를 살펴보면 Java 6과 7은 매우 효과적이지만 사용할 수있는 많은 도구를 제공합니다 (제 의견으로는 이해하기 어렵습니다).

    행운을 빈다.