Как ведут себя обратные вызовы в библиотеке NIO.2 - PullRequest
0 голосов
/ 27 октября 2018

Я создаю небольшое клиентское / серверное приложение для чата.Я столкнулся с NIO.2 после того, как попытался смоделировать его, используя классическую библиотеку NIO.

Целью моей "симуляции" библиотеки NIO.2 с NIO classisc было использование нескольких селекторов в нескольких потоках, которые попарно соединены через ArrayBlockingQueue, чтобы избежать чтения и записи в сетиtimes.

Мой вопрос заключается в том, как обрабатывается несколько событий одновременно в библиотеке NIO.2 с использованием AsynchronousSocketChannels и CompletionHandlers (которые, на мой взгляд, являются обратными вызовами)?

Классическая NIO lib использует Selectors, которая доставляет после select вызова key set.Затем этот key set может быть повторен, и каждое событие (чтение, принятие и запись) может обрабатываться одно за другим.

С другой стороны, обратные вызовы NIO.2 не имеют такой последовательности.Они асинхронны.Так что же произойдет, если, например, 2 клиента отправляют в одно и то же время сообщение на сервер?

Затем запускаются 2 обратных вызова одновременно?И если да, то как?Каждый из них работает в отдельных потоках или нет?

И если бы я взял эти сообщения от каждого из обратных вызовов и попытался поставить их в очередь, как упоминалось ранее ArrayBlockingQueue, они бы подождали друг друга илинет?

1 Ответ

0 голосов
/ 27 октября 2018

Так что же произойдет, если, например, 2 клиента одновременно отправляют сообщение на сервер?

Клиенты не имеют общего соединения с сервером. На стороне сервера вы бы позвонили AsynchronousSocketChannel#read с обратным вызовом для обоих клиентов, который сработал бы при поступлении некоторых байтов.

По этой причине два обратных вызова могут выполняться одновременно (поскольку они асинхронные), но они все еще независимы для каждого клиента, поэтому проблем не будет.

Каждый из них работает в отдельных потоках или нет?

Это зависит от пула потоков вспомогательного AsynchronousChannelGroup (который вы можете указать самостоятельно или использовать группу по умолчанию).

Я создал простую сетевую библиотеку с NIO.2, которая, я думаю, поможет вам: https://github.com/jhg023/SimpleNet

...