2012-04-07 3 views
0

나는 자바 스윙 클라이언트 - 서버 응용 프로그램을 개발했습니다. 서버는 데이터베이스 서비스, 캐시 서비스 및 클라이언트 서비스와 같은 많은 서비스를 클라이언트에 제공합니다.소켓에서 여러 클라이언트 처리

클라이언트 서비스는 포트에서 소켓을 열고 들어오는 연결을 수신합니다. 모든 클라이언트 연결에 대해 새 스레드를 생성하고 세션을 생성하며 들어오는 일련 화 된 객체를 읽습니다. 클라이언트가 'CLOSE_SESSION'명령을 내릴 때까지이 세션을 유지합니다 (스레드를 유지합니다).

새로운 클라이언트 소켓 세션마다 새 스레드를 생성하는 것이 맞는지 알고 싶습니다. 감사.

내 고객 서비스 코드는 다음과 같습니다.

코드는 서버 소켓을 작성하려면 다음을

  try { 
       ServerSocket socket = new ServerSocket(serverPort); 
       Socket listener = socket.accept(); 

       Thread client = new Thread(new ClientHandler(listener)); 
       client.start(); 

      } catch (IOException ex) { 
       log.error(new Throwable(ex)); 
      } 

코드를 모든 클라이언트

class ClientHandler implements Runnable { 

private static Logger log = Logger.getLogger(ClientHandler.class); 

private Socket listener; 

public ClientHandler(Socket listener) { 
    this.listener = listener; 
} 

public void run() { 
    try { 
     ObjectInputStream inStream = new ObjectInputStream(
       listener.getInputStream()); 
     try { 
      ServiceRequestResponse request = (ServiceRequestResponse) inStream 
        .readObject(); 
      if (request != null && request.getServiceCommand() != null) { 

       ServiceCommand command = request.getServiceCommand(); 
       log.debug("command : " + command.getCommand()); 
       log.debug("is session alive? " + request.isAlive()); 
       log.debug("ServiceCommand.CREATE_SESSION : " 
         + ServiceCommand.CREATE_SESSION.getCommand()); 
       if (!request.isAlive() 
         && command.getCommand().equals(
           ServiceCommand.CREATE_SESSION.getCommand())) { 
        // No session yet, and service command issued is login. 
        // Call login service, check credentials and create 
        // session. 
        request.setSessionId(UUID.randomUUID()); 
        log.debug("Created user session with id : " 
          + request.getSessionId()); 
       } else { 
        if (command.getCommand().equals(
          ServiceCommand.CLOSE_SESSION)) { 
         // Close session and do clean up here 
        } 
        // Here session is alive. 
        while (!ServiceCommand.CLOSE_SESSION.equals(command 
          .getCommand())) { 
         // Read the service command from the request 
         // response and 
         // Hand it over to the appropriate handler. 
        } 

       } 

      } 

     } catch (ClassNotFoundException ex) { 
      log.error(new Throwable(ex)); 
     } 

    } catch (IOException ex) { 

    } 

} 

}

+0

또한 (a) 해당 루프의 맨 아래에 EOFException을 잡아야합니다. (b) 다른 IOException을 기록하십시오. (c) finally {} 블록에서 소켓을 닫는다. – EJP

답변

3

새로운 스레드를 생성하는 클라이언트 세션 요청이 지속될 경우 긴 다음 스레드 행된 연결은 좋은 해결책입니다.

대안은 다음과 같습니다 NIO를 사용

  • ;
  • 클라이언트 요청이 짧은 경우 스레드 풀을 사용합니다.
+0

스레드 풀은 좋은 생각처럼 들리지만,이 경우에는 sessionid를 어떻게 유지합니까? 풀 이후 모든 스레드는 재사용 될 연관된 sessionid를 가질 것이다. sessionid를 고유하게 유지하려고합니다. – sachinrahulsourav

+0

클라이언트의 Socket이 키인 Map과 같이 세션 컨텍스트를 클라이언트 Socket에 연결할 수 있습니다. 또는 요청이 빈번하지 않으면 매번 소켓을 닫을 수 있습니다. 요구 사항에 따라 다릅니다. – dash1e

관련 문제