2012-10-23 2 views
1

소켓 프로그래밍 및 Java UDP 단순 클라이언트 - 서버 애플리케이션 프로그래밍에 익숙하지 않습니다. 나는 시간/날짜 서버 클라이언트를 쓰고있다. 클라이언트는 서버에 시간과 날짜를 요청할 수 있으며 응답을 기다립니다. 또한 매분마다 서버는 모든 클라이언트를 현재 시간으로 업데이트합니다. 클라이언트는 데이터 그램 UDP를 사용하여 확인 응답 보내기 및 수신

  1. 하려면 서버와 접촉을 시작하고 다시
  2. 은 내가 할 수있는 방법이

를 사용하여 서버에서 주기적으로 업데이트를 수신 메시지를 기다릴 수 필요 단일 DatagramSocket?

두 스레드를 생성하려고합니다. 하나는 수신 대기열이고 다른 하나는 쓰는 스레드입니다. 문제는 클라이언트가 서버와의 연결을 시작하는 경우 서버로부터 수신 확인을 받기 위해 기다려야한다는 것입니다. 따라서 쓰기 쓰레드는 서버의 패킷을 때때로 수신해야합니다. 하지만이 경우에는 두 개의 스레드가 수신 대기하고 잘못된 스레드가 수신 확인을 받게됩니다.

입력을받는 스레드를 지정하는 방법이 있습니까? 아니면이 문제를 해결할 다른 방법이 있습니까?

나는이 해답을 찾고 있었지만 찾지 못했습니다. 내가 찾은 가장 가까운 것은 Java sockets: can you send from one thread and receive on another?

+0

이것이 클라이언트/서버 응용 프로그램 인 경우 TCP가 훨씬 더 적합 할 것입니다 ... – ryan0

답변

0

작가 스레드가 하나만 있으면 요청을 보내고 대기 루프로 들어갈 수 있습니다. 그런 다음 리스너 스레드는 응답을 가져 와서 공유 변수 (예 : AtomicReference)에 추가 한 다음 작성자에게 응답을 수신했음을 알립니다.

// both write and listener threads will need to share this 
    private final AtomicReference<Response> responseRef = 
    new AtomicReference<Response>(); 
    ... 
    // writer-thread 
    writeRequest(request); 
    synchronize (responseRef) { 
    while (responseRef.get() == null) { 
     // maybe put a timeout here 
     responseRef.wait(); 
    } 
    } 
    processResponse(response); 
    ... 

    // listener-thread 
    Response response = readResponse(); 
    synchronize (responseRef) { 
    responseRef.set(response); 
    responseRef.notify(); 
    } 

동시에 여러 작성자 또는 여러 요청을 보내는 경우에는 더욱 복잡해집니다. 각 요청에 대해 일종의 고유 ID를 보내고 응답에 반환해야합니다. 그런 다음 응답 스레드는 요청을 응답과 일치시킬 수 있습니다. 응답자가 특정 요청을 일치시키고 응답을 추가하고 적절한 대기 스레드에 알릴 수 있도록 ConcurrentHashMap 또는 다른 공유 모음이 필요합니다.

관련 문제