2014-03-18 5 views
1

Я создаю клиент и сервер с простым диаметром (Link to sources). Клиент должен отправлять сообщения 10000 ccr, но в wirehark я вижу только ~ 300 ccr сообщений. Другие сообщения накладывали таймауты на клиента. Я запускаю сервер и клиент на разных компьютерах с окнами 7. Я нашел в источниках JDiameter line where jdiameter sended ccr (line 280), и я думаю, что в случае отправки буфера сокета полный ccr не отсканирован. Добавить перед строкой 280 этот кодПочему java.nio.SocketChannel не отправляет данные (Jdiameter)?

while(bytes.hasRemaining()) 

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

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

ответ

1

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

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

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

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

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

+0

Я увеличиваю прием и отправку буферов сокетов в 1mb в TcpTransportClient.intialize: socketChannel.socket(). SetReceiveBufferSize (размер); socketChannel.socket(). SetSendBufferSize (размер); И добавьте этот код для отправкиMessage: rc = socketChannel.write (bytes); if (rc == 0) while (bytes.hasRemaining()) { Thread.sleep (10l); rc = socketChannel.write (байты); } Работает отлично с сервером диаметра на C++ на debian, но на сервере jdiameter проблема не решена. – MadCrank

+0

@MadCrank Повышение размеров буфера не ускоряет приемник, и это действительно только отвлекает проблему. Вы не отправили свой исходный код, но ни 'while (bytes.hasRemaining())' и 'while (rc EJP

+0

Нужно ли отменить регистрацию OP_READ? – mike

 Смежные вопросы

  • Нет связанных вопросов^_^