Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с NIO / 9 сообщений из 9, страница 1 из 1
01.12.2018, 20:04
    #39741506
Lemkoleg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
Пытаюсь разобраться с NIO и есть вопросы, которые я недопонимаю:

1. Когда я хочу писать данные в канал, я должен сменить опцию SelectionKey на OP_WRITE. Для чего? Я так понимаю, это указатель селектору, что буфер данного канала наполняется моими данными и его нужно отправить клиенту. А что, если клиент начнет писать в это время в канал? Происходит ли какая-нибудь синхронизация действий между клиентом и сервером.

2. Selector выбирает SelectionKey с опцией OP_READ и понимает, что в этом канале есть данные для считывания. Эта опция включается автоматически, когда в канале есть данные, или ее включает клиент, который хочет отправить данные?

3. Возможно ли подключение обычного сокета к NIO серверу. Если да, то что произойдет, когда сокет запишет данные в OutPutStream?
Может ли SocketChannel принять их?

Прошу, без упреков и иронии. Мне просто нужно разобраться.
...
Рейтинг: 0 / 0
01.12.2018, 20:22
    #39741512
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
Ты через какие классы с NIO работаешь ?

Lemkoleg1. Когда я хочу писать данные в канал, я должен сменить опцию SelectionKey на OP_WRITE.

Х.з. не помню
Самое простое взять какой-то пример кода (Hello World ))) ) и смотреть как в нем идет работа.

LemkolegА что, если клиент начнет писать в это время в канал? Происходит ли какая-нибудь синхронизация действий между клиентом и сервером.

Обмен дуплексный. У сервера отдельный буфер на read и write. Т.ч. передача от сервера к клиенту на физическом уровне никак с передачей от клиента к серверу не связана и никак друг другу не мешает.
https://ru.wikipedia.org/wiki/Дуплекс_(телекоммуникации)

Lemkolegс опцией OP_READ и понимает, что в этом канале есть данные для считывания. Эта опция включается автоматически, когда в канале есть данные, или ее включает клиент, который хочет отправить данные?

Как данные от клиента поступят, так канал на сервере и изменит свой режим.

LemkolegВозможно ли подключение обычного сокета к NIO серверу. Если да, то что произойдет, когда сокет запишет данные в OutPutStream?
Может ли SocketChannel принять их?

Да, разумеется.

AFAIK
...
Рейтинг: 0 / 0
01.12.2018, 21:16
    #39741525
Lemkoleg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
Leonid Kudryavtsev,
Ок, с коллизией - понятно. Есть два буффера. Но: если я отправляю данные, значение опции зтановится OP_WRITE. Я правильно понимаю: чтобы селектор выбирал этот ключ, и активировал процесс записи в канал, когда в буфере есть данные. Но, если клиент, начнет отправлят свои данные, опция переключиться на OP_READ. И, тогда, селектор не выберет канал для записи моих данных? Не могу понять механизм
...
Рейтинг: 0 / 0
02.12.2018, 11:58
    #39741614
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
"Тот самый случай" когда полезно начинать с основ.
Основа - вызов select() в берклиевском API сокетов. Дальнейшие оптимизации не рассматриваем для простоты.
Сокет - некая структуа (описатель), содержащая указатели на разные буферы, флаги и т.п.
Флаги "есть данные для отправки", "есть данные для чтения", "возникла ошибка" и т.п. - отдельные флаги, состояние которых меняется независимо.
А раз "независимо", то состояния флагов могут меняться "одновременно" или "почти одновременно".

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

Прочие оптимизации делаете тогда, когда заработает простейший вариант.
...
Рейтинг: 0 / 0
02.12.2018, 12:27
    #39741625
Lemkoleg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
Отсюда мораль: не надо пытаться работать с NIO в однопоточном приложении - мозг сломаете, а толку всё равно не будет.
Создаёте поток-читатель, поток-писатель и аккуратно реализуете синхронизацию между ними там, где это требуется логикой вашего приложения.
Если я правильно понимаю: флаги (OP_WRITE, OP_READ) нужны, как раз, для однопоточной работы. То-есть, если у меня есть поток-писатель, имеющий в своем распоряжении, в текущий момент, необходимый канал, этот поток может спокойно писать в него, не обращая внимания на флаги и не манипулируя ими? Т.к. у него свой исходящий буфер и поток-писатель уверен, что кроме него никто писать больше не будет.
...
Рейтинг: 0 / 0
02.12.2018, 12:49
    #39741630
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
API надо читать целиком, а не куски из отдельных классов.

Если мы задаёмся вопросом "Как читать из канала", то ответ ровно один - получить ReadableByteChannel .
Аналогично и для с записи, только интерфейс будет WritableByteChannel .

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

Если всё это вам непонятно, то или вам всё это не нужно или вы решаете задачу неправильным способом.

P.S.
Селекторы могут быть полезны и для высокоактивных каналов, но это, скорее всего, будет ситуация с конкуренцией за другой ресурс.
...
Рейтинг: 0 / 0
02.12.2018, 12:56
    #39741633
Lemkoleg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
Селектор объединяет каналы в группу, над которой можно делать выборку по заданным значениям ключей.
Регистрируя канал в группе, мы указываем набор операций, которые будут отслеживаться для данного канала.

О чем и собственно вопрос: Флаги нужны для однопоточной обработки селектора. То-есть, поток, который занимается просмотров ключей в селектора с интересующими флагами. Операции записи и чтения в потоки не имеет к флагам никакого отношения. Я имею ввиду, какой бы флаг не стоял в данный момент на ключе в селектора, в этот канал можно писать и читать из него.?
...
Рейтинг: 0 / 0
02.12.2018, 13:55
    #39741652
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
LemkolegО чем и собственно вопрос: Флаги нужны для однопоточной обработки селектора.Нет.То-есть, поток, который занимается просмотров ключей в селектора с интересующими флагами."Это" не работает "так".
Когда вам "нечего делать", вы делаете вызов на селекторе, указывая набор интересующих операций.
Возврат из вызова произойдёт когда появятся объекты с нужными состояниями.
Механизм обнаружения таких объектов сильно зависит от операционной системы и никак не конкретизируется в API.Я имею ввиду, какой бы флаг не стоял в данный момент на ключе в селектора, в этот канал можно писать и читать из него.?Дались вам эти флаги ...
SelectableChannel это даже не интерфейс - там есть конкретный метод register().

Создаются каналы, регистрируются в селекторе, а затем вы получаете набор каналов, готовых к указанным вами операциям и "что-то делаете" с каналами из этого набора.
Можете даже с одиночным каналом работать, используя унифицированный механизм проверки готовности канала к той или иной операции.
...
Рейтинг: 0 / 0
02.12.2018, 13:57
    #39741653
Lemkoleg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с NIO
Basil A. Sidorov,
Спасибо
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с NIO / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]