diff --git a/src/main/java/com/zhangmeng/tools/controller/AioClientSocketController.java b/src/main/java/com/zhangmeng/tools/controller/AioClientSocketController.java index cbedf4c..64abcb3 100644 --- a/src/main/java/com/zhangmeng/tools/controller/AioClientSocketController.java +++ b/src/main/java/com/zhangmeng/tools/controller/AioClientSocketController.java @@ -80,13 +80,6 @@ public class AioClientSocketController { } } - @Override - public void accept(AioSession session) { - aioSession = session; - appendMsg("客户端链接成功!" + session.getRemoteAddress().toString()); - } - - @Override public void failed(Throwable exc, AioSession session) { exc.printStackTrace(); diff --git a/src/main/java/com/zhangmeng/tools/controller/AioServerSocketController.java b/src/main/java/com/zhangmeng/tools/controller/AioServerSocketController.java index a237d96..d5d60c0 100644 --- a/src/main/java/com/zhangmeng/tools/controller/AioServerSocketController.java +++ b/src/main/java/com/zhangmeng/tools/controller/AioServerSocketController.java @@ -19,6 +19,7 @@ import lombok.extern.slf4j.Slf4j; import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; import java.util.Date; /** @@ -73,9 +74,9 @@ public class AioServerSocketController { appendMsg("服务启动成功============================================================================================"); // 接收客户端连接 accept(); -// if (sync) { -// ThreadUtil.sync(this); -// } + if (sync) { + ThreadUtil.sync(this); + } } }; aioServer.setIoAction(new SimpleIoAction() { @@ -87,16 +88,11 @@ public class AioServerSocketController { session.write(BufferUtil.createUtf8("=== Welcome to Hutool socket server. ===")); } - @Override - public void failed(Throwable exc, AioSession session) { - exc.printStackTrace(); - super.failed(exc, session); - } - @Override public void doAction(AioSession session, ByteBuffer data) { appendMsg("========>服务端接收" + new Date() + "=======>:" + StrUtil.utf8Str(data)); if (data.hasRemaining()) { + } else { session.read(); } } @@ -122,7 +118,7 @@ public class AioServerSocketController { return; } String msg = input.getText(); - aioSession.write(ByteBuffer.wrap(msg.getBytes())); + aioSession.write(ByteBuffer.wrap(msg.getBytes(StandardCharsets.UTF_8))); appendMsg("========>服务端发送" + new Date() + "=======>:" + msg ); } } diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java index 1b43791..6676d32 100644 --- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java +++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java @@ -558,4 +558,8 @@ public class HomeController implements Serializable { public void socket_server_nio_menu_item(ActionEvent event) { load_server_tools(6); } + + public void socket_client_nio_menu_item(ActionEvent event) { + load_server_tools(7); + } } \ No newline at end of file diff --git a/src/main/java/com/zhangmeng/tools/controller/NioClientSocketController.java b/src/main/java/com/zhangmeng/tools/controller/NioClientSocketController.java new file mode 100644 index 0000000..1cc289a --- /dev/null +++ b/src/main/java/com/zhangmeng/tools/controller/NioClientSocketController.java @@ -0,0 +1,123 @@ +package com.zhangmeng.tools.controller; + +import cn.hutool.core.io.BufferUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.socket.aio.AioClient; +import cn.hutool.socket.aio.AioSession; +import cn.hutool.socket.aio.SimpleIoAction; +import cn.hutool.socket.nio.NioClient; +import com.zhangmeng.tools.utils.AlertUtils; +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.Date; + +/** + * @author : 芊芊墨客 + * @version : 1.0 + * @date : 2023-05-06 10:38 + */ +@Slf4j +public class NioClientSocketController { + + @FXML + public TextField ip_address; + + @FXML + public TextArea content; + + @FXML + public Button connection; + + @FXML + public TextField input; + + @FXML + public Button send; + + @FXML + public TextField port; + + @FXML + public Button disconn; + + private NioClient client; + + private void appendMsg(String msg) { + content.appendText(System.lineSeparator()); + content.appendText(msg); + } + + @FXML + public void initialize() { + ip_address.setText("localhost"); + port.setText("8083"); + connection.setOnAction(event -> { + content.setText(null); + if (ip_address.getText().length() == 0 ){ + AlertUtils.alert_warning("ip不能为空"); + return; + } + if (port.getText().length() == 0 ){ + AlertUtils.alert_warning("端口不能为空"); + return; + } + + client = new NioClient(ip_address.getText(), Integer.parseInt(port.getText())); + client.setChannelHandler((sc)->{ + ByteBuffer readBuffer = ByteBuffer.allocate(1024); + //从channel读数据到缓冲区 + int readBytes = sc.read(readBuffer); + if (readBytes > 0) { + //Flips this buffer. The limit is set to the current position and then + // the position is set to zero,就是表示要从起始位置开始读取数据 + readBuffer.flip(); + //returns the number of elements between the current position and the limit. + // 要读取的字节长度 + byte[] bytes = new byte[readBuffer.remaining()]; + //将缓冲区的数据读到bytes数组 + readBuffer.get(bytes); + String body = StrUtil.utf8Str(bytes); + appendMsg("========>客户端接收" + new Date() + "=======>:" + body); + } else if (readBytes < 0) { + sc.close(); + } + }); + client.listen(); + }); + + send.setOnAction(event -> { + send(); + }); + + disconn.setOnAction(event -> { + client.close(); + }); + } + + private void send() { + if (input.getText().length() == 0) { + AlertUtils.alert_warning("发送的内容不能为空"); + return; + } + String msg = input.getText(); + try { + doWrite(client.getChannel(),msg); + } catch (IOException e) { + e.printStackTrace(); + } + appendMsg("========>客户端发送" + new Date() + "=======>:" + msg ); + } + + public static void doWrite(SocketChannel channel, String msg) throws IOException { + //将缓冲数据写入渠道,返回给客户端 + channel.write(BufferUtil.createUtf8(msg)); + } +} diff --git a/src/main/java/com/zhangmeng/tools/controller/NioServerSocketController.java b/src/main/java/com/zhangmeng/tools/controller/NioServerSocketController.java index e8e919e..1f6fcff 100644 --- a/src/main/java/com/zhangmeng/tools/controller/NioServerSocketController.java +++ b/src/main/java/com/zhangmeng/tools/controller/NioServerSocketController.java @@ -85,7 +85,7 @@ public class NioServerSocketController { readBuffer.get(bytes); String body = StrUtil.utf8Str(bytes); appendMsg("========>服务端接收" + new Date() + "=======>:" + body); - doWrite(sc, body); + //doWrite(sc, body); } else if (readBytes < 0) { IoUtil.close(sc); } @@ -107,10 +107,9 @@ public class NioServerSocketController { }); } - public static void doWrite(SocketChannel channel, String response) throws IOException { - response = "收到消息:" + response; + public static void doWrite(SocketChannel channel, String msg) throws IOException { //将缓冲数据写入渠道,返回给客户端 - channel.write(BufferUtil.createUtf8(response)); + channel.write(BufferUtil.createUtf8(msg)); } private void send() { @@ -120,7 +119,7 @@ public class NioServerSocketController { } String msg = input.getText(); try { - channel.write(ByteBuffer.wrap(msg.getBytes())); + doWrite(channel,msg); } catch (IOException e) { e.printStackTrace(); } diff --git a/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java b/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java index 220c108..7f4e38a 100644 --- a/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/ServerToolsController.java @@ -44,6 +44,7 @@ public class ServerToolsController { private AnchorPane sshClient; private AnchorPane socketServer; private AnchorPane socket_client_aio; + private AnchorPane socket_client_nio; private AnchorPane socket_server_aio; private AnchorPane socket_server_nio; @@ -294,16 +295,38 @@ public class ServerToolsController { } socket_server_aio(flag); } - if (newValue.getIndex() == 5){ + if (newValue.getIndex() == 6){ if (socket_server_nio != null){ flag = true; } socket_server_nio(flag); } + + if (newValue.getIndex() == 7){ + if (socket_client_nio != null){ + flag = true; + } + socket_client_nio(flag); + } } }); } + private void socket_client_nio(boolean flag) { + listView.getSelectionModel().select(7); + if (!flag){ + try { + root = FXMLLoader.load(ResourcesUtils.getResource("socket-client-nio")); + } catch (IOException e) { + e.printStackTrace(); + } + socket_client_nio = root; + }else { + root = socket_client_nio; + } + common_method(); + } + private void socket_server_nio(boolean flag) { listView.getSelectionModel().select(6); if (!flag){ @@ -424,6 +447,7 @@ public class ServerToolsController { case Socket_client_aio -> new Image(ImagePath.path(ImagePath.ImagePathType.SPRING_SECURITY)); case Socket_server_aio -> new Image(ImagePath.path(ImagePath.ImagePathType.SPRING_SECURITY)); case Socket_server_nio -> new Image(ImagePath.path(ImagePath.ImagePathType.SPRING_SECURITY)); + case Socket_client_nio -> new Image(ImagePath.path(ImagePath.ImagePathType.SPRING_SECURITY)); }; } @@ -599,10 +623,33 @@ public class ServerToolsController { public void socket_client_aio_menu_item(ActionEvent event) { boolean flag = false; - + if (socket_client_aio != null){ + flag =true; + } + socket_client_aio(flag); } public void socket_server_aio_menu_item(ActionEvent event) { boolean flag = false; + if (socket_server_aio != null){ + flag =true; + } + socket_server_aio(flag); + } + + public void socket_server_nio_menu_item(ActionEvent event) { + boolean flag = false; + if (socket_server_nio != null){ + flag =true; + } + socket_server_nio(flag); + } + + public void socket_client_nio_menu_item(ActionEvent event) { + boolean flag = false; + if (socket_client_nio != null){ + flag =true; + } + socket_client_nio(flag); } } diff --git a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java index b2d9874..0f89fe5 100644 --- a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java +++ b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java @@ -292,7 +292,8 @@ public class ResourcesUtils { Socket_Server("socket Server", 3), Socket_client_aio("aio socket client",4), Socket_server_aio("aio socket server",5), - Socket_server_nio("aio socket server",6), + Socket_server_nio("nio socket server",6), + Socket_client_nio("nio socket client",7), ; ServerTools(String title, int index) { diff --git a/src/main/resources/fxml/home.fxml b/src/main/resources/fxml/home.fxml index faed74c..08f2ccb 100644 --- a/src/main/resources/fxml/home.fxml +++ b/src/main/resources/fxml/home.fxml @@ -84,6 +84,7 @@ + diff --git a/src/main/resources/fxml/server-tools.fxml b/src/main/resources/fxml/server-tools.fxml index ad97eb9..2d41391 100644 --- a/src/main/resources/fxml/server-tools.fxml +++ b/src/main/resources/fxml/server-tools.fxml @@ -76,6 +76,8 @@ + + diff --git a/src/main/resources/fxml/socket-client-nio.fxml b/src/main/resources/fxml/socket-client-nio.fxml new file mode 100644 index 0000000..56f3135 --- /dev/null +++ b/src/main/resources/fxml/socket-client-nio.fxml @@ -0,0 +1,27 @@ + + + + + + + + + + + +