Я создаю клиент и сервер с простым диаметром (ссылка на источники). Клиент должен отправлять сообщения 10000 ccr, но в wirehark я вижу только ~ 300 ccr сообщений. Другие сообщения накладывали таймауты на клиента. Я запускаю сервер и клиент на разных компьютерах с окнами 7. Я нашел в строке источников JDiameter, где jdiameter sended ccr (строка 280), и я думаю, в случае, если отправка буфера сокета полна ccr not sended. Я добавляю перед строкой 280 этот код
while(bytes.hasRemaining())
Клиент отправил ~ 9900 ccr, но очень медленно. Я протестировал клиента на другом сервере с диагнозом wroted на c++, клиент (по jdiameter без моих изменений) отправил ~ 7000 ccr, но этот сервер размещался на debian.
Я не знаю, как решить эту проблему, спасибо за любую помощь.
Если отправитель отправляет нулевое значение, это означает, что буфер отправки сокета отправителя заполнен, что, в свою очередь, означает, что приемный приемный буфер приема заполнен, что, в свою очередь, означает, что приемник читает медленнее, чем отправитель отправляет.
Так что ускорьте приемник.
NB В неблокирующем режиме, просто цикл вокруг вызова write()
когда он возвращает ноль, не является адекватным. Если write()
возвращает ноль, вы должны:
OP_READ
регистрацию канала для OP_READ
и зарегистрируйте его для OP_WRITE
OP_WRITE
, повторите запись. На этот раз, если он не вернет нуль, OP_WRITE
и (возможно, согласно вашим требованиям) зарегистрируйте OP_READ
. Обратите внимание, что сохранение канала, зарегистрированного для OP_WRITE
все время неверно. Канал сокета почти всегда доступен для записи, что означает, что в буфере отправки сокетов почти всегда есть место. Что вас интересует - это переход между незаписываемыми и доступными для записи.
while (bytes.hasRemaining())
while (rc < bytes.array().length)
которые я нашел по вашей ссылке, являются правильным способом записи в NIO.