Loading...

基于JavaFX的桌面端网络调试工具

关于此项目

JFX Network Tools 是一款轻便的网络调试工具(基于JavaFX),支持 TCP/UDP 客户端与服务端模式。界面清晰,适用于网络协议调试、IoT 设备测试、教学演示、快速原型开发等场景。这是我第一个开源小工具,有兴趣的小伙伴可以去看看~开源地址在文章末尾

功能亮点

功能模块简要说明
TCP/UDP 客户端 & 服务端支持同一工具中切换客户端与服务端,方便调试多种网络模型
自动应答支持设置静态应答数据,后续计划支持自定义规则应答逻辑
日志保存可保存通信记录为本地日志,便于回溯与分析
历史记录自动保存最近的连接配置,一键复用,节省重复输入时间
定时发送支持周期性发送特定数据,适合模拟心跳包等场景
主题切换内置浅色/深色主题,并根据操作系统外观自动适配

技术栈

使用的技术栈有:

  • JavaFX 17+
  • Maven
  • AtlantaFX
  • RichTextFX
  • JLink
  • Jpackage

打包模块化jar

本项目使用了richtextfx-0.11.5.jar,并且richtextfx-0.11.5.jar依赖了flowless-0.7.4.jar、reactfx-2.0-M5.jar、wellbehavedfx-0.3.3.jar、undofx-2.1.1.jar

这些jar都没有模块化,所以无法使用jlink打包本地镜像,先手动将其及依赖jar进行模块化编译(这将会覆盖原有的 jar),再将已模块化的jar拷贝进项目再add as library或者自制maven仓库在pom.xml引入此maven

前提

下载安装合适的 javafx-sdk

示例

在一个固定的目录(build-modules)下将richtextfx-0.11.5.jar 生成依赖模块

jdeps --ignore-missing-deps --generate-module-info . richtextfx-0.11.5.jar

通过以上命令即可生成一个module-info.java的文件在org.fxmisc.richtext目录中。

创建目录:richtextfx-out

编译module-info.java到目录richtextfx-out

# richtextfx-0.11.5.jar有依赖其他jar,
# 所以编译module-info.java时需要将其他已模块化的依赖jar拼接在--module-path

javac \
  --module-path "javafx-sdk-17.0.15/lib:flowless-0.7.4.jar:reactfx-2.0-M5.jar:wellbehavedfx-0.3.3.jar:undofx-2.1.1.jar" \
  --patch-module org.fxmisc.richtext=richtextfx-0.11.5.jar \
  -d richtextfx-out \
  org.fxmisc.richtext/module-info.java

将已编译的module-info.java打进richtextfx-0.11.5.jar

jar --update --file=richtextfx-0.11.5.jar -C richtextfx-out module-info.class

一键模块化打包

以上示例如何将一个未模块化的jar进行模块化,本项目已将需要模块化的jar统一模块化,并整理成一个脚本,可一键运行模块化。

操作步骤详见本项目 /build-modular/richtextfx 目录,具体包括:

  1. 解压 JavaFX SDK(根据你的操作系统下载对应的sdk);
  2. 运行 build.sh 脚本自动完成依赖模块化并安装至本地 Maven 仓库;
  3. 即可使用jlink生成可运行镜像。

该过程仅需本地一次性执行,打包后的模块已支持 jlink 运行时构建。

build.sh脚本:

#!/bin/bash
set -e

# === 配置路径 ===
JAVAFX_LIB="javafx-sdk-17.0.15/lib"  # 请根据你本地路径修改
REACTFX_JAR="reactfx-2.0-M5.jar"
FLOWLESS_JAR="flowless-0.7.4.jar"
RICHTEXTFX_JAR="richtextfx-0.11.5.jar"
WELLBEHAVEDFX_JAR="wellbehavedfx-0.3.3.jar"
UNDOFX_JAR="undofx-2.1.1.jar"

# === 创建输出目录 ===
mkdir -p reactfx-out flowless-out richtextfx-out wellbehavedfx-out undo-out

# ================ReactFX Start=====================
echo "为 ReactFX 添加 module-info.java"
mkdir -p org.reactfx
cat > org.reactfx/module-info.java <<EOF
module reactfx {
    requires javafx.base;
	  requires javafx.graphics;
	  requires javafx.controls;

    exports org.reactfx;
    exports org.reactfx.collection;
    exports org.reactfx.inhibeans;
    exports org.reactfx.inhibeans.binding;
    exports org.reactfx.inhibeans.collection;
    exports org.reactfx.inhibeans.property;
    exports org.reactfx.inhibeans.value;
    exports org.reactfx.value;
	  exports org.reactfx.util;
}
EOF

echo "[2/13] 编译 ReactFX module-info"
javac \
  --module-path "$JAVAFX_LIB" \
  --patch-module reactfx="$REACTFX_JAR" \
  -d reactfx-out \
  org.reactfx/module-info.java

echo "[3/13] 更新 ReactFX JAR"
jar --update --file="$REACTFX_JAR" -C reactfx-out module-info.class

echo "[4/13] 安装 ReactFX 到本地 Maven 仓库"
mvn install:install-file \
  -Dfile="$REACTFX_JAR" \
  -DgroupId=org.reactfx \
  -DartifactId=reactfx \
  -Dversion=2.0-M5-modular \
  -Dpackaging=jar
# ================ReactFX End=====================

# ================Flowless Start=====================
echo "[5/13] 为 Flowless 添加 module-info.java"
mkdir -p org.fxmisc.flowless
cat > org.fxmisc.flowless/module-info.java <<EOF
module org.fxmisc.flowless {
	  requires javafx.controls;
    requires reactfx;

