From ac0327fcfa3df4b85ba00425b38e17d3c93c7976 Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Sat, 3 Apr 2021 13:55:55 +0300 Subject: [PATCH 1/3] BAEL-4786 - DatagramChannel --- .../DatagramChannelBuilder.java | 18 +++++++ .../datagramchannel/DatagramClient.java | 32 ++++++++++++ .../datagramchannel/DatagramServer.java | 49 +++++++++++++++++++ .../DatagramChannelUnitTest.java | 24 +++++++++ 4 files changed, 123 insertions(+) create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java create mode 100644 core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java new file mode 100644 index 0000000000..43e0747622 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java @@ -0,0 +1,18 @@ +package com.baeldung.datagramchannel; + +import java.io.IOException; +import java.net.SocketAddress; +import java.nio.channels.DatagramChannel; + +public class DatagramChannelBuilder { + + public static DatagramChannel openChannel() throws IOException { + DatagramChannel datagramChannel = DatagramChannel.open(); + return datagramChannel; + } + + public static DatagramChannel bindChannel(SocketAddress local) throws IOException { + return openChannel().bind(local); + } + +} diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java new file mode 100644 index 0000000000..867378cc50 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java @@ -0,0 +1,32 @@ +package com.baeldung.datagramchannel; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; + +public class DatagramClient { + + public static DatagramChannel startClient() throws IOException { + DatagramChannel client = DatagramChannelBuilder.bindChannel(null); + client.configureBlocking(false); + return client; + } + + public static void sendMessage(DatagramChannel client, String msg, SocketAddress serverAddress) throws IOException { + ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes()); + client.send(buffer, serverAddress); + client.close(); + } + + public static void main(String[] args) throws IOException { + DatagramChannel client = startClient(); + String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!"; + InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001); + + sendMessage(client, msg, serverAddress); + + } + +} diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java new file mode 100644 index 0000000000..219531209b --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java @@ -0,0 +1,49 @@ +package com.baeldung.datagramchannel; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; + +public class DatagramServer { + + public static DatagramChannel startServer() throws IOException { + InetSocketAddress address = new InetSocketAddress("localhost", 7001); + DatagramChannel server = DatagramChannelBuilder.bindChannel(address); + server.configureBlocking(false); + + System.out.println("Server started at #" + address); + + return server; + } + + public static String receiveMessage(DatagramChannel server) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(1024); + SocketAddress remoteAdd = server.receive(buffer); + String message = extractMessage(buffer); + + System.out.println("Client at #" + remoteAdd + " sent: " + message); + + server.close(); + + return message; + } + + private static String extractMessage(ByteBuffer buffer) { + buffer.flip(); + + byte bytes[] = new byte[buffer.remaining()]; + buffer.get(bytes); + + String msg = new String(bytes); + + return msg; + } + + public static void main(String[] args) throws IOException { + DatagramChannel server = startServer(); + receiveMessage(server); + } + +} diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java new file mode 100644 index 0000000000..b971cc55f5 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.datagramchannel; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.DatagramChannel; +import org.junit.jupiter.api.Test; + +public class DatagramChannelUnitTest { + + @Test + public void whenClientSendsAndServerReceivesUDPPacket_thenCorrect() throws IOException { + DatagramChannel server = DatagramServer.startServer(); + + DatagramChannel client = DatagramClient.startClient(); + String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!"; + InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001); + DatagramClient.sendMessage(client, msg, serverAddress); + + assertEquals("Hello, this is a Baeldung's DatagramChannel based UDP client!", DatagramServer.receiveMessage(server)); + } + +} From 93487b6c61a9a0bdea9ee55c865f59c75720ef41 Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Sat, 3 Apr 2021 13:55:55 +0300 Subject: [PATCH 2/3] BAEL-4786 - DatagramChannel - review fix --- .../DatagramChannelBuilder.java | 18 +++++++ .../datagramchannel/DatagramClient.java | 32 +++++++++++++ .../datagramchannel/DatagramServer.java | 48 +++++++++++++++++++ .../DatagramChannelUnitTest.java | 24 ++++++++++ 4 files changed, 122 insertions(+) create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java create mode 100644 core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java create mode 100644 core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java new file mode 100644 index 0000000000..43e0747622 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramChannelBuilder.java @@ -0,0 +1,18 @@ +package com.baeldung.datagramchannel; + +import java.io.IOException; +import java.net.SocketAddress; +import java.nio.channels.DatagramChannel; + +public class DatagramChannelBuilder { + + public static DatagramChannel openChannel() throws IOException { + DatagramChannel datagramChannel = DatagramChannel.open(); + return datagramChannel; + } + + public static DatagramChannel bindChannel(SocketAddress local) throws IOException { + return openChannel().bind(local); + } + +} diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java new file mode 100644 index 0000000000..867378cc50 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java @@ -0,0 +1,32 @@ +package com.baeldung.datagramchannel; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; + +public class DatagramClient { + + public static DatagramChannel startClient() throws IOException { + DatagramChannel client = DatagramChannelBuilder.bindChannel(null); + client.configureBlocking(false); + return client; + } + + public static void sendMessage(DatagramChannel client, String msg, SocketAddress serverAddress) throws IOException { + ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes()); + client.send(buffer, serverAddress); + client.close(); + } + + public static void main(String[] args) throws IOException { + DatagramChannel client = startClient(); + String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!"; + InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001); + + sendMessage(client, msg, serverAddress); + + } + +} diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java new file mode 100644 index 0000000000..187599bb95 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java @@ -0,0 +1,48 @@ +package com.baeldung.datagramchannel; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.DatagramChannel; + +public class DatagramServer { + + public static DatagramChannel startServer() throws IOException { + InetSocketAddress address = new InetSocketAddress("localhost", 7001); + DatagramChannel server = DatagramChannelBuilder.bindChannel(address); + + System.out.println("Server started at #" + address); + + return server; + } + + public static String receiveMessage(DatagramChannel server) throws IOException { + ByteBuffer buffer = ByteBuffer.allocate(1024); + SocketAddress remoteAdd = server.receive(buffer); + String message = extractMessage(buffer); + + System.out.println("Client at #" + remoteAdd + " sent: " + message); + + server.close(); + + return message; + } + + private static String extractMessage(ByteBuffer buffer) { + buffer.flip(); + + byte[] bytes = new byte[buffer.remaining()]; + buffer.get(bytes); + + String msg = new String(bytes); + + return msg; + } + + public static void main(String[] args) throws IOException { + DatagramChannel server = startServer(); + receiveMessage(server); + } + +} diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java new file mode 100644 index 0000000000..b971cc55f5 --- /dev/null +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java @@ -0,0 +1,24 @@ +package com.baeldung.datagramchannel; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.DatagramChannel; +import org.junit.jupiter.api.Test; + +public class DatagramChannelUnitTest { + + @Test + public void whenClientSendsAndServerReceivesUDPPacket_thenCorrect() throws IOException { + DatagramChannel server = DatagramServer.startServer(); + + DatagramChannel client = DatagramClient.startClient(); + String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!"; + InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001); + DatagramClient.sendMessage(client, msg, serverAddress); + + assertEquals("Hello, this is a Baeldung's DatagramChannel based UDP client!", DatagramServer.receiveMessage(server)); + } + +} From d7577d260159dedc9e5e59540992e6ff3f212509 Mon Sep 17 00:00:00 2001 From: Anshul BANSAL Date: Wed, 7 Apr 2021 13:20:24 +0300 Subject: [PATCH 3/3] BAEL-4786 - review comments - removed close method --- .../com/baeldung/datagramchannel/DatagramClient.java | 1 - .../com/baeldung/datagramchannel/DatagramServer.java | 2 -- .../datagramchannel/DatagramChannelUnitTest.java | 11 ++++++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java index 867378cc50..e377cc431c 100644 --- a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramClient.java @@ -17,7 +17,6 @@ public class DatagramClient { public static void sendMessage(DatagramChannel client, String msg, SocketAddress serverAddress) throws IOException { ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes()); client.send(buffer, serverAddress); - client.close(); } public static void main(String[] args) throws IOException { diff --git a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java index 187599bb95..ed3345a26d 100644 --- a/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java +++ b/core-java-modules/core-java-nio-2/src/main/java/com/baeldung/datagramchannel/DatagramServer.java @@ -24,8 +24,6 @@ public class DatagramServer { System.out.println("Client at #" + remoteAdd + " sent: " + message); - server.close(); - return message; } diff --git a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java index b971cc55f5..f816072ee7 100644 --- a/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java +++ b/core-java-modules/core-java-nio-2/src/test/java/com/baeldung/datagramchannel/DatagramChannelUnitTest.java @@ -12,13 +12,18 @@ public class DatagramChannelUnitTest { @Test public void whenClientSendsAndServerReceivesUDPPacket_thenCorrect() throws IOException { DatagramChannel server = DatagramServer.startServer(); - DatagramChannel client = DatagramClient.startClient(); - String msg = "Hello, this is a Baeldung's DatagramChannel based UDP client!"; + + String msg1 = "Hello, this is a Baeldung's DatagramChannel based UDP client!"; + String msg2 = "Hi again!, Are you there!"; + InetSocketAddress serverAddress = new InetSocketAddress("localhost", 7001); - DatagramClient.sendMessage(client, msg, serverAddress); + + DatagramClient.sendMessage(client, msg1, serverAddress); + DatagramClient.sendMessage(client, msg2, serverAddress); assertEquals("Hello, this is a Baeldung's DatagramChannel based UDP client!", DatagramServer.receiveMessage(server)); + assertEquals("Hi again!, Are you there!", DatagramServer.receiveMessage(server)); } }