0
我自己使用java nio和選擇器創建了一個服務器。如果需要,我可以直接從客戶那裏收到數據和答案。Java nio服務器客戶端異步
但是現在我想要一個線程來處理數據,並且每次它都會向每個客戶端發送數據。
那麼我該怎麼做呢?還有如何在內存中保存所有通道以將數據寫入每個客戶端?
如果你需要我可以用java nio發佈我的代碼的一部分。
我自己使用java nio和選擇器創建了一個服務器。如果需要,我可以直接從客戶那裏收到數據和答案。Java nio服務器客戶端異步
但是現在我想要一個線程來處理數據,並且每次它都會向每個客戶端發送數據。
那麼我該怎麼做呢?還有如何在內存中保存所有通道以將數據寫入每個客戶端?
如果你需要我可以用java nio發佈我的代碼的一部分。
使用可運行的程序創建一個新線程,並確保它知道您的服務器,因爲您的服務器應該知道所有客戶端。如果客戶端發送消息通過數據處理器線程解析它,並讓它執行它的工作。完成處理任務後,讓服務器知道,以便他可以更新所有客戶端。
提示:您應該爲處理線程創建一個類似於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);
}
如果你要處理一個單獨的線程每個連接有不需要通過添加NIO來迷惑自己。只需使用java.net類即可。 – EJP 2012-08-09 22:24:32
我的服務器可以接受+ -50個客戶端,我不會創建1個線程/客戶端。我只需要在內存中保留所有客戶端通道以在需要時發送數據。 – kinaesthesia 2012-08-10 07:17:13