【问题标题】:How to save the channel or context for later use in developing udp server using netty如何保存通道或上下文以供以后使用 netty 开发 udp 服务器
【发布时间】:2017-06-23 07:13:38
【问题描述】:

我正在使用 netty 开发一个 UDP 服务器。我的情况如下: 1.客户端向服务器发送消息 2.服务器向客户端发送响应 3. 用户点击按钮,服务器向客户端发送命令。

在这种情况下,步骤 3 不是由客户端触发的。所以在第2步中,当收到客户端的消息后,我需要保存频道和远程地址以供第3步使用。但是,我尝试了很多方法,但都不奏效。

以下是我的代码sn-p。

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()再次绑定地址。

在这种情况下我有什么遗漏吗?感谢您的建议。

【问题讨论】:

    标签: udp netty


    【解决方案1】:

    您需要致电channel.writeAndFlush(...)

    【讨论】:

    • 并且我验证了频道不需要保存在地图中。只需保存一个通道实例,即可应用于不同的客户端。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多