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

如何保存通道或上下文以供以后使用netty开发udp服务器时使用,udp,netty,Udp,Netty,我正在使用netty开发一个UDP服务器。我的设想如下: 1.客户端向服务器发送消息 2.服务器向客户端发送响应 3.用户单击按钮,然后服务器向客户端发送命令 在此场景中,步骤3不是由客户端触发的。因此,在步骤2中,当从客户端收到消息时,我需要保存通道和远程地址以供步骤3使用。然而,我尝试了很多方法,但都不起作用 下面是我的代码片段 public class EchoSeverHandler extends SimpleChannelInboundHandler<DatagramPacke

我正在使用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);
}
公共类EchoSeverHandler扩展了SimpleChannelInboundHandler{
私有通道HandlerContext私有CTX;
专用InetSocketAddress地址;
私有映射allChannels=newhashedmap();
@凌驾
受保护的无效channelRead0(ChannelHandlerContext ctx,DatagramPacket数据包)引发异常{
ByteBuf=(ByteBuf)packet.copy().content();
字节[]请求=新字节[buf.readableBytes()];
buf.读取字节(req);
字符串体=新字符串(req,CharsetUtil.UTF_8);
系统输出打印项次(“接收:+正文);
地址=packet.sender();
DatagramChannel=(DatagramChannel)ctx.channel();
所有通道.put(地址,通道);
事件=新事件();
事件。设置地址(地址);
事件。设置内容(“四”);
ctx.writeAndFlush(新数据包(
copiedBuffer(“您好,时间戳是”+System.currentTimeMillis(),CharsetUtil.UTF_8),address)).sync();
}
public void sendMsg(字符串msg)引发InterruptedException{
事件=新事件();
事件。设置地址(地址);
event.setContent(msg);
DatagramChannel=allChannels.get(地址);
通道写入(事件);
}
}

sendMsg方法用于用户向客户端发送命令。方法被触发,但命令不被发送。 此外,我尝试了以下方法,但都不起作用: 1.保存ChannelHandlerContext而不是DatagramChannel。 2.使用channel.bind()再次绑定地址


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

您需要拨打
频道。writeAndFlush(…)

我验证了频道不需要保存在地图中。只需保存通道的一个实例,即可应用于不同的客户端。