diff --git a/reactor-netty-examples/src/main/java/reactor/netty/examples/udp/qotm/QuoteOfTheMomentClient.java b/reactor-netty-examples/src/main/java/reactor/netty/examples/udp/qotm/QuoteOfTheMomentClient.java new file mode 100644 index 0000000000..c34a1abdcb --- /dev/null +++ b/reactor-netty-examples/src/main/java/reactor/netty/examples/udp/qotm/QuoteOfTheMomentClient.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2023 VMware, Inc. or its affiliates, All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package reactor.netty.examples.udp.qotm; + +import reactor.core.publisher.Mono; +import reactor.netty.Connection; +import reactor.netty.udp.UdpClient; + +public class QuoteOfTheMomentClient { + + private static final int PORT = Integer.parseInt(System.getProperty("port", "7686")); + + private static final boolean WIRETAP = System.getProperty("wiretap") != null; + + public static void main(String[] args) { + UdpClient client = UdpClient.create() + .port(PORT) + .wiretap(WIRETAP); + + Connection conn = client.connectNow(); + + conn.inbound() + .receive() + .asString() + .doOnNext(text -> { + if (text.startsWith("QOTM:")) { + System.out.println("Quote of the Moment: " + text.substring(6)); + conn.disposeNow(); + } + }).doOnError(err -> { + err.printStackTrace(); + conn.disposeNow(); + }) + .subscribe(); + + conn.outbound() + .sendString(Mono.just("QOTM?")) + .then() + .subscribe(); + + conn.onReadIdle(5000, () -> { + System.err.println("QOTM request timed out."); + conn.disposeNow(); + }); + + conn.onDispose().block(); + } +} diff --git a/reactor-netty-examples/src/main/java/reactor/netty/examples/udp/qotm/QuoteOfTheMomentServer.java b/reactor-netty-examples/src/main/java/reactor/netty/examples/udp/qotm/QuoteOfTheMomentServer.java new file mode 100644 index 0000000000..2b42240ea3 --- /dev/null +++ b/reactor-netty-examples/src/main/java/reactor/netty/examples/udp/qotm/QuoteOfTheMomentServer.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2023 VMware, Inc. or its affiliates, All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package reactor.netty.examples.udp.qotm; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelOption; +import io.netty.channel.socket.DatagramPacket; +import reactor.core.publisher.Flux; +import reactor.netty.Connection; +import reactor.netty.udp.UdpServer; + +import java.nio.charset.StandardCharsets; +import java.util.Random; + +public class QuoteOfTheMomentServer { + + private static final int PORT = Integer.parseInt(System.getProperty("port", "7686")); + + private static final boolean WIRETAP = System.getProperty("wiretap") != null; + + private static final Random random = new Random(); + + 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]; + + } + + public static void main(String[] args) { + + UdpServer server = UdpServer + .create() + .port(PORT) + .wiretap(WIRETAP) + .option(ChannelOption.SO_BROADCAST, true) + .handle((in, out) -> { + Flux inFlux = in + .receiveObject() + .handle((incoming, sink) -> { + if (incoming instanceof DatagramPacket) { + DatagramPacket packet = (DatagramPacket) incoming; + String content = packet.content() + .toString(StandardCharsets.UTF_8); + + if ("QOTM?".equalsIgnoreCase(content)) { + String nextQuote = nextQuote(); + ByteBuf byteBuf = + Unpooled.copiedBuffer("QOTM: " + nextQuote, StandardCharsets.UTF_8); + DatagramPacket response = new DatagramPacket(byteBuf, packet.sender()); + sink.next(response); + } + } + }); + return out.sendObject(inFlux); + }); + + Connection conn = server.bindNow(); + conn.onDispose().block(); + } + +}