Java
文章平均质量分 79
暗诺星刻
用心写好每一篇博客
展开
-
安卓 onActivityResult 废弃,registerForActivityResult 使用详解
registerForActivityResult 是 Activtity 的一个方法,它可以生成一个对象,该对象的 launch 方法可以启动一次 Activtity 调用流程。该对象可以启动一个 Activtity 并与之绑定,这样,将这个启动的 Activtity 回传时,接收回传数据的代码就无需使用请求码了。可以向 launch 提供一个实参来表示本次 Activtity 调用流程的输入。这个输入可以是任意类型,也可以为 null。// 这里的 this 指向的是一个 Activity。原创 2024-01-11 05:34:10 · 7813 阅读 · 0 评论 -
解决 MyBatis 一对多查询中,出现每组元素只有一个,总组数与元素数总数相等的问题
对于笔者的一对多的查询结果,出现了这样的一个现象:原来每个组里有多个元素,查询目标是查询所查的组,以及每个组中的元素。如果一个用户有 3 个好友,每组 4 个好友,则上述代码的查询结果会变成,该用户有 12 个好友分组,每个分组 1 个好友。MyBatis 对于多表查询,要求组元素的字段必须是基本类型,而笔者编程时非常喜欢隔离、封装、解耦,擅自在上面将组元素的字段封装成了一个单独的类,然后把这个类的对象作为组元素的字段。笔者之后在不断地建新的更基本的表,进行一对多查询,终于让笔者发现了问题所在。原创 2023-10-17 23:08:58 · 4354 阅读 · 0 评论 -
在 IntelliJ IDEA 中远程部署 Java 程序
在 IntelliJ IDEA 中进行远程调试与远程部署是不同的。 远程调试指的是事先以其它方法将 Java 应用打包并放在远程服务器中,然后以调试模式运行该 Java 应用,最后使用本地的 IntelliJ IDEA 进行远程连接该应用。 远程部署指的是直接使用本地的 IntelliJ IDEA 将本地的 Java 应用打包、部署到远程服务器,并远程运行该应用。 可以看出,远程部署要比远程调试方便很多。 关于在 IntelliJ IDEA 中远程调试 Java 程序,可见笔者的另一篇博客:原创 2023-09-12 00:46:56 · 2765 阅读 · 0 评论 -
Maven 和 Gradle 官方文档及相关资料的网址集合
Maven 仓库依赖包官方查询通道:https://mvnrepository.com/Maven 插件官方文档:https://maven.apache.org/plugins/安卓依赖包官方查询通道*:https://maven.google.com/web/Maven 下载安装教程:https://blog.csdn.net/wangpaiblog/article/details/112689500Maven 配置文件 POM 的常用插件配置代码:https://blog.csdn.net/wangp原创 2023-09-06 03:33:49 · 754 阅读 · 0 评论 -
如何在 Spring Boot 中集成日志框架 SLF4J、Log4j
因为 Spring Boot 已经内置了 Logback,所以需要先将 Logback 移除。移除的方法是在 Spring Boot 依赖包中移除 Logback。引入与 Spring Boot 适配的 Log4j2 依赖包。原创 2023-08-08 23:46:34 · 3413 阅读 · 0 评论 -
Nacos 下载安装教程
进行这个教程之前,必须要先安装好一个 Linux 操作系统。这个 Linux 操作系统可以安装在虚拟机中,也可以安装在真实的电脑中。关于这方面的内容,可见笔者的其它博客:各种操作系统安装教程大全:https://blog.csdn.net/wangpaiblog/article/details/115436520 为了方便远程输入命令、将文件加入到 Linux 操作系统中,最好还要在一台 Windows 操作系统上面使用一种终端控制软件,如 Xshell、Xftp 等。关于这方面的内容,可见笔者的另一篇博原创 2023-08-02 02:42:19 · 1094 阅读 · 0 评论 -
Spring 官方文档及相关资料的网址集合
Maven 仓库依赖包官方查询通道 Maven 插件官方文档 安卓依赖包官方查询通道 Spring Framework 官方文档原创 2023-07-23 17:04:30 · 1694 阅读 · 0 评论 -
解决Spring报错Content-Type applicationx-www-form-urlencoded;charset=UTF-8 is not supported
这是因为上面使用 OkHttp 发送 POST 请求时,使用的是 FormBody.Builder() 构造的请求体,这样发送的 HTTP 报文的 Content-Type 就会被设置成 application/x-www-form-urlencoded;charset=UTF-8。而后端 Spring MVC 在接收端使用的是 @RequestBody 注解,这样就会只认可值为 application/json 的 Content-Type。因此,Spring Cloud 微服务拒绝了这个请求。原创 2023-07-20 00:41:11 · 2379 阅读 · 0 评论 -
解决安卓OkHttp报错java.net.SocketException socket failed EACCES (Permission denied)
原来这个报错是因为笔者忘记在安卓清单文件中为该应用开启网络权限,因此该请求被安卓阻止。最近笔者在安卓中使用 OkHttp 向本地服务器发送请求的时候,发生了如下报错。开启网络权限的办法也很简单。中使用如下代码即可。原创 2023-07-19 00:10:23 · 1349 阅读 · 0 评论 -
解决Gateway报错Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway
最近笔者使用 Spring Cloud Gateway 的时候,发生了一个奇怪的事情:Spring Cloud 其它的微服务的运行是正常的,但 Spring Cloud Gateway 一启动就报错。原创 2023-07-18 03:08:11 · 3899 阅读 · 0 评论 -
解决Nacos显示服务已注册,但RestTemplate和OpenFeign调用失败:UnknownHostException
最近笔者进行 Spring Cloud Alibaba 版本升级的时候,发生了一个奇怪的事情:Nacos 显示服务已注册,但 RestTemplate 和 OpenFeign 的调用却一直失败。具体来说,笔者的两个服务,均在 Nacos 网页管理页面中显示各自的服务名,但一个服务使用 OpenFeign 调用另一个服务时,一直失败,OpenFeign 的 fallback 类方法一直被触发,而且没有抛出任何异常。原创 2023-07-17 02:39:23 · 7006 阅读 · 2 评论 -
Gradle 模块依赖中,使用 implementation 与 api 的区别
声明的依赖项表示该模块将向其依赖的其他模块公开此依赖项的 API。这意味着其他模块可以使用该依赖项提供的所有公共类和方法,以及该依赖项的传递依赖项提供的所有公共类和方法。声明的依赖项表示该模块将不向其依赖的其他模块公开此依赖项的 API。这意味着该依赖项只对该模块本身可见,并且不会被传递到依赖该模块的其他模块。换句话说**,如果想令本模块能传递性地获得依赖模块的依赖,那么应该在依赖模块的相应依赖中使用关键字。如果项目中有模块 A、B、C、D,且 A 依赖 B、B 依赖 C、C 依赖 D。原创 2023-05-05 01:05:28 · 3890 阅读 · 0 评论 -
解决Android Studio发生Room在Lombok下报错Cannot find setter for field
因为这个报错只出现在笔者其中一个涉及数据库的模块中,所以不是没有引入 Lombok 依赖的问题。起初,笔者以为是在 Gradle 依赖时,Room 依赖的位置比 Lombok 要靠前,但发现笔者当初早在一开始就把 Lombok 放在了首位,所以也不是这个问题。方法报这个错误,所以 Lombok 实际上还是生效了的。于是笔者不断更换 Lombok 的注解、删除 Lombok 的所有注解、使用手动的。所以对笔者这种情况,只需要删除上面那个 Lombok 注解即可。方法,终于让笔者发现了原因所在。原创 2023-04-27 04:04:27 · 1176 阅读 · 0 评论 -
Gradle 的下载安装教程
将含 bin 的 Gradle 安装文件夹放到你喜欢的目录下,并设置 Windows 中的环境变量(在设置 Gradle 的环境变量之前必须完成 JDK 的环境变量。选择合适的下载工具就可以下载了,因为是外国的网站,所以有可能下载缓慢,在百度云离线下载、浏览器内置下载和迅雷中,用迅雷下载的话非常快,所以推荐迅雷。,应该会出现一些配置信息,这说明前面的设置已经成功。按照需要选择 Gradle 其中的一个版本进行下载,这里选择的是。的上一级目录)即为 Gradle 的安装目录。后缀的才是需要下载的。原创 2023-03-11 12:14:35 · 10994 阅读 · 0 评论 -
如何在 Java 中调用 MATLAB 代码
运行环境:Windows 10 教育版 64位使用混合编程通常都不是好主意,但是有时候会遇到极端的情况。Java 擅长网络编程,MATLAB 擅长数学高级计算与图形化。这种情况下,没办法使用一种编程语言快速完成这两项事情,因此不得不使用 Java、MATLAB 混合编程。这里提供的办法是,将一个 MATLAB 函数文件转化为 Java 的 JAR 包,然后在 Java 中运行这个 JAR 包。原创 2022-12-12 21:30:21 · 6551 阅读 · 0 评论 -
如何将 MATLAB 源代码导出成 Java 的 JAR 包
运行环境:Windows 10 教育版 64位使用混合编程通常都不是好主意,但是有时候会遇到极端的情况。Java 擅长网络编程,MATLAB 擅长数学高级计算与图形化。这种情况下,没办法使用一种编程语言快速完成这两项事情,因此不得不使用 Java、MATLAB 混合编程。这里提供的办法是,将一个 MATLAB 函数文件转化为 Java 的 JAR 包,然后在 Java 中运行这个 JAR 包。编写这个教程时,笔者已经帮读者几乎踩遍了所有常见的坑。仔细阅读本教程可以减少很多麻烦。原创 2022-11-21 06:51:10 · 5908 阅读 · 3 评论 -
如何在 Maven 中通过本地路径使用 JAR 包依赖
在 Maven 的 POM 文件中使用本地路径引入 JAR 包依赖通常都不是好主意,但是有时候会遇到极端的情况。一般在 Maven 中引入依赖需要这个依赖已经存在于 Maven 仓库中。这个 Maven 仓库可以是本地仓库,也可以是远程仓库。如果这个 JAR 包不在仓库中,且只是希望临时马上使用,或者需要将这个 JAR 包随 Maven 项目一起传给他人,这个时候使用本地路径引入 JAR 包依赖反而方便可靠一些。原创 2022-11-14 03:29:51 · 4144 阅读 · 0 评论 -
大整数相除防溢出算法
大整数相除防溢出算法的核心思想如下:先把大整数拆成一些小整数。由于这种拆分通过一种求余运算即可实现,因此是可行的。然后根据分数的性质,分子、分母同时除以一个数,其结果不变。所以再将分子、分母同时除以一个数就可以让分子、分母都变小。这种除法对大整数而言是一种求整数商运算,因此是可行的。这种除法对小整数而言是一种在浮点数范围内的浮点数除法运算,因此也是可行的。使用递归的方法重复【1】、【2】的操作,直至分子、分母均位于 double 类型的范围内。原创 2022-10-09 05:33:11 · 933 阅读 · 0 评论 -
Java EE 为什么要改名为 Jakarta EE?Jakarta 不是印度尼西亚的首都吗?
为什么选择 Java 作为名称呢?这就要提及笔者经常提到的,西方人很喜欢使用与饮食相关的内容来命名。除此之外,当时这些个程序员的脑回路非常的清奇: Java 这一名称这是通过办公室中的热咖啡来联想到的。历史上,在 1696 年,当荷兰殖民印度尼西亚时,在印度尼西亚现在的首都 Jakarta 开始传播咖啡苗。之后,人们在印度尼西亚疯狂种植咖啡苗,并向欧洲供应。后来,印度尼西亚的一个名叫 Java 的岛屿上盛产咖啡。由于在该岛屿生产的咖啡声名远扬,人们很容易从咖啡联想到 Java 一词。于是,编程语言 Java原创 2021-03-08 01:14:34 · 5495 阅读 · 2 评论 -
编程语言 Java 这一名称的由来,它跟印度尼西亚有什么关系?
除此之外,当时这些个程序员的脑回路非常的清奇: Java 这一名称这是通过办公室中的热咖啡来联想到的。后来,印度尼西亚的一个名叫 Java 的岛屿上盛产咖啡。有趣的是,由于 Java 的这个命名,导致之后 Java EE 在改名时,将名称改为了 Jakarta EE。所以,原来与印度尼西亚没有血缘关系的 Java 创始人们,使用了一系列与印度尼西亚相关的名称。也由于这个名称,导致了很多与 Java 相关的事物中,使用了与咖啡豆相关的名称,如 NetBeans、Spring 中的 Bean 等。原创 2020-12-30 00:11:28 · 1958 阅读 · 0 评论 -
在 Java 中,如何创建泛型对象与泛型数组
很多人应该很清楚,在 Java 中,是不能直接创建泛型对象和泛型数组的。原因是 Java 有类型擦除,任何泛型类型在擦除之后就变成了 Object 类型,因此创建泛型对象就相当于创建了一个 Object 类型的对象。创建 Object 类型的对象通常没有任何意义,所以直接创建泛型对象的行为被编译器禁止。泛型数组也是一样。原创 2022-09-16 05:37:46 · 9577 阅读 · 2 评论 -
如何使用 Java 实现后台全局监听快捷键
说起使用 Java 实现快捷键,很多人都能想到,借助 Java 领域的 GUI 技术(如 Java Swing、JavaFX 等)就可以实现快捷键的功能。但是,使用这种方法实现的快捷键有一个致命的缺陷,那就是如果光标焦点离开此 UI 界面,则所有的快捷键都将失效。另外,这些快捷键是依附于一种 UI 界面来运行的,因此将占用额外的资源。这些都是一个很大的限制。本文就来探究一下如何设置一个后台运行的全局快捷键。给出的解决方案必须要让别人知道这个解决方案帮助别人解决了什么问题。原创 2022-07-02 21:47:43 · 6752 阅读 · 3 评论 -
Java NIO 中的非阻塞究竟体现在哪里?
Java NIO 中的非阻塞究竟体现在哪里?Reactor 模式异步非阻塞可以基于 Java BIO 实现吗?Java NIO 中的非阻塞究竟体现在哪里? 很多人应该对“Java NIO 是非阻塞的 I/O”这一信条熟记于心,但其中的有些人可能经过实践之后却产生这样的疑惑:Java NIO 明明是非阻塞的 I/O,但 Java NIO 中无论是 Channel 还是 Selector 的方法却是阻塞的,其中的一个被称为设置 Channel 为非阻塞的方法 XXXChannel.configureBloc原创 2022-05-17 19:33:15 · 2089 阅读 · 1 评论 -
为什么 MyBatis 里,Mapper 中的方法不能被重载
为什么 MyBatis 里,Mapper 中的方法不能被重载 很多人还没意识到,在 MyBatis 里,Mapper 中的方法是不能被重载的,这与形参个数无关。为什么会这样呢? MyBatis 对 Mapper 进行动态代理的时候,使用了一种 ID 值来标识每个 SQL 语句,而这种 ID 值是只是由 Mapper 的类名和方法名来共同标识的,这不包括方法形参。具体源码分析如下: 如下图所示。MyBatis 首先是用 Mapper 的类名和方法名生成了一个 mappedStatementId,然原创 2022-05-09 22:00:50 · 2188 阅读 · 0 评论 -
将 Maven 中的多模块项目只打成一个 JAR 包
将 Maven 中的多模块项目打成一个 JAR 包假设读者已经编写好了一个可以在编译器中运行的一个 Maven 多模块项目。对于 Maven 多模块项目,应该首先有一个父 pom,它的属性 packaging 为 pom。而它的一个不成为其它模块的父模块的子模块,其属性 packaging 应该为 jar 或 war。将上面的 Maven 项目打成一个 JAR 包,可以使用插件 maven-assembly-plugin。它有一个目标 single 可以完成此任务。使用该插件打包出来的 JAR原创 2021-08-12 06:30:34 · 21446 阅读 · 1 评论 -
用 Redis 实现分布式锁(Java 版)
用 Redis 实现分布式锁(Java版)核心代码完整代码 分布式锁是一种解决分布式临界资源并发读写的一种技术。本文详细介绍了在 Java 中使用 Redis 实现分布式锁的方法。为了方便,这里使用了 Spring Boot 中的 RedisTemplate 来与 Redis 进行交互。本文实现的分布式锁的功能如下:是分布式锁,互斥粒度为线程级。可重入。同一线程可多次上锁。锁不唯一。可以持有多个名称不同的锁,不同名的锁之间的创建与释放互相独立。支持锁过期自动释放。支持持锁超时自动异步续时。原创 2022-03-21 02:29:08 · 8097 阅读 · 0 评论 -
极简高并发秒杀商城
极简高并发秒杀商城版本 M.0.0 运行效果图登录和注册商品界面购买界面订单界面技术内幕总括源代码 这是一款极简高并发秒杀商城项目。本项目偏向于后端。之所以说“极简”,是因为本项目的前端界面没有丰富炫酷的商品界面,目前就只有三个各具特色的商品,只是意思一下,用于充当实际种类繁多的商品。 麻雀虽小,五脏俱全。虽然本项目做得很简单,但包含高并发秒杀项目的基本功能。项目代码已在 GitHub 上开源免费发布,作者将对此项目提供持续更新与维护。本项目的源码分为前端和后端两个部分,GitHub 源码地址将在文原创 2022-03-18 21:56:01 · 3950 阅读 · 0 评论 -
解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapp
解决Spring Boot报错Mapped Statements collection already contains value for...Error while adding the mapper 今天,在笔者刚刚编写完一个上万行的 SpringBoot 项目后,第一次运行时,一运行果然马上就报错了。笔者从来没有哪一次是代码编写完就一次性通过的,显然这次也不例外。经过这次报错得到的教训是:一定要及时勤劳地编写单元测试。把单元测试拖到所有 Bug 全部查完之后再编写没有任何意义。笔者报错时的运原创 2022-03-08 03:21:31 · 5110 阅读 · 0 评论 -
在 Java 中,如何批量读取本项目资源目录下的所有文件
在 Java 中,如何批量读取本项目资源目录下的所有文件读取资源目录下的指定文件方法 1:使用 JDK 中原始 API方法 2:借助 Spring附录将 InputStream 转化为 byte 数组将 File 转化为 byte 数组将 byte 数组转化为 InputStream 今天笔者遇到一个需求,如何读取本项目资源目录下的所有文件。读取资源目录下的指定的文件很容易,这只需要给出路径即可。读取资源目录下的指定文件/** * 方法 getResourceAsStream 的路径是以资源目录原创 2022-03-07 00:24:06 · 6405 阅读 · 0 评论 -
如何免安装服务器将 React 整合进 Spring Boot
如何将 React 整合进 SpringBoot下载 SpringBoot 官方 demo下载 React 官方 demo开始整合使用 Spring MVC 控制器导向 React将 React 打包文件置入 SpringBoot 更深的文件夹中使用本地资源路径停止 SpringBoot完整代码运行环境:React 环境:React 16.13.0npm 8.3.1webpack 5.68.0WebStorm 2021.3SpringBoot 环境:Java原创 2022-02-20 21:21:31 · 3249 阅读 · 0 评论 -
使用 GraalVM 将纯 JavaFX 项目打包成 EXE
使用 GraalVM 将纯 JavaFX 项目打包成 exeGraalVM 的环境搭建使用 GraalVM 打包不含 FXML 的纯 JavaFX 项目使用 GraalVM 打包含 FXML 的纯 JavaFX 项目测评在 IntelliJ IDEA 中直接运行生成 JAR 包后运行GraalVM 打包后运行总结 GraalVM 可以使得 Java 应用可以脱离 JVM 来运行。换句话说,它可以使 Java 应用在没有 Java 环境中运行。不过目前,这项技术还有很多的问题。由于 GraalVM 使用的原创 2022-02-09 21:43:19 · 10908 阅读 · 15 评论 -
解决JavaFX报错缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序
解决JavaFX报错缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序方法 1:使用 Java 8方法 2:使用 Java 模块系统方法 3:使用引导类 很多 JavaFX 初学者在下载并运行老的 JavaFX 项目时,经常遇到下面这个错误。错误: 缺少 JavaFX 运行时组件, 需要使用该组件来运行此应用程序 为什么发生这种错误呢?这需要谈及 JavaFX 的历史。在 Java 8 之后,JavaFX 从 JDK 中分离出来,然后在 Java 9 时,Java 引入了 Java原创 2022-02-08 23:22:35 · 32634 阅读 · 8 评论 -
Java RMI 入门
Java RMI 入门如何通信实战 Java RMI 指 Java 中远程方法调用(Remote Method Invocation)。通过 Java RMI,可以直接在客户端调用服务端的方法,并获得其返回值。Java RMI 是 RPC(Remote procedure call) 技术的 Java 实现,它提供了一种非常便捷的方式在 Java 中实现 RPC。 使用 RMI 之前,需要知道以下概念:服务端服务端的暴露方法客户端 RMI 可以让客户端调用位于服务端的暴露方原创 2022-02-02 01:19:36 · 1428 阅读 · 0 评论 -
Java 函数式编程与事件驱动模式
Java 函数式编程入门函数式编程实战改进 像 JavaScript 这种语言很早就支持闭包了,虽然 C++ 很早就有了函数指针,Java 也很早就提供了反射中的 Method 类,不过使用它们都不能算是真正的函数式编程(面向函数编程)。原因它们还不够方便和优雅。编程语言是为人类设计的语言,如果仅仅为了可实现,那任何编程思想、设计模式、架构模式都没有意义。 Java 从 Java 8 开始支持 lambda 表达式,这才算是支持函数式编程。函数式编程有什么好处呢?如果将其与依赖注入技术结合,可以很好原创 2022-02-01 03:08:59 · 2236 阅读 · 0 评论 -
Windows 多功能计算器
Windows 多功能计算器版本 M.3.1 运行效果图基本信息开发环境编程语言技术内幕架构模式设计模式模块介绍包名介绍测试核心算法操作数运算算法表达式检查的算法静态检查与动态检查算法单个字符语法检查的算法【静态检查算法】表达式计算的算法【动态检查算法】显示计算过程的算法通信算法独出心裁的设计将 Map 当做 Redis 数据库来使用懒执行JavaFX 与 Spring 适配使用 URL 来方便地进行各 UI 组件的之间的交互旧算法操作数运算算法(旧版本 M.1.1)显示计算过程的算法(旧版本 M.1.2)原创 2022-01-19 23:22:36 · 3107 阅读 · 0 评论 -
使用 GraalVM 将基本的 Java 项目打包成 EXE
使用 GraalVM 将基本的 Java 项目打包成 exeGraalVM 的环境搭建使用 GraalVM 将基本的 Java 项目打包成 exe使用 GraalVM 将 JAR 转化为 exeGraalVM 的环境搭建GraalVM 有两种版本,Community 和 Enterprise。其中,前者对应于 OpenJDK,后者对应 Oracle JDK。需要根据自己的需要进行选择,本文以 GraalVM Enterprise 21.3.0 为例。GraalVM 版本选择网址:https://w原创 2022-01-11 02:23:10 · 6684 阅读 · 2 评论 -
如何使用 Java 中执行 Windows 的 CMD 命令
如何在 Java 中执行 Windows 的 CMD 命令核心代码完整代码 在 CMD 中执行 BAT 脚本对用户不友好,而且有安全隐患,因此笔者编写了一些可以在 Java 中执行 Windows 的 CMD 命令的 API。核心代码执行单条命令package org.wangpai.demo;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import原创 2022-01-10 00:32:25 · 3173 阅读 · 1 评论 -
log4j2.xml 的标签 loggers 中 root 的属性 level 指的是什么
log4j2.xml 的标签 loggers 中 root 的属性 level 指的是什么 log4j2.xml 是 log4j2 中的其中一种配置文件。log4j2.xml 中往往有如下配置:<configuration ...> <appenders/...> <loggers> <root level="DEBUG"> <appender-ref ref="Console"/>原创 2022-01-05 02:44:12 · 7463 阅读 · 0 评论 -
简易 IM 双向通信电脑端 GUI 应用——基于 Netty、WebSocket、JavaFX 、多线程技术等
使用 Netty 技术、WebSocket 协议、JavaFX 客户端进行双向 IM 通信的 demo 项目说明运行效果核心代码源代码参考知识说明 这是一款使用 Netty 来实现 IM 双向通信的 demo 项目。 通信双方互为发送方、接收方。通信双方均使用 WebSocket 协议。 通信双方的客户端 GUI 界面均是使用 JavaFX 来实现的。在该文本框中,可以点击 发送 按钮来发送消息,也可以使用 Enter,而在文本中另起一行需要使用组合键 Ctrl + Enter 来完成。原创 2021-12-21 02:05:13 · 717 阅读 · 0 评论 -
简易 IM 双向通信电脑端 GUI 应用——基于 Netty、JavaFX、多线程技术等
通信时可以传输Java对象,而不限制为简单的文本数据。在发送端、接收端可以借助传输载体,通过对Java对象的序列化和反序列化来实现对Java对象的透明传输。这是一个使用Netty来实现IM双向通信的demo项目。通信双方的客户端GUI界面均是使用JavaFX来实现的。通信双方的通信是使用Netty来实现的,已解决Netty传输过程中的半包、粘包问题。通信过程是由其它线程在后台完成,不会阻塞UI线程。实现对Java对象的透明传输。按钮来发送消息,也可以使用。......原创 2021-12-13 01:55:06 · 651 阅读 · 0 评论