如何保存通道或上下文供以后使用 netty 开发 udp 服务器时使用
How to save the channel or context for later use in developing udp server using 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()重新绑定地址。
这个场景有什么我遗漏的吗?谢谢你的建议。
您需要致电channel.writeAndFlush(...)
。
我正在使用 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()重新绑定地址。
这个场景有什么我遗漏的吗?谢谢你的建议。
您需要致电channel.writeAndFlush(...)
。