如何保存通道或上下文以供以后用于使用netty开发udp服务器

时间:2017-02-06 11:02:35

标签: udp netty

我正在使用netty开发UDP服务器。我的方案如下: 1.客户端向服务器发送消息 2.服务器向客户端发送响应 3.用户单击按钮,然后服务器向客户端发送命令。

在这种情况下,客户端不会触发步骤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()再次绑定地址。

这个场景有什么我错过的吗?谢谢你的建议。

1 个答案:

答案 0 :(得分:0)

您需要致电{ javascript: [ '~/App_Plugins/CustomBackoffice/angular-ui.js' ] }