diff --git a/src/main/java/com/examplehub/basics/network/SocketClient.java b/src/main/java/com/examplehub/basics/network/SocketClient.java index 3d7f005e..21be8917 100644 --- a/src/main/java/com/examplehub/basics/network/SocketClient.java +++ b/src/main/java/com/examplehub/basics/network/SocketClient.java @@ -8,29 +8,26 @@ public class SocketClient { public static void main(String[] args) throws IOException { Socket clientSocket = new Socket("127.0.0.1", 6666); - try (InputStream inputStream = clientSocket.getInputStream()) { - try (OutputStream outputStream = clientSocket.getOutputStream()) { - handle(inputStream, outputStream); - } + try (InputStream inputStream = clientSocket.getInputStream(); OutputStream outputStream = clientSocket.getOutputStream()) { + handle(inputStream, outputStream); } clientSocket.close(); System.out.println("disconnected."); } private static void handle(InputStream inputStream, OutputStream outputStream) - throws IOException { + throws IOException { var writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)); var reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); Scanner scanner = new Scanner(System.in); System.out.println("[server] " + reader.readLine()); for (; ; ) { - System.out.print(">>> "); // 打印提示 - String s = scanner.nextLine(); // 读取一行输入 + System.out.print(">>> "); + String s = scanner.nextLine(); writer.write(s + System.lineSeparator()); - // writer.newLine(); writer.flush(); String resp = reader.readLine(); - System.out.println("<<< " + resp); + System.out.println("[server]: " + resp); if (resp.equals("bye")) { break; } diff --git a/src/main/java/com/examplehub/basics/network/SocketServer.java b/src/main/java/com/examplehub/basics/network/SocketServer.java index 281d2681..5bf4564b 100644 --- a/src/main/java/com/examplehub/basics/network/SocketServer.java +++ b/src/main/java/com/examplehub/basics/network/SocketServer.java @@ -1,5 +1,8 @@ package com.examplehub.basics.network; +import com.examplehub.strings.ReverseString; +import com.examplehub.utils.StringUtils; + import java.io.*; import java.net.ServerSocket; import java.net.Socket; @@ -7,21 +10,21 @@ public class SocketServer { static class ServerHandler implements Runnable { - private Socket socket; + private final Socket socket; public ServerHandler(Socket socket) { this.socket = socket; } public void run() { - try (InputStream inputStream = this.socket.getInputStream()) { - try (OutputStream outputStream = this.socket.getOutputStream()) { - handle(inputStream, outputStream); - } + try (InputStream inputStream = this.socket.getInputStream(); + OutputStream outputStream = this.socket.getOutputStream()) { + handle(inputStream, outputStream); } catch (Exception e) { try { this.socket.close(); } catch (IOException ex) { + ex.printStackTrace(); } System.out.println("client disconnect"); } @@ -30,24 +33,27 @@ public void run() { private void handle(InputStream inputStream, OutputStream outputStream) throws IOException { var reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); var writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)); - writer.write("hello!\n"); + writer.write("welcome connect service!\n"); writer.flush(); while (true) { String line = reader.readLine(); + System.out.println("[client]: " + line); if (line.equals("bye")) { writer.write("bye\n"); writer.flush(); break; } - writer.write("ok: " + line + "\n"); + writer.write("ok: " + ReverseString.reverse(line) + "\n"); writer.flush(); } } } public static void main(String[] args) throws IOException { - ServerSocket serverSocket = new ServerSocket(6666); - System.out.println("server is started!"); + int port = 6666; + ServerSocket serverSocket = new ServerSocket(port); + System.out.print("server is started! listen on: "); + System.err.print(port); while (true) { Socket socket = serverSocket.accept(); System.out.println("connected from " + socket.getRemoteSocketAddress()); diff --git a/src/main/java/com/examplehub/basics/network/UDPClient.java b/src/main/java/com/examplehub/basics/network/UDPClient.java new file mode 100644 index 00000000..6808ad3f --- /dev/null +++ b/src/main/java/com/examplehub/basics/network/UDPClient.java @@ -0,0 +1,21 @@ +package com.examplehub.basics.network; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.nio.charset.StandardCharsets; + +public class UDPClient { + public static void main(String[] args) throws IOException { + DatagramSocket datagramSocket = new DatagramSocket(); + byte[] buffer = "123".getBytes(StandardCharsets.UTF_8); + DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length, InetAddress.getLocalHost(), 6666); + datagramSocket.send(datagramPacket); + + byte[] bytes = new byte[1024]; + DatagramPacket dp = new DatagramPacket(bytes, bytes.length); + datagramSocket.receive(dp); + System.out.println("[server]: " + new String(bytes, 0, dp.getLength())); + } +} diff --git a/src/main/java/com/examplehub/basics/network/UDPServer.java b/src/main/java/com/examplehub/basics/network/UDPServer.java new file mode 100644 index 00000000..4840c896 --- /dev/null +++ b/src/main/java/com/examplehub/basics/network/UDPServer.java @@ -0,0 +1,27 @@ +package com.examplehub.basics.network; + +import com.examplehub.strings.ReverseString; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.nio.charset.StandardCharsets; + +public class UDPServer { + public static void main(String[] args) throws IOException { + int port = 6666; + try(DatagramSocket datagramSocket = new DatagramSocket(port)) { + System.out.println("server started! listen on: " + port); + byte[] buffer = new byte[1024]; + DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length); + datagramSocket.receive(datagramPacket); + System.out.println("[client]: " + new String(buffer, 0, datagramPacket.getLength())); + + byte[] bytes = ReverseString.reverse(new String(buffer, 0, datagramPacket.getLength())) + .getBytes(StandardCharsets.UTF_8); + System.out.println(new String(bytes)); + DatagramPacket dp = new DatagramPacket(bytes, bytes.length, datagramPacket.getAddress(), datagramPacket.getPort()); + datagramSocket.send(dp); + } + } +} diff --git a/src/test/java/com/examplehub/basics/reflection/CreateObjFromClassTest.java b/src/test/java/com/examplehub/basics/reflection/CreateObjFromClassTest.java index db02728a..b8be337f 100644 --- a/src/test/java/com/examplehub/basics/reflection/CreateObjFromClassTest.java +++ b/src/test/java/com/examplehub/basics/reflection/CreateObjFromClassTest.java @@ -4,11 +4,93 @@ import org.junit.jupiter.api.Test; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; + +class User { + private String username; + private int age; + + public User() { + } + + public User(String username, int age) { + this.username = username; + this.age = age; + } + + public void setAge(int age) { + this.age = age; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "User{" + + "username='" + username + '\'' + + ", age=" + age + + '}'; + } +} class CreateObjFromClassTest { @Test - void testCreateObj() throws InstantiationException, IllegalAccessException { - Class cls = String.class; - String str = (String) cls.newInstance(); + void testCreateObjUsingNewInstance() throws InstantiationException, IllegalAccessException { + Class cls = String.class; + String str = cls.newInstance(); assertTrue(str.isEmpty()); } + + @Test + void testCreateCustomObject() throws InstantiationException, IllegalAccessException, ClassNotFoundException { + + Class userClass = User.class; + User user = (User) userClass.newInstance(); + user.setUsername("admin"); + user.setAge(25); + assertEquals("User{username='admin', age=25}", user.toString()); + } + + @Test + void testCreateCustomObjectUsingConstructor() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class userClass = Class.forName("com.examplehub.basics.reflection.User"); + Constructor constructor = userClass.getConstructor(); + assertEquals("public com.examplehub.basics.reflection.User()", constructor.toString()); + User user = (User) constructor.newInstance(); + user.setUsername("duyuanchao"); + user.setAge(25); + assertEquals("User{username='duyuanchao', age=25}", user.toString()); + } + + @Test + void testCreateCustomObjectUsingConstructorWithArgs() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + Class userClass = Class.forName("com.examplehub.basics.reflection.User"); + Constructor constructor = userClass.getConstructor(String.class, int.class); + assertEquals("public com.examplehub.basics.reflection.User(java.lang.String,int)", constructor.toString()); + User user = (User) constructor.newInstance("duyuanchao", 26); + assertEquals("User{username='duyuanchao', age=26}", user.toString()); + } + + @Test + void testGetAllConstructors() throws ClassNotFoundException { + Class userClass = Class.forName("com.examplehub.basics.reflection.User"); + Constructor[] constructors = userClass.getConstructors(); + for (Constructor constructor : constructors) { + assertEquals(1, constructor.getModifiers()); + assertEquals("com.examplehub.basics.reflection.User", constructor.getName()); + Class[] classes = constructor.getParameterTypes(); + int count = 0; + for (Class cls : classes) { + if (count == 0) { + assertEquals("java.lang.String", cls.getName()); + } + if (count == 1) { + assertEquals("int", cls.getName()); + } + count++; + } + } + } } diff --git a/src/test/java/com/examplehub/basics/reflection/GetClassExampleTest.java b/src/test/java/com/examplehub/basics/reflection/GetClassExampleTest.java index 8dcecae7..bb8238a9 100644 --- a/src/test/java/com/examplehub/basics/reflection/GetClassExampleTest.java +++ b/src/test/java/com/examplehub/basics/reflection/GetClassExampleTest.java @@ -4,18 +4,48 @@ import org.junit.jupiter.api.Test; +import java.time.Month; + class GetClassExampleTest { + + @Test + void testVoid() { + Class c = void.class; + assertEquals("void", c.getName()); + assertEquals("void", c.getSimpleName()); + assertEquals("java.lang", c.getPackageName()); + assertEquals("void", c.toString()); + } + @Test void testGetClass() throws ClassNotFoundException { - Class cls = String.class; - Class cls2 = "hello".getClass(); - Class cls3 = Class.forName("java.lang.String"); - assertTrue(cls == cls2 && cls == cls3); + Class cls = String.class; + Class cls2 = "hello".getClass(); + Class cls3 = Class.forName("java.lang.String"); + assertSame(cls, cls2); + assertSame(cls, cls3); + } + + @Test + void testGetClassByTYPE() { + Class c = Integer.TYPE; + assertEquals("int", c.getName()); + assertEquals("int", c.getSimpleName()); + assertEquals("java.lang", c.getPackageName()); + assertEquals("int", c.toString()); + assertTrue(c.isPrimitive()); + } + + @Test + void testGetClassByClassloader() throws ClassNotFoundException { + ClassLoader classLoader = GetClassExample.class.getClassLoader(); + Class cls = classLoader.loadClass("java.lang.String"); + assertEquals("java.lang.String", cls.getName()); } @Test void testStringClass() { - Class cls = "".getClass(); + Class cls = "".getClass(); assertEquals("java.lang.String", cls.getName()); assertEquals("String", cls.getSimpleName()); assertEquals("java.lang", cls.getPackageName()); @@ -27,7 +57,7 @@ void testStringClass() { @Test void testInterface() { - Class cls = Runnable.class; + Class cls = Runnable.class; assertEquals("java.lang.Runnable", cls.getName()); assertEquals("Runnable", cls.getSimpleName()); assertEquals("java.lang", cls.getPackageName()); @@ -39,7 +69,7 @@ void testInterface() { @Test void testMonth() { - Class cls = java.time.Month.class; + Class cls = java.time.Month.class; assertEquals("java.time.Month", cls.getName()); assertEquals("Month", cls.getSimpleName()); assertEquals("java.time", cls.getPackageName()); @@ -51,7 +81,7 @@ void testMonth() { @Test void testStringArray() { - Class cls = String[].class; + Class cls = String[].class; assertEquals("[Ljava.lang.String;", cls.getName()); assertEquals("String[]", cls.getSimpleName()); assertEquals("java.lang", cls.getPackageName()); @@ -63,7 +93,7 @@ void testStringArray() { @Test void testPrimitive() { - Class cls = int.class; + Class cls = int.class; assertEquals("int", cls.getName()); assertEquals("int", cls.getSimpleName()); assertEquals("java.lang", cls.getPackageName()); diff --git a/src/test/java/com/examplehub/basics/reflection/GetFieldExampleTest.java b/src/test/java/com/examplehub/basics/reflection/GetFieldExampleTest.java index e53c2e44..af04a562 100644 --- a/src/test/java/com/examplehub/basics/reflection/GetFieldExampleTest.java +++ b/src/test/java/com/examplehub/basics/reflection/GetFieldExampleTest.java @@ -2,86 +2,89 @@ import static org.junit.jupiter.api.Assertions.*; +import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; + import org.junit.jupiter.api.Test; -class GetFieldExampleTest { - class Person { - public String name; +class Person { + public String name; - public Person(String name) { - this.name = name; - } + public Person(String name) { + this.name = name; + } - public void setName(String name) { - this.name = name; - } + public void setName(String name) { + this.name = name; + } - public String getName() { - return name; - } + public String getName() { + return name; + } - public String hi() { - return "hi"; - } + public String hi() { + return "hi"; } +} - class Student extends Person { - public int score; - private int grade; +class Student extends Person { + public int score; + private int grade; - public Student(String name) { - super(name); - } + public Student(String name) { + super(name); + } - public int getScore() { - return score; - } + public int getScore() { + return score; + } - public void setScore(int score) { - this.score = score; - } + public void setScore(int score) { + this.score = score; + } - public int getGrade() { - return grade; - } + public int getGrade() { + return grade; + } - public void setGrade(int grade) { - this.grade = grade; - } + public void setGrade(int grade) { + this.grade = grade; } +} +class GetFieldExampleTest { @Test void testGetField() throws NoSuchFieldException { - Class stuCls = Student.class; + Class stuCls = Student.class; assertEquals("score", stuCls.getField("score").getName()); - assertEquals("name", stuCls.getField("name").getName()); assertEquals("grade", stuCls.getDeclaredField("grade").getName()); } @Test - void testGetFieldValue() throws NoSuchFieldException, IllegalAccessException { - Object obj = new Person("Jack"); - Class cls = obj.getClass(); + void testGetFieldValue() throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException { + Class cls = Person.class; + Constructor constructor = cls.getConstructor(String.class); + Person person = (Person) constructor.newInstance("Jack"); Field field = cls.getDeclaredField("name"); - assertEquals("Jack", field.get(obj)); + assertEquals("Jack", field.get(person)); } @Test - void testSetFiledValue() throws NoSuchFieldException, IllegalAccessException { - Object obj = new Person("Jack"); - Class cls = obj.getClass(); + void testSetFiledValue() throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException, InvocationTargetException, InstantiationException { + Class cls = Class.forName("com.examplehub.basics.reflection.Person"); + Constructor constructor = cls.getConstructor(String.class); + Object person = constructor.newInstance("Jack"); Field field = cls.getDeclaredField("name"); - assertEquals("Jack", field.get(obj).toString()); - - field.set(obj, "Tom"); - assertEquals("Tom", field.get(obj).toString()); + assertEquals("Jack", field.get(person).toString()); + field.set(person, "Tom"); + assertEquals("Tom", field.get(person).toString()); } @Test - void testGetFunction() throws NoSuchMethodException { - Class stuClass = Student.class; + void testGetFunction() throws NoSuchMethodException, ClassNotFoundException { + Class stuClass = Class.forName("com.examplehub.basics.reflection.Student"); assertEquals("getScore", stuClass.getDeclaredMethod("getScore").getName()); assertEquals("setScore", stuClass.getMethod("setScore", int.class).getName()); assertEquals("getGrade", stuClass.getDeclaredMethod("getGrade").getName()); @@ -89,4 +92,16 @@ void testGetFunction() throws NoSuchMethodException { assertEquals("getName", stuClass.getMethod("getName").getName()); assertEquals("setName", stuClass.getMethod("setName", String.class).getName()); } + + @Test + void testGetAllFields() throws ClassNotFoundException { + Class stuClass = Class.forName("com.examplehub.basics.reflection.Student"); + Field[] fields = stuClass.getFields(); + for (Field field : fields) { + System.out.println(field.getModifiers()); + System.out.println(field.getType()); + System.out.println(field.getName()); + System.out.println("-------------"); + } + } } diff --git a/src/test/java/com/examplehub/basics/reflection/InvokeMethodExampleTest.java b/src/test/java/com/examplehub/basics/reflection/InvokeMethodExampleTest.java index 5331190b..d460da4b 100644 --- a/src/test/java/com/examplehub/basics/reflection/InvokeMethodExampleTest.java +++ b/src/test/java/com/examplehub/basics/reflection/InvokeMethodExampleTest.java @@ -1,18 +1,19 @@ package com.examplehub.basics.reflection; -import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; class InvokeMethodExampleTest { @Test void testInvoke() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { String str = "hello world"; - Class cls = str.getClass(); + Class cls = str.getClass(); Method method = cls.getMethod("substring", int.class); String newStr = (String) method.invoke(str, 6); assertEquals("world", newStr); @@ -70,25 +71,6 @@ public String hi() { assertEquals("Child.hi", method.invoke(new Child())); } - // @Test TODO - void testInvokeConstructorNoArgs() - throws InstantiationException, IllegalAccessException, NoSuchMethodException, - InvocationTargetException { - class People { - private String name; - - public People() { - this.name = "hello"; - } - - public String getName() { - return name; - } - } - Class cls = People.class; - People obj = (People) cls.newInstance(); - assertEquals("hello", cls.getMethod("getName").invoke(obj)); - } @Test void testInvokeConstructor()