В моей программе, использующей java nio, socketchannel.write () становится очень медленным, когда пытается последовательно написать сообщения размером 10 КБ.Измеренное время для записи полного сообщения 10 КБ составляет от 160 мс до 200 мс.Но время записи полного 5 КБ сообщения составляет всего 0,8 мс.
В селекторе у меня есть только Selection.OP_READ и я не обрабатываю Selection.OP_WRITE.Когда получено большое полное сообщение, оно записывается другому получателю 4 раза.
Есть ли у кого-нибудь такая же проблема?Там есть пост про socketchannel.write () медленный.У меня вопрос, как чередовать изменения между OP_READ и OP_WRITE?
Если добавить инервал, например, 150 мс, время отклика уменьшится.Есть ли способ узнать, когда буфер заполнен, чтобы я мог позволить программе ждать.Моя операционная система Windows XP.
Спасибо.
Я следую совету EPJ, проверяя количество записанных байтов.Но время отклика все еще велико.Я публикую здесь часть своего кода и хотел бы проверить, не является ли это ошибкой в моем коде.
// это часть writeData () с использованием nio:
while (buffer.hasRemaining()) {
try {
buffer.flip();
n = socket.write(buffer);
if(n == 0) {
key.interestOps(SelectionKey.OP_WRITE);
key.attach(buffer);
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
buffer.compact();
}
}
if(buffer.position()==0) {
key.interestOps(SelectionKey.OP_READ);
}