powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите разобраться с NIO
9 сообщений из 9, страница 1 из 1
Помогите разобраться с NIO
    #39741506
Lemkoleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пытаюсь разобраться с NIO и есть вопросы, которые я недопонимаю:

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

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

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

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

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

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

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

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

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

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

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

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


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