Netty и TCP - Как правильно отправить пустое сообщение - PullRequest
0 голосов
/ 15 октября 2019

У нас есть простой TCP-сервер за сетевым ELB AWS (похожий на Echo-сервер с долгоживущими соединениями), написанный на Netty, и я пытаюсь реализовать механизм keep-alive, похожий на механизм keep-alive TCP, чтобы сохранить нашсвободные соединения открыты. К сожалению, мы не можем полагаться на механизм поддержания активности TCP, поскольку NELB не пересылают TCP-пакеты проверки активности на другую сторону loadbalancer.
Что я думаю сделать, это наблюдать за незанятыми соединениями и отправлять пустую строку (пустой байтовый массив) клиентам. То, что я до сих пор делал в коде:

  1. Добавление IdleStateHandler с некоторыми значениями времени ожидания
  2. Регистрация GprsKeepAliveHandler, подкласс ChannelDuplexHandler, переопределение userEventTriggered метод отправки (ctx.writeAndFlush) Unpooled.EMPTY_BUFFER.

Таким образом, я ожидаю получить пакет RST, если соединение разорвано. В противном случае соединение снова станет активным.

Проблема в том, что Netty ничего не делает с пустым сообщением, не отправляет клиенту никаких пакетов (отслеживается с помощью Wireshark). Если я изменю сообщение на Unpooled.wrappedBuffer(new byte[]{0}), я увижу то, что ожидаю увидеть.

Вопросы

  1. Я не смог найти лучшего способа достичь своей цели (сохраняйте связиживы и обнаруживают мертвые соединения). Если есть лучший способ, пожалуйста, дайте мне знать.
  2. Как правильно отправить пустое сообщение в Netty? (Я видел этот вопрос, но он не помог)
  3. Если проблема связана с поведением стека TCP в ОС, есть ли способ решить эту проблему?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Похоже, что Netty не делает никаких системных вызовов в случае пустых сообщений. (см. это )

0 голосов
/ 11 ноября 2019

с моей точки зрения, вам нужно отправить что-то осмысленное, потому что вы пытаетесь это сделать (например, пинг / понг, сердцебиение). Также см. Можно ли заставить TCP-сокет отправлять 0 байтов в случае потери пакетов - python

...