    exports org.fxmisc.flowless;
}

EOF

echo "✅ [6/13] 编译 Flowless module-info"
javac \
  --module-path "$JAVAFX_LIB:$REACTFX_JAR" \
  --patch-module org.fxmisc.flowless="$FLOWLESS_JAR" \
  -d flowless-out \
  org.fxmisc.flowless/module-info.java

echo "[7/13] 更新 Flowless JAR"
jar --update --file="$FLOWLESS_JAR" -C flowless-out module-info.class

echo "[8/13] 安装 Flowless 到本地 Maven 仓库"
mvn install:install-file \
  -Dfile="$FLOWLESS_JAR" \
  -DgroupId=org.fxmisc.flowless \
  -DartifactId=flowless \
  -Dversion=0.7.4-modular \
  -Dpackaging=jar
# ================Flowless End=====================

# ================UndoFX Start=====================
echo "为 UndoFX 添加 module-info.java"
mkdir -p org.fxmisc.undo
cat > org.fxmisc.undo/module-info.java <<EOF
module org.fxmisc.undo {
    requires javafx.base;
	  requires reactfx;

    exports org.fxmisc.undo;
}
EOF

echo "编译 UndoFX module-info"
javac \
  --module-path "$JAVAFX_LIB:$REACTFX_JAR" \
  --patch-module org.fxmisc.undo="$UNDOFX_JAR" \
  -d undo-out \
  org.fxmisc.undo/module-info.java

echo "更新 UndoFX JAR"
jar --update --file="$UNDOFX_JAR" -C undo-out module-info.class

echo "安装 UndoFX 到本地 Maven 仓库"
mvn install:install-file \
  -Dfile="$UNDOFX_JAR" \
  -DgroupId=org.fxmisc.undo \
  -DartifactId=undofx \
  -Dversion=2.1.1-modular \
  -Dpackaging=jar
# ================UndoFX End=====================

# ================WellBehavedFX Start=====================
echo "为 WellBehavedFX 添加 module-info.java"
mkdir -p org.fxmisc.wellbehavedfx
cat > org.fxmisc.wellbehavedfx/module-info.java <<EOF
module wellbehavedfx {
	  requires javafx.controls;

    exports org.fxmisc.wellbehaved.event;
    exports org.fxmisc.wellbehaved.event.internal;
    exports org.fxmisc.wellbehaved.event.template;
}
EOF

echo "编译 WellBehavedFX module-info"
javac \
  --module-path "$JAVAFX_LIB" \
  --patch-module wellbehavedfx="$WELLBEHAVEDFX_JAR" \
  -d wellbehavedfx-out \
  org.fxmisc.wellbehavedfx/module-info.java

echo "更新 WellBehavedFX JAR"
jar --update --file="$WELLBEHAVEDFX_JAR" -C wellbehavedfx-out module-info.class

echo "安装 WellBehavedFX 到本地 Maven 仓库"
mvn install:install-file \
  -Dfile="$WELLBEHAVEDFX_JAR" \
  -DgroupId=org.fxmisc.wellbehavedfx \
  -DartifactId=wellbehavedfx \
  -Dversion=0.3.3-modular \
  -Dpackaging=jar
# ================WellBehavedFX End=====================

# ================RichTextFX Start=====================
echo "为 RichTextFX 添加 module-info.java"
mkdir -p org.fxmisc.richtext
cat > org.fxmisc.richtext/module-info.java <<EOF
module org.fxmisc.richtext {
	  requires javafx.controls;
    requires javafx.fxml;
    requires reactfx;
	  requires org.fxmisc.flowless;
	  requires org.fxmisc.undo;
	  requires wellbehavedfx;

    exports org.fxmisc.richtext;
    exports org.fxmisc.richtext.event;
    exports org.fxmisc.richtext.model;
    exports org.fxmisc.richtext.util;

}
EOF

echo "[10/13] 编译 RichTextFX module-info"
javac \
  --module-path "$JAVAFX_LIB:$REACTFX_JAR:$FLOWLESS_JAR:$WELLBEHAVEDFX_JAR:$UNDOFX_JAR" \
  --patch-module org.fxmisc.richtext="$RICHTEXTFX_JAR" \
  -d richtextfx-out \
  org.fxmisc.richtext/module-info.java

echo "更新 RichTextFX JAR"
jar --update --file="$RICHTEXTFX_JAR" -C richtextfx-out module-info.class

echo "安装 RichTextFX 到本地 Maven 仓库"
mvn install:install-file \
  -Dfile="$RICHTEXTFX_JAR" \
  -DgroupId=org.fxmisc.richtext \
  -DartifactId=richtextfx \
  -Dversion=0.11.5-modular \
  -Dpackaging=jar
# ================RichTextFX End=====================
echo ""
echo "🎉 所有模块化依赖均已安装完成。"

构建流程

Maven直接package,打包本地 .app 可运行文件

jpackage \
  --type app-image \
  --name "JFX Network Tools" \
  --app-version 1.1 \
  --input target \
  --main-jar jfx-network-tools-1.1.jar \
  --main-class cn.nnjskz.jfx.MainApplication \
  --runtime-image target/jfx-network-tools-runtime \
  --icon target/classes/imgs/network-mac.icns \
  --dest /Users/jensen/Downloads

软件图片

20250721142105590.webp     20250721142105375.webp    20250721142106938.webp    20250721142107557.webp    20250721142107537.webp


20250721142108521.webp    20250721142109915.webp

开源地址

https://gitee.com/nnjskz/jfx-network-tools

https://github.com/nnjskz/jfx-network-tools

0

回到顶部