nettyを使用してUDPサーバーを開発しています。私のシナリオは以下の通りです: 1.クライアントサーバー 2.サーバーにメッセージを送信するクライアント 3に応答を送信し、ユーザーがボタンをクリックして、サーバー、クライアントにコマンドを送信します。nettyを使用してudpサーバーを開発する際に後で使用できるようにチャネルまたはコンテキストを保存する方法
このシナリオでは、手順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. DatagramChannelの代わりにChannelHandlerContextを保存してください。 2. channel.bind()を使用してアドレスを再度バインドします。
このシナリオでは私が見逃したことはありますか?あなたのアドバイスをありがとう。
これは機能します。ご協力いただきありがとうございます。 – Tony
そして、そのチャンネルを地図に保存する必要がないことを確認しました。 1つのチャンネルのインスタンスを保存するだけで、異なるクライアントに適用できます。 – Tony