有人可以为我提供一个Netty 4.0的UDP服务器吗?我看到了很多3.x的例子,但是在netty源码示例中没有4.x版本的迹象。(请注意我对Netty非常陌生)基本上,这就是https://netty.io/Documentation/New+and+Noteworthy#HNewbootstrapAPI中的示例,只不过是针对UDP而言。非常感谢您的帮助。
包netty-example
包括类QuoteOfTheMomentServer
、QuoteOfTheMomentServerHandler
、QuoteOfTheMomentClient
和QuoteOfTheMomentClientHandler
。它们演示了如何创建一个简单的UDP服务器。
我将粘贴现有代码Netty 4.1.24版本。建议您在使用的Netty版本中查找这些类。
QuoteOfTheMomentServer:
public final class QuoteOfTheMomentServer {
private static final int PORT = Integer.parseInt(System.getProperty("port", "7686"));
public static void main(String[] args) throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap();
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)
.handler(new QuoteOfTheMomentServerHandler());
b.bind(PORT).sync().channel().closeFuture().await();
} finally {
group.shutdownGracefully();
}
}
}
时刻引用服务器处理程序:
public class QuoteOfTheMomentServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
private static final Random random = new Random();
// Quotes from Mohandas K. Gandhi:
private static final String[] quotes = {
"Where there is love there is life.",
"First they ignore you, then they laugh at you, then they fight you, then you win.",
"Be the change you want to see in the world.",
"The weak can never forgive. Forgiveness is the attribute of the strong.",
};
private static String nextQuote() {
int quoteId;
synchronized (random) {
quoteId = random.nextInt(quotes.length);
}
return quotes[quoteId];
}
@Override
public void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {
System.err.println(packet);
if ("QOTM?".equals(packet.content().toString(CharsetUtil.UTF_8))) {
ctx.write(new DatagramPacket(
Unpooled.copiedBuffer("QOTM: " + nextQuote(), CharsetUtil.UTF_8), packet.sender()));
}
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
// We don't close the channel because we can keep serving requests.
}
}