2015-02-02 3 views
1

У меня есть путаница на onWrite метода Java NIO, когда селектор готов писать я должен:java.nio на Write смятении

1: Регистрация/Изменение OP_Write

2: Если запись возвращает 0, что мне делать?

3: После записи следует ли регистрировать или изменять операционные системы?

канал установлен в Неблокирующий

....onAccept register OP_READ 

public void onWrite() 
{ 
      ByteBuffer bb = ByteBuffer.wrap(msg.encode()); 

      while(bb.remaining()!= 0){ 
       int ret = socketChannel.write(bb); 

       if(ret == 0){ 

        //Should I register or should I change op? 

        //socketChannel.register(selector, SelectionKey.OP_WRITE, null); 

        //selectionKey.interestOps(SelectionKey.OP_WRITE); 
       } 
      } 

      //Is it necessary to change op or re-register Read or 0 

      //socketChannel.register(selector, SelectionKey.OP_READ, null); 
      //selectionKey.interestOps(SelectionKey.OP_READ); 
      //selectionKey.interestOps(0); 
} 

Я пытаюсь выполнить самую низкую задержку, возможно. И канал не будет возвращаться назад, он просто будет читать или писать.

ответ

3

когда селектор готов писать я должен:

1: Регистрация/Изменение OP_Write

Это уже зарегистрирован. Это не имеет смысла.

2: Если Write возвращает 0, что мне делать?

Зарегистрировать OP_WRITE.

3: После записи следует ли регистрировать или изменять операционные системы?

Если он не возвращает ноль, отмените регистрацию OP_WRITE.

канал установлен в Неблокирующий

Конечно, иначе вы ничего не могли зарегистрировать.

В принципе, у вас есть весь вопрос обратно. Вы должны только зарегистрировать OP_WRITE в случае (2). Не всегда. Просто напишите, когда вам что-то нужно написать, а затем найдите случай 2. Затем, когда OP_WRITE запускается, записывает и ищет случай 3.

+0

Спасибо за быстрый ответ, все эти разные руководства в Интернете смутили меня .. – feco

+0

еще одно сомнение, отмените регистрацию и зарегистрируйтесь внутри цикла? – feco

+1

Многие из них ошибаются или чрезмерно сложны, с ненужными очередями регистрации/регистрации, или не знают разницы между отменой ключа и закрытием канала или их обоим, или считают, что вы ничего не можете писать до тех пор, пока не начнется OP_WRITE. (2) находится рядом с обычным кодом записи, который находится внутри или вне цикла выбора, в зависимости от того, когда вам нужно писать; (3) находится внутри цикла выбора, в коде записи, который восстанавливается с нулевой записи. – EJP