2012-03-29 2 views
0

현재 자바로 클라이언트/서버 애플리케이션을 개발 중이고 클라이언트 설계 방법을 생각할 수 없습니다.자바 클라이언트 설계

현재 다중 연결을 허용 할 수있는 서버가 있으며 모든 연결에는 명령을 수신하고 응답하는 루프가 있습니다. 서버는 다음과 같습니다.

try{ 

     mIn = new DataInputStream(mSocket.getInputStream()); 
     mOut = new DataOutputStream(mSocket.getOutputStream()); 

     while(true){ 

      byte tPackType = mIn.readByte(); 

      switch(tPackType){ 

       case PackType.LOGIN: 
        login(); 
        break; 
       case PackType.REGISTER: 
        register(); 
        break; 
       default: 

      } 

     } 

    }catch (IOException e){ 
     mLog.logp(Level.WARNING, this.getClass().getName(), "run()", "IOException in run()", e); 
    }finally{ 
     try{ 
      mOut.close(); 
      mIn.close(); 
      mSocket.close(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 

이제 클라이언트는 기본적으로 서버에 요청을 보내는 여러 가지 방법으로 응답을 반환합니다. 서버에서 업데이트를받을 수 있어야합니다. 해결책을 찾는데 도움이 될 수있는 독서에 대한 제안 사항을 알려 주시면 감사하겠습니다. 내가 조사 할 수있는 패턴이 있습니까?

미리 감사드립니다.

답변

1

I want to be able to receive updates from the server

나는이 작업을 수행하는 두 가지 옵션이 있다고 생각합니다.

  • 옵션 1은 클라이언트가 업데이트를 위해 서버를 폴링하도록하는 것입니다. 결국 서버에 부하가 증가하므로 권장하지 않습니다. 시스템을 확장하려고하면 성능 문제가 발생할 가능성이 큽니다.

  • 옵션 2는 클라이언트에 작은 서버를 만드는 것입니다. 기본적으로 업데이트가있을 때마다 서버는 클라이언트에 연결하여 업데이트를 보냅니다. 필자는 필요할 때만 서버와 클라이언트 간의 연결을 설정할 수 있으므로이 절차를 권장합니다. 이전 방법과 반대되는 문제는 클라이언트의 포트와 IP를 추적해야한다는 것입니다. Client ID를 키로 사용하고 연결 속성을 키로 사용하여 HashTable을 구현할 수 있습니다. 업데이트가 있으면 HashTable에서 클라이언트를 찾아 연결 정보를 얻고 연결하고 정보를 보냅니다.

클라이언트 측의 서버는 데이터를 가져 와서 업데이트를받은 후 클라이언트가 원하는대로 수행합니다.

+1

옵션 3은 클라이언트가 서버에 연결하지만 서버가 연결을 통해 업데이트를 보낼 때까지 기다리는 것입니다. 이렇게하면 폴링을 피할 수 있지만 서버가 클라이언트에 연결을 다시 시작하는 것을 방지하여 방화벽이 관련되어있을 때 문제를 일으키는 경향이 있습니다. (이상한 점도 있습니다.) – Wyzard

+0

@Wyzard : 올바르게 이해하고 있다면 클라이언트가 서버의 포트를 열고 아무것도하지 않고 열어두기를 원하십니까? – npinti

+0

* 연결 *을 열지 만 예. ("포트 열기"는 들어오는 연결을 수신하거나 연결을 허용하도록 방화벽을 구성하는 것을 의미합니다.) 클라이언트는 서버의 주소를 알고 서버가 모든 클라이언트의 주소를 알 필요가 없으므로 연결을 시작합니다. 구애. 그러나 일단 연결되면 서버는 업데이트를 보낼시기를 알고 클라이언트는 그렇지 않습니다. 따라서 서버가 업데이트를 시작합니다. – Wyzard