2013-01-02 2 views
6

Я использую Netty версии 2.6.0.Final.Netty - вызов channel.disconnect() фактически закрывает канал

Если я правильно понимаю документацию Netty, вызов функции disconnect() на канале должен позволить мне позвонить connect() для подключения позже. Однако, когда я вызываю disconnect(), вызываются как channelDisconnected(), так и channelClosed() моего подкласса SimpleChannelHandler.

Я открыл это в режиме отладки и в основном порядок событий:

  1. Я называю разъединение() на моем канале
  2. Channels.disconnect() вызывается:

    public static ChannelFuture disconnect(Channel channel) { 
        ChannelFuture future = future(channel); 
        channel.getPipeline().sendDownstream(new DownstreamChannelStateEvent(
         channel, future, ChannelState.CONNECTED, null)); 
        return future; 
    } 
    
  3. В конечном счете вызывается NioSocketPipelineSink.eventSunk(), а соответствующая часть:

    case CONNECTED: 
         if (value != null) { 
          connect(channel, future, (SocketAddress) value); 
         } else { 
          channel.worker.close(channel, future); 
         } 
         break; 
    

Так, так как значение равно нулю и состояние CONNECTED, канал закрывается (хотя по here СВЯЗАННЫХ с нулем следует указать запрос на отключение, не обязательно близко.

Так что я что-то пропустил? Какой смысл отключать(), если он просто приводит к закрытию канала?

Это не огромная проблема, потому что, если мне нужно, я могу просто создать новый канал для своей ситуации, но из первоначальной проверки это кажется ошибкой Netty, если только я не просто недопонимаю, как это предполагается работа, или я делаю что-то глупое.

ответ

7

Одно из намерений Netty - представить унифицированную абстракцию канала, которая работает более или менее одинаково для ориентированных на соединение сокетов (TCP), так как для соединений с меньшим количеством сокетов (UDP), независимо от базовой реализации, OIO, NIO или AIO. Поскольку существует немало различий, унифицированный интерфейс будет немного странным для некоторых частей конкретной реализации.

Акт отключения TCP-сокета подразумевает его закрытие (по крайней мере, с точки зрения Java API). Но отсоединение сокета UDP не подразумевает его закрытия, просто удаляя связь между локальным IP-адресом/портом и удаленным IP-адресом/портом.

Итак, нет, вы не делаете ничего глупого, но я бы рекомендовал действовать вместо OPEN/CLOSE событий, если у вас нет реальной необходимости «подключения» UDP-сокета к различным удаленным целям в течение его жизненного цикла.

EDIT: пропущено важное «не» в предыдущем абзаце.

+0

Хм, я полагаю, это имеет смысл. В основном я искал способ повторного использования Netty TCP-каналов после их отсоединения без необходимости полностью воссоздавать весь канал и конвейер (и обновлять объекты, ссылающиеся на него), но, вероятно, это не так дорого, чтобы быть проблемой , –

+0

TCP-соединение почти всегда представляет собой «жесткое» соединение на более высоком уровне; для большинства случаев это будет больше работы и больше путаницы, пытаясь повторно использовать ресурсы более низкого уровня, чем просто отбрасывать их, когда заканчивается соединение более высокого уровня. –

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