diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java index de0c8f2..5b49c5a 100644 --- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java +++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java @@ -164,6 +164,27 @@ public class HomeController implements Serializable { load_sql_tools(0); } + @FXML + public void netty_client_menu_item(){ + load_network_tools(0); + } + + public void load_network_tools(int index){ + AnchorPane fx = null; + try { + fx = FXMLLoader.load(ResourcesUtils.getResource("network-tools")); + } catch (IOException e) { + e.printStackTrace(); + } + + Scene scene = new Scene(fx); + Stage stage = (Stage) splitPane.getScene().getWindow(); + stage.setScene(scene); + + ListView listView = (ListView) fx.lookup("#listView"); + listView.getSelectionModel().select(index); + } + public void load_sql_tools(int index){ AnchorPane fx = null; try { diff --git a/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java b/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java new file mode 100644 index 0000000..207bab3 --- /dev/null +++ b/src/main/java/com/zhangmeng/tools/controller/NetWorkToolsController.java @@ -0,0 +1,343 @@ +package com.zhangmeng.tools.controller; + +import com.zhangmeng.tools.utils.ImagePath; +import com.zhangmeng.tools.utils.ResourcesUtils; +import javafx.beans.property.SimpleDoubleProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.control.SplitPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; +import javafx.scene.paint.Paint; +import javafx.scene.text.Font; +import javafx.stage.Stage; +import javafx.util.Callback; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.Arrays; + +/** + * @author : 芊芊墨客 + * @version : 1.0 + * @date : 2023-02-25 14:34 + */ +@Slf4j +public class NetWorkToolsController { + + private SimpleDoubleProperty width = new SimpleDoubleProperty(0.0); + private SimpleDoubleProperty height = new SimpleDoubleProperty(0.0); + private AnchorPane root; + private AnchorPane md5; + private AnchorPane spring_security; + + private AnchorPane netty_client; + + public static final String color_cell = "#f4f4f4"; + + @FXML + private ListView listView; + + @FXML + private SplitPane splitPane; + + @FXML + public void md5_menu_item() { + load_encrypt_tools(0); + } + + @FXML + public void spring_security_menu_item() { + load_encrypt_tools(1); + } + + @FXML + public void video_menu_item() { + load_player(0); + } + + @FXML + public void music_menu_item() { + load_player(1); + } + + @FXML + public void vip_parser_menu_item() { + load_player(2); + } + + @FXML + public void hex_16(){ + load_small_tools(0); + } + + @FXML + private void hex_16_menu_item(){ + load_small_tools(0); + } + + @FXML + private void unicode_menu_item(){ + load_small_tools(1); + } + + @FXML + private void jwt_menu_item(){ + load_small_tools(2); + } + + @FXML + private void color_choose_menu_item(){ + load_small_tools(3); + } + + @FXML + public void qr_code_menu_item(){ + load_small_tools(4); + } + + @FXML + public void base_62_menu_item(){ + load_codec_tools(0); + } + + @FXML + public void base_64_menu_item(){ + load_codec_tools(1); + } + + @FXML + public void base_32_menu_item(){ + load_codec_tools(2); + } + + @FXML + public void morse_coder_menu_item(){ + load_codec_tools(3); + } + + @FXML + private void sql_code_gen_menu_item(){ + load_sql_tools(0); + } + + @FXML + public void netty_client_menu_item(){ + boolean flag = false; + if (netty_client != null){ + flag = true; + } + netty_client(flag); + } + + public void load_encrypt_tools(int index){ + AnchorPane fx = null; + try { + fx = FXMLLoader.load(ResourcesUtils.getResource("home")); + } catch (IOException e) { + e.printStackTrace(); + } + + Scene scene = new Scene(fx); + Stage stage = (Stage) splitPane.getScene().getWindow(); + stage.setScene(scene); + + ListView listView = (ListView) fx.lookup("#listView"); + listView.getSelectionModel().select(index); + } + + public void load_sql_tools(int index){ + AnchorPane fx = null; + try { + fx = FXMLLoader.load(ResourcesUtils.getResource("sql-tools")); + } catch (IOException e) { + e.printStackTrace(); + } + + Scene scene = new Scene(fx); + Stage stage = (Stage) splitPane.getScene().getWindow(); + stage.setScene(scene); + + ListView listView = (ListView) fx.lookup("#listView"); + listView.getSelectionModel().select(index); + } + + public void load_codec_tools(int index){ + AnchorPane fx = null; + try { + fx = FXMLLoader.load(ResourcesUtils.getResource("codec-tools")); + } catch (IOException e) { + e.printStackTrace(); + } + + Scene scene = new Scene(fx); + Stage stage = (Stage) splitPane.getScene().getWindow(); + stage.setScene(scene); + + ListView listView = (ListView) fx.lookup("#listView"); + listView.getSelectionModel().select(index); + } + + public void load_small_tools(int index){ + AnchorPane fx = null; + try { + fx = FXMLLoader.load(ResourcesUtils.getResource("small-tools")); + } catch (IOException e) { + e.printStackTrace(); + } + + Scene scene = new Scene(fx); + Stage stage = (Stage) splitPane.getScene().getWindow(); + stage.setScene(scene); + + ListView listView = (ListView) fx.lookup("#listView"); + listView.getSelectionModel().select(index); + } + + public void load_player(int index) { + AnchorPane fx = null; + try { + fx = FXMLLoader.load(ResourcesUtils.getResource("player")); + } catch (IOException e) { + e.printStackTrace(); + } + + Scene scene = new Scene(fx); + Stage stage = (Stage) splitPane.getScene().getWindow(); + stage.setScene(scene); + + ListView listView = (ListView) fx.lookup("#listView"); + listView.getSelectionModel().select(index); + } + + @FXML + public void initialize() { + init(); + listView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + boolean flag = false; + + if (newValue.getIndex() == 0) { + if (netty_client != null){ + flag = true; + } + netty_client(flag); + } + } + }); + } + + public static Image getImage(ResourcesUtils.NetWorkTools player){ + return switch (player){ + case Netty_Client_Websocket -> new Image(ImagePath.path(ImagePath.ImagePathType.MD5)); + }; + } + + public void init() { + ResourcesUtils.NetWorkTools[] values = ResourcesUtils.NetWorkTools.values(); + ObservableList list = FXCollections.observableArrayList(); + list.addAll(Arrays.asList(values)); + listView.setItems(list); + listView.setFixedCellSize(40); + listView.setCellFactory(new Callback<>() { + private int position; + @Override + public ListCell call(ListView playerListView) { + Label label = new Label(); + label.setPrefWidth(200); + ListCell listCell = new ListCell<>() { + @Override + protected void updateItem(ResourcesUtils.NetWorkTools player, boolean b) { + super.updateItem(player, b); + if (!b) { + HBox hBox = new HBox(25); + hBox.setAlignment(Pos.CENTER); + label.setText(player.getTitle()); + label.setTextFill(Paint.valueOf("#000000")); + Image im = getImage(player); + ImageView iv = new ImageView(im); + iv.setPreserveRatio(true); + iv.setFitWidth(15); + hBox.getChildren().add(iv); + + hBox.getChildren().add(label); + this.setGraphic(hBox); + } + this.setStyle("-fx-background-color: " + color_cell); + } + }; + + listCell.hoverProperty().addListener((observableValue, aBoolean, t1) -> { + if (t1 && !label.getText().equals("")) { + position = playerListView.getItems().indexOf(label.getText()); + label.setFont(new Font(16)); + playerListView.getFocusModel().focus(position); + listCell.setStyle("-fx-background-color: #369e7d"); + } else { + label.setPrefHeight(20); + label.setFont(new Font(13)); + listCell.setStyle("-fx-background-color: " + color_cell); + } + }); + + return listCell; + } + }); + + netty_client(false); + } + + private void netty_client(boolean flag) { + //默认选择第一个 + listView.getSelectionModel().select(0); + + if (!flag){ + try { + root = FXMLLoader.load(ResourcesUtils.getResource("netty-client")); + } catch (IOException e) { + e.printStackTrace(); + } + netty_client = root; + }else { + root = netty_client; + } + common_method(); + } + + private void common_method() { + splitPane.getItems().remove(1); + splitPane.getItems().add(1, root); + root.widthProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + double width = splitPane.getWidth(); + NetWorkToolsController.this.width.set(width); + log.info("home:--->width:{}", width); + } + }); + root.heightProperty().addListener((observable, oldValue, newValue) -> { + if (newValue != null) { + double height = splitPane.getHeight(); + NetWorkToolsController.this.height.set(height); + log.info("home:--->height:{}", height); + } + }); + + this.width.addListener((observable, oldValue, newValue) -> { + NetWorkToolsController.this.root.setPrefWidth(newValue.doubleValue() - listView.getWidth()); + }); + + this.height.addListener((observable, oldValue, newValue) -> { + NetWorkToolsController.this.root.setPrefHeight(newValue.doubleValue() - listView.getHeight()); + }); + } + +} diff --git a/src/main/java/com/zhangmeng/tools/controller/NettyClientController.java b/src/main/java/com/zhangmeng/tools/controller/NettyClientController.java new file mode 100644 index 0000000..2a9fe9a --- /dev/null +++ b/src/main/java/com/zhangmeng/tools/controller/NettyClientController.java @@ -0,0 +1,227 @@ +package com.zhangmeng.tools.controller; + +import com.zhangmeng.tools.utils.AlertUtils; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.string.StringEncoder; +import javafx.application.Platform; +import javafx.beans.property.SimpleObjectProperty; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.control.cell.TextFieldListCell; +import javafx.scene.layout.HBox; +import javafx.util.Callback; +import javafx.util.StringConverter; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.Map; + +/** + * @author : 芊芊墨客 + * @version : 1.0 + * @date : 2023-02-25 15:04 + */ +@Slf4j +public class NettyClientController { + + @FXML + private Button send; + + @FXML + private TextField key; + + @FXML + private TextField value; + + @FXML + private TextField url_address; + + @FXML + private TextField port; + + @FXML + private ListView param_list; + + @FXML + private TextArea result_show; + + @FXML + private Button add; + + @FXML + private Button connect; + + private final SimpleObjectProperty client = new SimpleObjectProperty<>(); + + private ObservableList list = FXCollections.observableArrayList(); + + private static final int socket_port = 3333; + private static final String socket_address = "127.0.0.1"; + + static class Data{ + private String key; + private Object value; + + public Data(String key, Object value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + } + + public enum Type{ + Ws, + Wss; + } + + @FXML + public void initialize() { + + + param_list.setPlaceholder(new Label("没有数据")); + param_list.setEditable(true); + param_list.setCellFactory(new Callback<>() { + @Override + public ListCell call(ListView param) { + return new ListCell<>(){ + @Override + protected void updateItem(Data data, boolean b) { + super.updateItem(data, b); + if (!b){ + HBox hbox = new HBox(); + hbox.setAlignment(Pos.CENTER); + hbox.getChildren().add(new Label(data.getKey() + "---" + data.getValue())); + this.setGraphic(hbox); + } + } + }; + } + }); + param_list.setItems(list); + + add.setOnAction(event -> { + + if (key.getText().length() == 0){ + AlertUtils.alert_warning("key不能为空!"); + return; + } + if (value.getText().length() == 0){ + AlertUtils.alert_warning("value不能为空!"); + return; + } + list.add(new Data(key.getText(),value.getText())); + + key.setText(null); + value.setText(null); + }); + + connect.setOnAction(event -> { + String url = Type.Ws + "://" + url_address.getText() + ":" + port.getText(); + log.info("url:{}",url); + if (client.getValue() == null){ + new Thread(() -> { + netty_client(url_address.getText(),Integer.parseInt(port.getText())); + }).start(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + if (client.getValue() != null){ + AlertUtils.alert_msg("连接成功!"); + }else { + AlertUtils.alert_warning("连接失败!"); + } + }else { + AlertUtils.alert_warning("已连接至服务器!"); + } + }); + + if (port.getText().length() == 0) { + port.setText(String.valueOf(socket_port)); + } + + if (url_address.getText().length() == 0) { + url_address.setText(socket_address); + } + + send.setOnAction(event -> { + ChannelHandlerContext channel = client.getValue(); + if (channel == null){ + AlertUtils.alert_warning("请连接至服务器再试!"); + return; + } + channel.writeAndFlush(result_show.getText()); + }); + if (client.getValue() == null){ + new Thread(()->{ + netty_client(url_address.getText(),Integer.parseInt(port.getText())); + }).start(); + } + } + + private void netty_client(String socket_address,int socket_port) { + log.info("netty client init ......."); + NioEventLoopGroup group = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.channel(NioSocketChannel.class); + bootstrap.group(group); + bootstrap.handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast("client handler", new ChannelInboundHandlerAdapter() { + // 接收响应消息 + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + log.debug("msg: {}", msg); + } + + // 在连接建立后触发 active 事件 + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + NettyClientController.this.client.setValue(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + log.info("exceptionCaught"); + } + }); + } + }); + Channel channel = bootstrap.connect(socket_address, socket_port).sync().channel(); + channel.closeFuture().sync(); + } catch (Exception e) { + log.error("client error", e); + } finally { + try { + group.shutdownGracefully().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} diff --git a/src/main/java/com/zhangmeng/tools/utils/AlertUtils.java b/src/main/java/com/zhangmeng/tools/utils/AlertUtils.java index bd2565a..b75645f 100644 --- a/src/main/java/com/zhangmeng/tools/utils/AlertUtils.java +++ b/src/main/java/com/zhangmeng/tools/utils/AlertUtils.java @@ -50,6 +50,14 @@ public class AlertUtils { alert.show(); } + public static void alert_msg(String msg) { + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.initModality(Modality.APPLICATION_MODAL); + alert.setContentText(msg); + alert.setHeaderText(null); + alert.show(); + } + public static void alert(String title, Parent node, Stage primaryStage){ alert(title,node,600,400,primaryStage); } diff --git a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java index 8a3a453..a7b2107 100644 --- a/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java +++ b/src/main/java/com/zhangmeng/tools/utils/ResourcesUtils.java @@ -199,4 +199,34 @@ public class ResourcesUtils { private String title; private int index; } + + public enum NetWorkTools{ + + Netty_Client_Websocket("netty websocket 客户端",0), + ; + + NetWorkTools(String title, int index) { + this.title = title; + this.index = index; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + + private String title; + private int index; + } } diff --git a/src/main/resources/fxml/home.fxml b/src/main/resources/fxml/home.fxml index d5fae70..dddd7b9 100644 --- a/src/main/resources/fxml/home.fxml +++ b/src/main/resources/fxml/home.fxml @@ -52,6 +52,12 @@ + + + + + + + + + + + + + + + + + +