2012-08-09 257 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); 

}