2017-02-06 8 views
0

Я разрабатываю UDP-сервер, используя netty. Мой сценарий следующий: 1. клиент отправляет сообщение серверу 2. сервер посылает ответ клиенту 3. Пользователь нажимает кнопку, а затем сервер отправляет команду клиенту.Как сохранить канал или контекст для последующего использования при разработке udp-сервера с использованием netty

В этом случае шаг 3 не запускается клиентом. Итак, на шаге 2, когда вы получили сообщение от клиента, мне нужно сохранить канал и удаленный адрес для использования шага 3. Однако я пробовал много методов и не работал.

Ниже приведен фрагмент кода.

public class EchoSeverHandler extends SimpleChannelInboundHandler<DatagramPacket> { 

private ChannelHandlerContext privateCtx; 
private InetSocketAddress address; 
private Map<InetSocketAddress, DatagramChannel> allChannels = new HashedMap(); 


@Override 
protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception { 


    ByteBuf buf = (ByteBuf) packet.copy().content(); 

    byte[] req = new byte[buf.readableBytes()]; 

    buf.readBytes(req); 

    String body = new String(req, CharsetUtil.UTF_8); 

    System.out.println("received: " + body); 

    address = packet.sender(); 

    DatagramChannel channel = (DatagramChannel) ctx.channel(); 
    allChannels.put(address, channel); 
    Event event = new Event(); 
    event.setAddress(address); 
    event.setContent("Four"); 

    ctx.writeAndFlush(new DatagramPacket(
      Unpooled.copiedBuffer("Hello, timestamp is" + System.currentTimeMillis(), CharsetUtil.UTF_8), address)).sync(); 
} 

public void sendMsg (String msg) throws InterruptedException { 
    Event event = new Event(); 
    event.setAddress(address); 
    event.setContent(msg); 
    DatagramChannel channel = allChannels.get(address); 
    channel.write(event); 
} 

}

Метод sendMsg используется для отправки команды на клиенте пользователем. Метод запускается, но команда не отправляется. Кроме того, я пробовал следующие способы, и все не работает: 1. Сохраните ChannelHandlerContext вместо DatagramChannel. 2. Используйте channel.bind(), чтобы снова привязать адрес.

Есть ли что-то, что я пропустил для этого сценария? Спасибо за советы.

ответ

0

Необходимо позвонить по телефону channel.writeAndFlush(...).

+0

Это работает. Спасибо за вашу помощь. – Tony

+0

И я проверил, что канал не нужно сохранять на карте. Нужно сохранять только один экземпляр канала, и его можно применять к разным клиентам. – Tony