6

有人可以用 Netty 4.0 的 UDP 服务器引导我吗?我看到很多 3.x 示例,但即使在 netty 源示例中也没有 4.x 的迹象。(注意我对 Netty 很陌生)

基本上,它是https://netty.io/Documentation/New+and+Noteworthy#HNewbootstrapAPI上的示例,但用于 UDP。非常感谢帮助

4

1 回答 1

2

包包括netty-exampleQuoteOfTheMomentServerQuoteOfTheMomentServerHandlerQuoteOfTheMomentClientQuoteOfTheMomentClientHandler这些演示了如何创建一个简单的 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();
    }
}
}

QuoteOfTheMomentServerHandler:

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.
}
}
于 2018-05-13T10:14:07.260 回答