2012-08-09 3 views
0

나는 자바 nio와 셀렉터를 사용하여 서버를 직접 만들었다. 필자는 필요할 경우 데이터를 받고 클라이언트로부터 직접 대답 할 수 있습니다.자바 nio 서버 클라이언트 asynconous

하지만 지금은 데이터를 처리 할 스레드가 필요하며 언제든지 각 클라이언트에 데이터를 보낼 것입니다.

어떻게하면됩니까? 또한 모든 채널을 메모리에 저장하여 각 클라이언트에 데이터를 쓰는 방법은 무엇입니까?

필요한 경우 java nio를 사용하여 코드의 일부를 게시 할 수 있습니다.

+0

당신이 별도의 스레드에서 각 연결을 처리하려는 경우입니다 NIO를 추가하여 혼동 할 필요가 없습니다. java.net 클래스 만 사용하면됩니다. – EJP

+0

내 서버가 +50 클라이언트를 허용 할 수 있습니다. 스레드/클라이언트를 1 개 만들지 않습니다. 필요한 경우 데이터를 전송하기 위해 모든 클라이언트 채널을 메모리에 유지하면됩니다. – kinaesthesia

답변

1

실행 가능한 새 스레드를 만들고 서버가 모든 클라이언트를 알아야하므로 서버를 알고 있는지 확인하십시오. 클라이언트가 메시지를 보내면 데이터 프로세서 스레드를 통해 메시지를 구문 분석하고 처리합니다. 작업 처리가 완료되면 서버에 알려서 모든 클라이언트를 업데이트 할 수있게하십시오.

팁 : 처리 스레드의 대기열을 LinkedBlockingQueue과 같이 만들어야 작업이 완료 될 때까지 기다리지 않고 항상 작업을 대기열에 넣을 수 있습니다. 그런 다음 테드는 처리해야 할 큐에서 기다릴 것입니다. 큐 여기

에 실제로 작업이있을 때 처리 스레드는 CPU 리소스를 사용하는이 방법은 코드 예제

public abstract class Queue implements Runnable { 
private final LinkedBlockingQueue<Message> queue; 

public Queue() { 
    this.queue = new LinkedBlockingQueue<Message>(); 
} 

/** 
* Adds a message to the queue. 
* @param message 
*/ 
public void add(final Message message) { 
    try { 
     queue.put(message); 
    } catch (final InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

/** 
* Waits for new messages 
*/ 
@Override 
public void run() { 
    while(true) { 
     try { 
      final Message message = queue.take(); 
      processMessage(message); 
     } catch (final InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

/** 
* Processes the new message 
*/ 
protected abstract void processMessage(Message message); 

}