【问题标题】:Java nio server client asynchonousJava nio 服务器客户端异步
【发布时间】:2012-08-07 01:47:20
【问题描述】:

我使用 java nio 和选择器自己制作了一个服务器。如果需要,我可以直接从客户那里接收数据并回答。

但现在我想要一个线程来处理数据,并且它会随时向每个客户端发送数据。

那我该怎么做呢?另外如何将所有通道保存在内存中以将数据写入每个客户端?

如果您需要,我可以使用 java nio 发布我的部分代码。

【问题讨论】:

  • 如果您想在单独的线程中处理每个连接,则无需通过将 NIO 添加到其中来混淆自己。只需使用 java.net 类。
  • 我的服务器可以接受 +-50 个客户端,我不会创建 1 个线程/客户端。如果需要,我只需要保留所有客户端通道以发送数据。

标签: java multithreading sockets io socketchannel


【解决方案1】:

使用可运行对象创建一个新线程,并确保它知道您的服务器,因为您的服务器应该知道所有客户端。如果客户端发送一条消息,通过数据处理器线程解析它并让它完成它的工作。完成处理您的任务后,请让服务器知道,以便他可以更新所有客户端。

提示:您应该使用LinkedBlockingQueue 之类的东西为处理线程创建一个等待队列,这样您就可以始终将任务放入队列中,而无需等待任务完成。然后tad将等待队列中需要处理的东西。这样处理线程只会在队列中有实际任务时才使用 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);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多