2012-08-09 199 views
0

我自己使用java nio和選擇器創建了一個服務器。如果需要,我可以直接從客戶那裏收到數據和答案。Java nio服務器客戶端異步

但是現在我想要一個線程來處理數據,並且每次它都會向每個客戶端發送數據。

那麼我該怎麼做呢?還有如何在內存中保存所有通道以將數據寫入每個客戶端?

如果你需要我可以用java nio發佈我的代碼的一部分。

+0

如果你要處理一個單獨的線程每個連接有不需要通過添加NIO來迷惑自己。只需使用java.net類即可。 – EJP 2012-08-09 22:24:32

+0

我的服務器可以接受+ -50個客戶端,我不會創建1個線程/客戶端。我只需要在內存中保留所有客戶端通道以在需要時發送數據。 – kinaesthesia 2012-08-10 07:17:13

回答

1

使用可運行的程序創建一個新線程,並確保它知道您的服務器,因爲您的服務器應該知道所有客戶端。如果客戶端發送消息通過數據處理器線程解析它,並讓它執行它的工作。完成處理任務後,讓服務器知道,以便他可以更新所有客戶端。

提示:您應該爲處理線程創建一個類似於LinkedBlockingQueue的等待隊列,以便您始終可以將任務放入隊列中,而無需等待任務完成。然後,thead將等待隊列中需要處理的事情。這樣的處理線程將只使用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); 

}