From 7e4640804a251f70e9b6ce87abf24ef43925aeb5 Mon Sep 17 00:00:00 2001 From: hyl <592443616@qq.com> Date: Mon, 27 Jul 2020 10:32:24 +0800 Subject: [PATCH] nio --- .../java/cn/hutool/socket/nio/NioClient.java | 24 -------- .../java/cn/hutool/socket/NioClientTest.java | 56 +++++-------------- 2 files changed, 14 insertions(+), 66 deletions(-) diff --git a/hutool-socket/src/main/java/cn/hutool/socket/nio/NioClient.java b/hutool-socket/src/main/java/cn/hutool/socket/nio/NioClient.java index cde3b528a..ec112bc64 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/nio/NioClient.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/nio/NioClient.java @@ -105,7 +105,6 @@ public abstract class NioClient implements Closeable { this.executorService = Executors.newSingleThreadExecutor(r -> { final Thread thread = Executors.defaultThreadFactory().newThread(r); thread.setName("nio-client-listen"); - thread.setDaemon(true); return thread; }); this.executorService.execute(() -> { @@ -139,13 +138,6 @@ public abstract class NioClient implements Closeable { * @param key SelectionKey */ private void handle(SelectionKey key) throws IOException { - //连接建立完成 -// if (key.isConnectable()) { -// if (this.channel.finishConnect()) { -// this.channel.register(selector, SelectionKey.OP_READ); -// } -// } - // 读事件就绪 if (key.isReadable()) { final SocketChannel socketChannel = (SocketChannel) key.channel(); @@ -161,22 +153,6 @@ public abstract class NioClient implements Closeable { */ protected abstract void read(SocketChannel socketChannel); - /** - * 处理读事件
- * 当收到读取准备就绪的信号后,回调此方法,用户可读取从客户端传世来的消息 - * - * @param buffer 服务端数据存储缓存 - * @return this - */ - public NioClient read(ByteBuffer buffer) { - try { - this.channel.read(buffer); - } catch (IOException e) { - throw new IORuntimeException(e); - } - return this; - } - /** * 实现写逻辑
* 当收到写出准备就绪的信号后,回调此方法,用户可向客户端发送消息 diff --git a/hutool-socket/src/test/java/cn/hutool/socket/NioClientTest.java b/hutool-socket/src/test/java/cn/hutool/socket/NioClientTest.java index 1c1fa8fca..1bc217b81 100644 --- a/hutool-socket/src/test/java/cn/hutool/socket/NioClientTest.java +++ b/hutool-socket/src/test/java/cn/hutool/socket/NioClientTest.java @@ -10,7 +10,9 @@ import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.SocketChannel; +import java.nio.charset.Charset; import java.util.Iterator; +import java.util.Scanner; import java.util.Set; public class NioClientTest { @@ -35,7 +37,6 @@ public class NioClientTest { readBuffer.get(bytes); String body = new String(bytes, "UTF-8"); System.out.println("the read client receive message: " + body); - doWrite(sc, body); }else if(readBytes < 0){ sc.close(); } @@ -46,50 +47,21 @@ public class NioClientTest { } ByteBuffer buffer = ByteBuffer.wrap("client 发生到 server".getBytes()); client.write(buffer); - if(!buffer.hasRemaining()) { - System.err.println("第一次发送成功..."); - } buffer = ByteBuffer.wrap("client 再次发生到 server".getBytes()); client.write(buffer); - if(!buffer.hasRemaining()) { - System.err.println("第二次发送成功..."); - } - } - //发送请求 - private static void doWriteRequest(SocketChannel socketChannel) throws Exception{ - System.err.println("start connect..."); - - //创建ByteBuffer对象,会放入数据 - ByteBuffer byteBuffer = ByteBuffer.allocate("Hello nio.example.Server!".getBytes().length); - byteBuffer.put("Hello nio.example.Server!".getBytes()); - byteBuffer.flip(); - //写数据 - socketChannel.write(byteBuffer); - if(!byteBuffer.hasRemaining()) { - System.err.println("Send request success..."); - } - } - - //读取服务端的响应 - private static void doRead(SelectionKey selectionKey) throws Exception{ - SocketChannel socketChannel = ((SocketChannel) selectionKey.channel()); - ByteBuffer byteBuffer = ByteBuffer.allocate(1024); - int len = socketChannel.read(byteBuffer); - System.out.println("Recv:" + new String(byteBuffer.array(), 0 ,len)); - } - - public static void doWrite(SocketChannel channel, String response) throws IOException { - response = "我们已收到消息:"+response; - if(!StrUtil.isBlank(response)){ - byte [] bytes = response.getBytes(); - //分配一个bytes的length长度的ByteBuffer - ByteBuffer write = ByteBuffer.allocate(bytes.length); - //将返回数据写入缓冲区 - write.put(bytes); - write.flip(); - //将缓冲数据写入渠道,返回给客户端 - channel.write(write); + /** + * 在控制台向服务器端发送数据 + */ + System.out.println("请在下方畅所欲言"); + Scanner scanner = new Scanner(System.in); + while (scanner.hasNextLine()) { + String request = scanner.nextLine(); + if (request != null && request.trim().length() > 0) { + client.write( + Charset.forName("UTF-8") + .encode("测试client" + ": " + request)); + } } } } \ No newline at end of file