В моей программе, использующей java nio, socketchannel.write() становится очень медленным, когда он пытается последовательно писать сообщения 10 КБ. Измеренное время для записи полного сообщения 10 КБ составляет от 160 мс до 200 мс. Но время для написания полного сообщения размером 5 КБ составляет всего 0,8 мс.socketchannel.write() становится очень медленным, когда размер сообщения большой.
В селекторе у меня есть только Selection.OP_READ и не обрабатывать Selection.OP_WRITE. Когда получено большое полное сообщение, оно записывается в другой приемник 4 раза.
Есть ли у кого-то такая же проблема? Есть сообщение о socketchannel.write() медленно. Мой вопрос заключается в том, как чередовать изменения между OP_READ и OP_WRITE?
Если я добавляю inerval, например 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);
}
Я предполагаю, что он пытается постоянно посылать один единственный TCP пакет 10KB, который терпит неудачу много. –
Сообщения публикуются последовательно. Топология - это цепочка узлов. Интервал сообщения составляет 100 мс – susan
@MartijnCourteaux No. Пакетирование TCP происходит на более низком уровне. Он не будет пытаться отправить IP-пакет> MTU пути. – EJP