From f708469f4304bd3e27e05a0bff598f2d71f74a7e Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Thu, 23 May 2024 10:08:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=96=B0=E5=A2=9E):=20:rocket:=20nio?= =?UTF-8?q?=E7=BC=96=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/compiler.xml | 1 + .idea/inspectionProfiles/Project_Default.xml | 8 ++ .idea/misc.xml | 2 +- demo1/pom.xml | 24 +++++- .../java/cn/bunny/file_dir/ClientDemo.java | 17 ++++ .../java/cn/bunny/file_dir/Server2Demo.java | 61 ++++++++++++++ .../java/cn/bunny/file_dir/ServerDemo.java | 76 ++++++++++++++++++ .../cn/bunny/file_dir/ClientDemo.class | Bin 0 -> 1130 bytes .../cn/bunny/{ => file_dir}/Demo01.class | Bin 1456 -> 1474 bytes .../cn/bunny/{ => file_dir}/Demo02.class | Bin 532 -> 550 bytes .../cn/bunny/{ => file_dir}/Demo10$1.class | Bin 1549 -> 1576 bytes .../cn/bunny/{ => file_dir}/Demo10$2.class | Bin 1518 -> 1545 bytes .../cn/bunny/{ => file_dir}/Demo10$3.class | Bin 2308 -> 2335 bytes .../cn/bunny/{ => file_dir}/Demo10.class | Bin 4255 -> 4300 bytes .../cn/bunny/{ => file_dir}/Demo3.class | Bin 763 -> 781 bytes .../cn/bunny/{ => file_dir}/Demo4.class | Bin 855 -> 873 bytes .../cn/bunny/{ => file_dir}/Demo5.class | Bin 1323 -> 1341 bytes .../cn/bunny/{ => file_dir}/Demo6.class | Bin 1379 -> 1397 bytes .../cn/bunny/{ => file_dir}/Demo7.class | Bin 1161 -> 1179 bytes .../cn/bunny/{ => file_dir}/Demo8.class | Bin 1318 -> 1336 bytes .../cn/bunny/{ => file_dir}/Demo9.class | Bin 1712 -> 1730 bytes .../cn/bunny/file_dir/Server2Demo.class | Bin 0 -> 3387 bytes .../cn/bunny/file_dir/ServerDemo.class | Bin 0 -> 4001 bytes 23 files changed, 186 insertions(+), 3 deletions(-) create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 demo1/src/main/java/cn/bunny/file_dir/ClientDemo.java create mode 100644 demo1/src/main/java/cn/bunny/file_dir/Server2Demo.java create mode 100644 demo1/src/main/java/cn/bunny/file_dir/ServerDemo.java create mode 100644 demo1/target/classes/cn/bunny/file_dir/ClientDemo.class rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo01.class (87%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo02.class (58%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo10$1.class (67%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo10$2.class (71%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo10$3.class (80%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo10.class (88%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo3.class (65%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo4.class (63%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo5.class (74%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo6.class (73%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo7.class (75%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo8.class (71%) rename demo1/target/classes/cn/bunny/{ => file_dir}/Demo9.class (81%) create mode 100644 demo1/target/classes/cn/bunny/file_dir/Server2Demo.class create mode 100644 demo1/target/classes/cn/bunny/file_dir/ServerDemo.class diff --git a/.idea/compiler.xml b/.idea/compiler.xml index 954e026..667a8df 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -2,6 +2,7 @@ + diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..68cc5d4 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 9e1585c..b7686d0 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -8,7 +8,7 @@ - + \ No newline at end of file diff --git a/demo1/pom.xml b/demo1/pom.xml index 1f54d91..ba203f0 100644 --- a/demo1/pom.xml +++ b/demo1/pom.xml @@ -9,8 +9,28 @@ 1.0-SNAPSHOT - 17 - 17 + 22 + 22 + 1.18.32 + + + + org.projectlombok + lombok + ${lombok.version} + + + + cn.hutool + hutool-all + 5.8.27 + + + org.slf4j + slf4j-api + 2.0.13 + + \ No newline at end of file diff --git a/demo1/src/main/java/cn/bunny/file_dir/ClientDemo.java b/demo1/src/main/java/cn/bunny/file_dir/ClientDemo.java new file mode 100644 index 0000000..6dc3f31 --- /dev/null +++ b/demo1/src/main/java/cn/bunny/file_dir/ClientDemo.java @@ -0,0 +1,17 @@ +package cn.bunny.file_dir; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.channels.SocketChannel; + +@Slf4j +public class ClientDemo { + public static void main(String[] args) throws IOException { + SocketChannel socketChannel = SocketChannel.open(); + socketChannel.connect(new InetSocketAddress("localhost", 8080)); + // socketChannel.write(Charset.defaultCharset().encode("hello")) + System.out.println("等待。。。"); + } +} diff --git a/demo1/src/main/java/cn/bunny/file_dir/Server2Demo.java b/demo1/src/main/java/cn/bunny/file_dir/Server2Demo.java new file mode 100644 index 0000000..e1b427b --- /dev/null +++ b/demo1/src/main/java/cn/bunny/file_dir/Server2Demo.java @@ -0,0 +1,61 @@ +package cn.bunny.file_dir; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; + +public class Server2Demo { + public static void main(String[] args) throws IOException { + // 创建Selector + Selector selector = Selector.open(); + + // 创建服务器 + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); + SelectionKey selectionKey = serverSocketChannel.register(selector, 0, null); + + // 只关注channel + selectionKey.interestOps(SelectionKey.OP_ACCEPT); + System.out.println(STR."注册时的key:\{selectionKey}"); + + // 模拟监听端口 + serverSocketChannel.bind(new InetSocketAddress(8080)); + + while (true) { + selector.select(); + Iterator iterator = selector.selectedKeys().iterator(); + while (iterator.hasNext()) { + SelectionKey key = iterator.next(); + // 需要移出key,在事件集合中需要移出 + iterator.remove(); + if (key.isAcceptable()) { + ServerSocketChannel cancel = (ServerSocketChannel) key.channel(); + SocketChannel accept = cancel.accept(); + accept.configureBlocking(false); + SelectionKey scKey = accept.register(selector, 0, null); + scKey.interestOps(SelectionKey.OP_READ); + System.out.println(STR."accept的key\{accept}"); + System.out.println(STR."scKey\{scKey}"); + } else if (key.isReadable()) { + try { + SocketChannel channel = (SocketChannel) key.channel(); + ByteBuffer buffer = ByteBuffer.allocate(16); + // 如果客户端断开,这里会报错 + channel.read(buffer); + buffer.flip(); + } catch (IOException exception) { + exception.printStackTrace(); + // 断开后会进行删除 + key.cancel(); + } + + } + } + } + } +} diff --git a/demo1/src/main/java/cn/bunny/file_dir/ServerDemo.java b/demo1/src/main/java/cn/bunny/file_dir/ServerDemo.java new file mode 100644 index 0000000..6aa9b06 --- /dev/null +++ b/demo1/src/main/java/cn/bunny/file_dir/ServerDemo.java @@ -0,0 +1,76 @@ +package cn.bunny.file_dir; + +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Iterator; + +@Slf4j +public class ServerDemo { + // 阻塞模式下只能接受一个连接 + public static void main(String[] args) throws IOException { + // 创建Selector + Selector selector = Selector.open(); + + // 创建服务器 + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); + SelectionKey selectionKey = serverSocketChannel.register(selector, 0, null); + + // 只关注channel时间 + selectionKey.interestOps(SelectionKey.OP_ACCEPT); + System.out.println(STR."注册时的key:\{selectionKey}"); + + // 模拟监听端口 + serverSocketChannel.bind(new InetSocketAddress(8080)); + + while (true) { + selector.select(); + // 处理事件 + Iterator iterator = selector.selectedKeys().iterator(); + while (iterator.hasNext()) { + SelectionKey key = iterator.next(); + System.out.println(STR."key的值为\{key}"); + ServerSocketChannel channel = (ServerSocketChannel) key.channel(); + SocketChannel accept = channel.accept(); + System.out.println(STR."接受到的值\{accept}"); + } + } + } + + private static void m1() throws IOException { + // 使用 ByteBuffer + ByteBuffer buffer = ByteBuffer.allocate(16); + // 创建服务器 + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + serverSocketChannel.configureBlocking(false); + // 模拟监听端口 + serverSocketChannel.bind(new InetSocketAddress(8080)); + // 连接集合 + ArrayList channels = new ArrayList<>(); + while (true) { + SocketChannel accept = serverSocketChannel.accept(); + if (accept != null) { + accept.configureBlocking(false); + channels.add(accept); + } + for (SocketChannel channel : channels) { + int read = channel.read(buffer); + // 当read大于0时才去读 + if (read > 0) { + buffer.flip(); + System.out.println((STR."读取到的内容:\{StandardCharsets.UTF_8.decode(buffer)}")); + buffer.clear(); + } + } + } + } +} diff --git a/demo1/target/classes/cn/bunny/file_dir/ClientDemo.class b/demo1/target/classes/cn/bunny/file_dir/ClientDemo.class new file mode 100644 index 0000000000000000000000000000000000000000..de29d1229deef62b8346b1b1a4803bfcb3ee294c GIT binary patch literal 1130 zcmah|?M~D{6g>kA-K|AnaTn!NL~sjA{lL#62&*I{8!=h4Mol!`?of)|4rynN{4*y0 z@SiW@4>bXz2@l|F7~@+QZ`%zYLL_OXbLXBp_uPBu{`m842fzY~Dq7I0Af=%V?F?OO z)@#e~EZ;Gft83hr4DBBFy`_dnmhOFk7NIHzD#!+DG`^u!4syh!TSBN~q? zl{+F8y`ta(!+`A@)rRkH7%Q&FU)J2fD0(jU<$YckDs)UJnAC6)ml%3Q;25E|GQDP$ zgyZmF(XyooHmHIQm&p;s*#2Ne&k93RFa3Md%wQabhRe7@>3hOq$Q}k!tBaz>DgTn| z^M{Rkl?RWlsz)b;rk+)-z>VzYVM?yLA;VDVe@U6dTDM#(OTO^@aEtW{`K`bqo}MGz z3?1RY*En+QBVvJCn&`nOGNfqkY;3$D=`xd9c^v}y?e*Kvca3~u5Up`yz# zh$tc-+J;h^{Em*N+0O3ak6Y;8#HlA=a5_7*iL-mGS)^jV6wOW!oft${93h{u;5P1% sKSfea%uv+3vBfY;V}EZ~@<^S;50`>ff$?3=9lT8#yL03P~mB=_i%uff$?3=9mm8#yL0atbEr=_i%uff$?3=9lT3?7^eObpEI3@khhtPE_73{uH?`bnjEd6oKUnK`NPDVaqZ amHsdZ%lKf3Z`NQ|WE7IX6c1vV!w3Ma{vNgf delta 74 zcmeC=dB?4E>ff$?3=9mm3?7^eObpEI3@khhtPE_741&pd`bnjEd6gTr|1fb0`@p!H Qt(X-VIr-t-T$VYE0MR%UY5)KL diff --git a/demo1/target/classes/cn/bunny/Demo10$3.class b/demo1/target/classes/cn/bunny/file_dir/Demo10$3.class similarity index 80% rename from demo1/target/classes/cn/bunny/Demo10$3.class rename to demo1/target/classes/cn/bunny/file_dir/Demo10$3.class index 747a2b804abbfca21fed8a67e702464ff3815e9d..696a4c6396f1a1fbca91fb24601f5332bd4f5b86 100644 GIT binary patch delta 101 zcmZn>nlGe%>ff$?3=9lT45^$9ObpEI3@khhtPE_73{uH?`bnjEd6oKUnK`NPDVaqZ am0mIn%lKf3Zx&?{XB3ja6gOo(&kO*R^d5Hr delta 74 zcmbO))FPyG>ff$?3=9mm45^$9ObpEI3@khhtPE_741&pd`bnjEd6gTrUovwE`@p!H Q)mg+DIr-t-0M_%&0KeK4D*ylh diff --git a/demo1/target/classes/cn/bunny/Demo10.class b/demo1/target/classes/cn/bunny/file_dir/Demo10.class similarity index 88% rename from demo1/target/classes/cn/bunny/Demo10.class rename to demo1/target/classes/cn/bunny/file_dir/Demo10.class index 1b21cdfb271741db5810ca4aaaf566c21ebfae55..59021bb93be0ef57585e78f1e26cdcc9cc7abafc 100644 GIT binary patch delta 135 zcmbQQct(-q)W2Q(7#J9wHgcR|5|T>J(@!eR%d6B+%gjlQPsuEre4FVG7U9hYn8O&c bh%c6BWfqdaG)05MPFTtZLws`qhdu`YF)%PE delta 90 zcmX@3IA4+D)W2Q(7#J9AH*%a};uK8I(@!eR%d4FHgy{}~xA_ut7$bta*ou{zlOL|s Rhr^Cb&ff$?3=9lT8##g*g~XHd^pi^S@+$SyGILVnQ!ff$?3=9mm8##g*Ir)+I)W2Q(7#J9wHgYgC3yCM^=_i%u_^`5j+3@ diff --git a/demo1/target/classes/cn/bunny/Demo7.class b/demo1/target/classes/cn/bunny/file_dir/Demo7.class similarity index 75% rename from demo1/target/classes/cn/bunny/Demo7.class rename to demo1/target/classes/cn/bunny/file_dir/Demo7.class index cffe49b2f89ce4ff24eb4367a14a26986dc778e7..44fdd2055c78f3a09a88a248ce54a93734891561 100644 GIT binary patch delta 66 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 literal 0 HcmV?d00001