Почему java.nio.SocketChannel не отправляет данные (Jdiameter)?

Я создаю простой диаметр клиента и сервера ( ссылка на источники). Клиент должен отправить 10000 сообщений ccr, но в wireshark я вижу, что будет отправлено только ~300 сообщений ccr. Другие сообщения подняли таймауты на клиенте. Я запускаю сервер и клиент на разных компьютерах с Windows 7. Я нашел в строке источников JDiameter, где jdiameter отправил ccr (строка 280), и я думаю, что в случае, когда буфер буфера сокета заполнен, ccr не отправлено. Я добавляю перед строкой 280 этот код

while(bytes.hasRemaining())

Клиент отправляет ~9900 ccr, но очень медленно. Я тестировал клиента на сервере другого диаметра, записанного на C++, клиент (на jdiameter без моих изменений) отправлял ~7000 ccr, но этот сервер размещался на debian.

Я не знаю, как решить эту проблему, спасибо за любую помощь.

1 ответ

Если отправитель отправителя возвращает ноль, это означает, что буфер отправки сокета отправителя заполнен, что, в свою очередь, означает, что буфер приема сокета получателя заполнен, что, в свою очередь, означает, что получатель читает медленнее, чем отправитель.

Так что ускори приемник.

NB В неблокирующем режиме просто зацикливание write() вызов пока он возвращает ноль не подходит. Если write() возвращает ноль, вы должны:

  1. Отменить регистрацию канала для OP_READ и зарегистрируйте его для OP_WRITE
  2. Вернитесь в цикл выбора.
  3. когда OP_WRITE пожары, сделайте запись снова. На этот раз, если он не возвращает ноль, отмените регистрацию OP_WRITE и (возможно, согласно вашим требованиям) зарегистрироваться OP_READ,

Обратите внимание, что сохранение канала зарегистрировано для OP_WRITE все время тоже не правильно. Канал сокета почти всегда доступен для записи, то есть почти всегда есть место в буфере отправки сокета. Что вас интересует, так это переход между не- записываемым и записываемым.

Другие вопросы по тегам