diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2677b68..b0484eb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -9,4 +9,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-all.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/network/build.gradle.kts b/network/build.gradle.kts new file mode 100644 index 0000000..d2aab59 --- /dev/null +++ b/network/build.gradle.kts @@ -0,0 +1,14 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +plugins { + id("elex-java") +} + +dependencies { + +} diff --git a/network/logback.xml b/network/logback.xml new file mode 100644 index 0000000..74ff8a3 --- /dev/null +++ b/network/logback.xml @@ -0,0 +1,20 @@ + + + + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + diff --git a/network/src/main/java/kr/pe/elex/examples/http/HttpSample.java b/network/src/main/java/kr/pe/elex/examples/http/HttpSample.java new file mode 100644 index 0000000..850e4b3 --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/http/HttpSample.java @@ -0,0 +1,91 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.http; + +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +@Slf4j +public class HttpSample { + public static void main(String... args) throws IOException { + requestGet(); + } + + public static void requestGet() throws IOException { + URL url = new URL("https://www.google.com/"); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + connection.setDoInput(true); + connection.setDoOutput(false); + connection.setConnectTimeout(25000); + connection.setUseCaches(false); + + // 연결 + connection.connect(); + + // 응답 처리 + System.out.println("STATUS: " + connection.getResponseCode()); + connection.getHeaderFields().forEach((key, list) -> { + System.out.print(key + ": "); + list.forEach(item -> { + System.out.print(item + " "); + }); + System.out.println(); + }); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + reader.lines().forEachOrdered(line -> { + System.out.println(line); + }); + } + connection.disconnect(); + } + + public static void requestPost() throws IOException { + URL url = new URL("https://www.google.com/"); + byte[] data = "Hello".getBytes(StandardCharsets.UTF_8); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("POST"); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestProperty("Content-Type", "text/plain"); + connection.setFixedLengthStreamingMode(data.length); + connection.setConnectTimeout(25000); + connection.setUseCaches(false); + + // 연결 + connection.connect(); + + // 요청 바디 전송 + OutputStream os = connection.getOutputStream(); + os.write(data); + os.flush(); + + // 응답 처리 + System.out.println("STATUS: " + connection.getResponseCode()); + connection.getHeaderFields().forEach((key, list) -> { + System.out.print(key + ": "); + list.forEach(item -> { + System.out.print(item + " "); + }); + System.out.println(); + }); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { + reader.lines().forEachOrdered(line -> { + System.out.println(line); + }); + } + connection.disconnect(); + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/multicast/MulticastUdpClientSample.java b/network/src/main/java/kr/pe/elex/examples/multicast/MulticastUdpClientSample.java new file mode 100644 index 0000000..4f374a2 --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/multicast/MulticastUdpClientSample.java @@ -0,0 +1,36 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.multicast; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.MulticastSocket; +import java.nio.charset.StandardCharsets; + +@Slf4j +public class MulticastUdpClientSample { + public static void main(String... args) throws IOException { + MulticastSocket socket = new MulticastSocket(18888); + InetAddress group = InetAddress.getByName("224.0.0.1"); + socket.joinGroup(group); + + // 수신 + byte[] buf = new byte[256]; + DatagramPacket packet = new DatagramPacket(buf, buf.length); + socket.receive(packet); + String received = new String(packet.getData(), 0, packet.getLength()); + log.info("Rx: {}", received); + + socket.leaveGroup(group); + socket.close(); + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/multicast/MulticastUdpServerSample.java b/network/src/main/java/kr/pe/elex/examples/multicast/MulticastUdpServerSample.java new file mode 100644 index 0000000..80a6680 --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/multicast/MulticastUdpServerSample.java @@ -0,0 +1,51 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.multicast; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.InetAddress; +import java.net.MulticastSocket; +import java.nio.charset.StandardCharsets; + +@Slf4j +public class MulticastUdpServerSample { + public static void main(String... args) throws IOException { + MulticastSocket socket = new MulticastSocket(); + + /* + IPv4 multicast addresses are defined by the leading address bits of 1110, + originating from the classful network design of the early Internet when this group of addresses + was designated as Class D. The Classless Inter-Domain Routing (CIDR) prefix of this group is 224.0.0.0/4. + The group includes the addresses from 224.0.0.0 to 239.255.255.255. + + A multicast group is specified by a class D IP address and by a standard UDP port number. + Class D IP addresses are in the range 224.0.0.0 to 239.255.255.255, inclusive. + The address 224.0.0.0 is reserved and should not be used. + + */ + for (int i = 0; i < 20; i++) { + // 발신 + InetAddress group = InetAddress.getByName("224.0.0.1"); + byte[] data = ("Hello~! " + i).getBytes(StandardCharsets.UTF_8); + DatagramPacket packet = new DatagramPacket(data, data.length, group, 18888); + socket.send(packet); + log.info("Tx: {}", new String(packet.getData())); + + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + log.error("Oops~!", e); + } + } + + socket.disconnect(); + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/new_http/Sample.java b/network/src/main/java/kr/pe/elex/examples/new_http/Sample.java new file mode 100644 index 0000000..7a76afe --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/new_http/Sample.java @@ -0,0 +1,44 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.new_http; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +@Slf4j +public class Sample { + public static void main(String... args) throws IOException, InterruptedException { + HttpClient httpClient = HttpClient.newBuilder() + .version(HttpClient.Version.HTTP_2) + .build(); + + // GET + HttpRequest request = HttpRequest.newBuilder() + .GET() + .uri(URI.create("https://www.google.com/")) + .header("X-Header", "Something") + .build(); + HttpResponse response = httpClient + .send(request, HttpResponse.BodyHandlers.ofString()); + + System.out.println(response.body()); + + // POST + request = HttpRequest.newBuilder() + .POST(HttpRequest.BodyPublishers.ofString("Hello")) + .uri(URI.create("https://www.examples.com/")) + .build(); + response = httpClient + .send(request, HttpResponse.BodyHandlers.ofString()); + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/socket/SocketClientSample.java b/network/src/main/java/kr/pe/elex/examples/socket/SocketClientSample.java new file mode 100644 index 0000000..cb6f1c6 --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/socket/SocketClientSample.java @@ -0,0 +1,24 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.socket; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.Socket; + +@Slf4j +public class SocketClientSample { + public static void main(String... args) throws IOException { + Socket socket = new Socket("localhost", 18188); + // socket.getInputStream(); + // socket.getOutputStream(); + + socket.close(); + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/socket/SocketServerSample.java b/network/src/main/java/kr/pe/elex/examples/socket/SocketServerSample.java new file mode 100644 index 0000000..30d7ddf --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/socket/SocketServerSample.java @@ -0,0 +1,40 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.socket; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +public class SocketServerSample { + private List clients = new ArrayList<>(); + private ServerSocket socket; + + public void open(int port) throws IOException { + socket = new ServerSocket(port); + + while (!socket.isClosed()) { + try { + Socket client = socket.accept(); + clients.add(client); + + } catch (Throwable e) { + log.error("Oops!", e); + } + } + } + + public static void main(String... args){ + + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/udp/UdpClientSample.java b/network/src/main/java/kr/pe/elex/examples/udp/UdpClientSample.java new file mode 100644 index 0000000..f2cfe21 --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/udp/UdpClientSample.java @@ -0,0 +1,36 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.udp; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.nio.charset.StandardCharsets; + +@Slf4j +public class UdpClientSample { + public static void main(String... args) throws IOException { + DatagramSocket socket = new DatagramSocket(); + //socket. + // 발신 + byte[] buf = "Hi~ there.".getBytes(StandardCharsets.UTF_8); + DatagramPacket packet = new DatagramPacket(buf, buf.length, + InetAddress.getByName("localhost"), 18888); + socket.send(packet); + + // 수신 + buf = new byte[256]; + packet = new DatagramPacket(buf, buf.length); + socket.receive(packet); + String received = new String(packet.getData(), 0, packet.getLength()); + log.info("Rx: {}", received); + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/udp/UdpServerSample.java b/network/src/main/java/kr/pe/elex/examples/udp/UdpServerSample.java new file mode 100644 index 0000000..6972e3b --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/udp/UdpServerSample.java @@ -0,0 +1,41 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.udp; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +@Slf4j +public class UdpServerSample { + public static void main(String... args) throws IOException { + DatagramSocket socket = new DatagramSocket(18888); + + // 수신 + byte[] buf = new byte[256]; + DatagramPacket packet = new DatagramPacket(buf, buf.length); + socket.receive(packet); + + log.info("Rx: {}", new String(Arrays.copyOfRange(buf,packet.getOffset(),packet.getLength()))); + + // 발신 + InetAddress address = packet.getAddress(); + int port = packet.getPort(); + byte[] resp = "Hello~!".getBytes(StandardCharsets.UTF_8); + packet = new DatagramPacket(resp, resp.length, address, port); + socket.send(packet); + + + } +} diff --git a/network/src/main/java/kr/pe/elex/examples/url/UrlSample.java b/network/src/main/java/kr/pe/elex/examples/url/UrlSample.java new file mode 100644 index 0000000..74b1388 --- /dev/null +++ b/network/src/main/java/kr/pe/elex/examples/url/UrlSample.java @@ -0,0 +1,54 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples.url; + +import lombok.extern.slf4j.Slf4j; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; + +@Slf4j +public class UrlSample { + public static void readFromUrl() throws IOException { + URL url = new URL("https://www.example.com/"); + try (BufferedReader in = new BufferedReader( + new InputStreamReader(url.openStream()))) { + String inputLine; + while ((inputLine = in.readLine()) != null){ + System.out.println(inputLine); + } + //in.close(); + } + + + } + public static void writeToUrl() throws IOException { + URL url = new URL("https://www.example.com/"); + URLConnection connection = url.openConnection(); + connection.setDoOutput(true); + connection.connect(); + + try(OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream()); + BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()))){ + // write + out.write("Hello~"); + + // read + String inputLine; + while ((inputLine = in.readLine()) != null){ + System.out.println(inputLine); + } + } + + } +} diff --git a/network/src/test/java/kr/pe/elex/examples/ExecutorTest.java b/network/src/test/java/kr/pe/elex/examples/ExecutorTest.java new file mode 100644 index 0000000..64f4190 --- /dev/null +++ b/network/src/test/java/kr/pe/elex/examples/ExecutorTest.java @@ -0,0 +1,14 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class ExecutorTest { +} diff --git a/settings.gradle.kts b/settings.gradle.kts index bf71228..afdf95d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,5 +12,5 @@ include( "ssh", "web-socket-servlet", "web-socket-client", "thread", "hibernate", "jdbc-sqlite", - "xml", "jackson", "jsoup", "markdown" + "xml", "jackson", "jsoup", "markdown", "network" ) diff --git a/thread/src/main/java/kr/pe/elex/examples/Synchronizing.java b/thread/src/main/java/kr/pe/elex/examples/Synchronizing.java new file mode 100644 index 0000000..b73dafe --- /dev/null +++ b/thread/src/main/java/kr/pe/elex/examples/Synchronizing.java @@ -0,0 +1,48 @@ +/* + * Examples for Java + * + * Copyright (c) 2021. Elex. All Rights Reserved. + * https://www.elex-project.com/ + */ + +package kr.pe.elex.examples; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class Synchronizing { + public static void main(String... args) { + final Rabbit rabbit = new Rabbit(); + + new Thread() { + @Override + public void run() { + rabbit.hello(); + } + }.start(); + new Thread() { + @Override + public void run() { + rabbit.count(); + } + }.start(); + new Thread() { + @Override + public void run() { + rabbit.hello(); + } + }.start(); + } + + static class Rabbit { + public synchronized void count() { + for (int i = 0; i < 100; i++) { + System.out.println("Rabbit says " + i + "."); + } + } + + public synchronized void hello() { + System.out.println("Rabbit says 'Hello'."); + } + } +}