|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
Пытаюсь разобраться с NIO и есть вопросы, которые я недопонимаю: 1. Когда я хочу писать данные в канал, я должен сменить опцию SelectionKey на OP_WRITE. Для чего? Я так понимаю, это указатель селектору, что буфер данного канала наполняется моими данными и его нужно отправить клиенту. А что, если клиент начнет писать в это время в канал? Происходит ли какая-нибудь синхронизация действий между клиентом и сервером. 2. Selector выбирает SelectionKey с опцией OP_READ и понимает, что в этом канале есть данные для считывания. Эта опция включается автоматически, когда в канале есть данные, или ее включает клиент, который хочет отправить данные? 3. Возможно ли подключение обычного сокета к NIO серверу. Если да, то что произойдет, когда сокет запишет данные в OutPutStream? Может ли SocketChannel принять их? Прошу, без упреков и иронии. Мне просто нужно разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2018, 20:04 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
Ты через какие классы с NIO работаешь ? Lemkoleg1. Когда я хочу писать данные в канал, я должен сменить опцию SelectionKey на OP_WRITE. Х.з. не помню Самое простое взять какой-то пример кода (Hello World ))) ) и смотреть как в нем идет работа. LemkolegА что, если клиент начнет писать в это время в канал? Происходит ли какая-нибудь синхронизация действий между клиентом и сервером. Обмен дуплексный. У сервера отдельный буфер на read и write. Т.ч. передача от сервера к клиенту на физическом уровне никак с передачей от клиента к серверу не связана и никак друг другу не мешает. https://ru.wikipedia.org/wiki/Дуплекс_(телекоммуникации) Lemkolegс опцией OP_READ и понимает, что в этом канале есть данные для считывания. Эта опция включается автоматически, когда в канале есть данные, или ее включает клиент, который хочет отправить данные? Как данные от клиента поступят, так канал на сервере и изменит свой режим. LemkolegВозможно ли подключение обычного сокета к NIO серверу. Если да, то что произойдет, когда сокет запишет данные в OutPutStream? Может ли SocketChannel принять их? Да, разумеется. AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2018, 20:22 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Ок, с коллизией - понятно. Есть два буффера. Но: если я отправляю данные, значение опции зтановится OP_WRITE. Я правильно понимаю: чтобы селектор выбирал этот ключ, и активировал процесс записи в канал, когда в буфере есть данные. Но, если клиент, начнет отправлят свои данные, опция переключиться на OP_READ. И, тогда, селектор не выберет канал для записи моих данных? Не могу понять механизм ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2018, 21:16 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
"Тот самый случай" когда полезно начинать с основ. Основа - вызов select() в берклиевском API сокетов. Дальнейшие оптимизации не рассматриваем для простоты. Сокет - некая структуа (описатель), содержащая указатели на разные буферы, флаги и т.п. Флаги "есть данные для отправки", "есть данные для чтения", "возникла ошибка" и т.п. - отдельные флаги, состояние которых меняется независимо. А раз "независимо", то состояния флагов могут меняться "одновременно" или "почти одновременно". Отсюда мораль: не надо пытаться работать с NIO в однопоточном приложении - мозг сломаете, а толку всё равно не будет. Создаёте поток-читатель, поток-писатель и аккуратно реализуете синхронизацию между ними там, где это требуется логикой вашего приложения. Прочие оптимизации делаете тогда, когда заработает простейший вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 11:58 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
Отсюда мораль: не надо пытаться работать с NIO в однопоточном приложении - мозг сломаете, а толку всё равно не будет. Создаёте поток-читатель, поток-писатель и аккуратно реализуете синхронизацию между ними там, где это требуется логикой вашего приложения. Если я правильно понимаю: флаги (OP_WRITE, OP_READ) нужны, как раз, для однопоточной работы. То-есть, если у меня есть поток-писатель, имеющий в своем распоряжении, в текущий момент, необходимый канал, этот поток может спокойно писать в него, не обращая внимания на флаги и не манипулируя ими? Т.к. у него свой исходящий буфер и поток-писатель уверен, что кроме него никто писать больше не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 12:27 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
API надо читать целиком, а не куски из отдельных классов. Если мы задаёмся вопросом "Как читать из канала", то ответ ровно один - получить ReadableByteChannel . Аналогично и для с записи, только интерфейс будет WritableByteChannel . Если мы хотим знать, как организовать эффективные чтение/запись из большого количества малоактивных каналов , то тогда нам требуются селекторы и ключи. Селектор объединяет каналы в группу, над которой можно делать выборку по заданным значениям ключей. Регистрируя канал в группе, мы указываем набор операций, которые будут отслеживаться для данного канала. Если всё это вам непонятно, то или вам всё это не нужно или вы решаете задачу неправильным способом. P.S. Селекторы могут быть полезны и для высокоактивных каналов, но это, скорее всего, будет ситуация с конкуренцией за другой ресурс. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 12:49 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
Селектор объединяет каналы в группу, над которой можно делать выборку по заданным значениям ключей. Регистрируя канал в группе, мы указываем набор операций, которые будут отслеживаться для данного канала. О чем и собственно вопрос: Флаги нужны для однопоточной обработки селектора. То-есть, поток, который занимается просмотров ключей в селектора с интересующими флагами. Операции записи и чтения в потоки не имеет к флагам никакого отношения. Я имею ввиду, какой бы флаг не стоял в данный момент на ключе в селектора, в этот канал можно писать и читать из него.? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 12:56 |
|
Помогите разобраться с NIO
|
|||
---|---|---|---|
#18+
LemkolegО чем и собственно вопрос: Флаги нужны для однопоточной обработки селектора.Нет.То-есть, поток, который занимается просмотров ключей в селектора с интересующими флагами."Это" не работает "так". Когда вам "нечего делать", вы делаете вызов на селекторе, указывая набор интересующих операций. Возврат из вызова произойдёт когда появятся объекты с нужными состояниями. Механизм обнаружения таких объектов сильно зависит от операционной системы и никак не конкретизируется в API.Я имею ввиду, какой бы флаг не стоял в данный момент на ключе в селектора, в этот канал можно писать и читать из него.?Дались вам эти флаги ... SelectableChannel это даже не интерфейс - там есть конкретный метод register(). Создаются каналы, регистрируются в селекторе, а затем вы получаете набор каналов, готовых к указанным вами операциям и "что-то делаете" с каналами из этого набора. Можете даже с одиночным каналом работать, используя унифицированный механизм проверки готовности канала к той или иной операции. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.12.2018, 13:55 |
|
|
start [/forum/topic.php?fid=59&fpage=36&tid=2121625]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
33ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 354ms |
total: | 479ms |
0 / 0 |