Клиент сервера Java nio асинхронный

Я сделал сервер сам, используя Java Nio и селектор. Я могу получить данные и ответить непосредственно от клиента, если это необходимо.

Но теперь я хочу поток, который будет обрабатывать данные, и в любое время он будет отправлять данные каждому клиенту.

Так как я могу это сделать? Также как сохранить в памяти все каналы для записи данных каждому клиенту?

Если вам нужно, я могу опубликовать часть своего кода с помощью Java Java.

1 ответ

Решение

Создайте новый поток с работоспособным и убедитесь, что он знает ваш сервер, потому что ваш сервер должен знать всех клиентов. Если клиент отправляет сообщение, проанализируйте его через поток процессора данных и дайте ему выполнить свою работу. Когда вы закончите обработку вашей задачи, сообщите об этом серверу, чтобы он мог обновить всех клиентов.

Совет: вы должны создать очередь ожидания для потока обработки с чем-то вроде LinkedBlockingQueue, чтобы вы всегда могли ставить задачи в очередь, не дожидаясь ее завершения. Затем thead будет ждать вещей в очереди, которые нужно обработать. Таким образом, поток обработки будет использовать ресурсы ЦП только тогда, когда в очереди фактически есть задачи.

Вот пример кода

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);

}

Другие вопросы по тегам