JAVA异步的TCP 通讯-服务端
一、服务端代码示例
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class AdvancedAsyncTCPServer {private static final int PORT = 8888;private static final int BUFFER_SIZE = 1024;private final AsynchronousServerSocketChannel serverSocketChannel;private final ExecutorService threadPool;public AdvancedAsyncTCPServer() throws IOException {// 创建异步服务器套接字通道serverSocketChannel = AsynchronousServerSocketChannel.open();// 绑定到指定端口serverSocketChannel.bind(new InetSocketAddress(PORT));// 创建一个固定大小的线程池,用于处理业务逻辑threadPool = Executors.newFixedThreadPool(10);System.out.println("Server started on port " + PORT);}public void start() {// 开始接受客户端连接acceptConnections();}private void acceptConnections() {// 异步接受客户端连接serverSocketChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {@Overridepublic void completed(AsynchronousSocketChannel clientChannel, Void attachment) {// 继续接受下一个连接acceptConnections();// 处理新连接handleConnection(clientChannel);}@Overridepublic void failed(Throwable exc, Void attachment) {System.err.println("Failed to accept connection: " + exc.getMessage());}});}private void handleConnection(AsynchronousSocketChannel clientChannel) {// 创建缓冲区ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);// 异步读取客户端数据clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer bytesRead, ByteBuffer buffer) {if (bytesRead > 0) {buffer.flip();byte[] data = new byte[buffer.remaining()];buffer.get(data);String message = new String(data);System.out.println("Received message from client: " + message);// 使用线程池处理业务逻辑threadPool.submit(() -> {try {// 模拟业务处理String responseMessage = "Server processed: " + message;ByteBuffer responseBuffer = ByteBuffer.wrap(responseMessage.getBytes());// 异步发送响应给客户端clientChannel.write(responseBuffer, responseBuffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer bytesWritten, ByteBuffer buffer) {System.out.println("Response sent to client");try {// 继续读取客户端数据buffer.clear();clientChannel.read(buffer, buffer, this);} catch (Exception e) {closeChannel(clientChannel);}}@Overridepublic void failed(Throwable exc, ByteBuffer buffer) {System.err.println("Failed to send response: " + exc.getMessage());closeChannel(clientChannel);}});} catch (Exception e) {closeChannel(clientChannel);}});} else if (bytesRead == -1) {// 客户端关闭连接closeChannel(clientChannel);} else {// 继续读取客户端数据buffer.clear();clientChannel.read(buffer, buffer, this);}}@Overridepublic void failed(Throwable exc, ByteBuffer buffer) {System.err.println("Failed to read data: " + exc.getMessage());closeChannel(clientChannel);}});}private void closeChannel(AsynchronousSocketChannel channel) {try {System.out.println("Closing client connection");channel.close();} catch (IOException e) {System.err.println("Error closing channel: " + e.getMessage());}}public void stop() {try {// 关闭服务器套接字通道serverSocketChannel.close();// 关闭线程池threadPool.shutdown();} catch (IOException e) {System.err.println("Error stopping server: " + e.getMessage());}}public static void main(String[] args) {try {AdvancedAsyncTCPServer server = new AdvancedAsyncTCPServer();server.start();} catch (IOException e) {System.err.println("Error starting server: " + e.getMessage());}}
}
二、代码分析
AdvancedAsyncTCPServer
类:
-
构造函数:创建
AsynchronousServerSocketChannel
并绑定到指定端口,同时创建一个固定大小的线程池用于处理业务逻辑。 start()
方法:开始接受客户端连接。acceptConnections()
方法:异步接受客户端连接,使用CompletionHandler
处理连接结果。handleConnection()
方法:处理新连接,异步读取客户端数据,并使用线程池处理业务逻辑。closeChannel()
方法:关闭客户端通道。stop()
方法:关闭服务器套接字通道和线程池。
CompletionHandler
:
- 用于处理异步操作的完成结果,包括连接、读取和写入操作。
- 在
completed()
方法中处理成功的操作,在failed()
方法中处理失败的操作。
线程池:
-
使用
Executors.newFixedThreadPool(10)
创建一个固定大小的线程池,用于处理业务逻辑,避免阻塞 I/O 操作。
三、优点
- 异步 I/O:使用 Java NIO 2 的异步 I/O 功能,提高了服务器的并发处理能力。
- 线程池:使用线程池处理业务逻辑,避免了创建过多线程导致的性能问题。
- 异常处理:对各种异常情况进行了处理,提高了代码的健壮性。
- 资源管理:在关闭服务器时,正确关闭服务器套接字通道和线程池,避免资源泄漏。
相关文章:
JAVA异步的TCP 通讯-服务端
一、服务端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.Completion…...

高效协同,Tita 助力项目管理场景革新
在当今快节奏、高度竞争的商业环境中,企业面临着前所未有的挑战:如何在有限资源下迅速响应市场变化,确保多个项目的高效执行并达成战略目标?答案就在于优化项目集程管理。而在这个过程中,Tita项目管理产品以其独特的优…...
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧
【AIGC魔童】DeepSeek v3提示词Prompt书写技巧 (1)基础通用公式(适用80%场景)(2)问题解决公式(决策支持)(3)创意生成公式(4)学习提升公…...
Vue | 透传 Attributes(非 prop 的 attribute )
文章目录 引言I Attribute 继承II 禁用 attribute 继承禁用 attribute 继承的常见场景通过将 inheritAttrs 选项设置为 false从 3.3 开始可在 `<script setup>` 中使用defineOptions例子引言 “透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emi…...

启明星辰发布MAF大模型应用防火墙产品,提升DeepSeek类企业用户安全
2月7日,启明星辰面向DeepSeek等企业级大模型业务服务者提供的安全防护产品——天清MAF(Model Application Firewall)大模型应用防火墙产品正式发布。 一个新赛道将被开启…… DeepSeek的低成本引爆赛道规模 随着DeepSeek成为当前最热的现象级…...

Vuex 解析:从 Vue 2 到 Vue 3 的演变与最佳实践
Vuex 是 Vue.js 中的状态管理模式,广泛应用于 Vue 2 和 Vue 3 中,其内部实现存在一些差异。 1. 什么是 Vuex ? Vuex 是 Vue.js 官方提供的状态管理库,用于集中管理应用的所有组件的状态。主要是通过一种集中化的方式来管理共享状…...

一文解释nn、nn.Module与nn.functional的用法与区别
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀零基础入门PyTorch框架_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 …...

日志统计(acWing,蓝桥杯)
题目: 1238. 日志统计 题目 提交记录 讨论 题解 视频讲解 小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有 NN 行。 其中每一行的格式是: ts id 表示在 tsts 时刻编号 idid 的帖子收到一个”赞”。 现在小明想…...

3个DeepSeek隐藏玩法
大家最近是不是都被DeepSeek-R1刷屏了 这款号称“中国版O1”的模型,不仅在数学和编程领域表现出色,中文写作能力也很强。 最重要的是,它在理解提示词方面有了很大突破,只要你能打字,它就能理解你的意思。 不过&…...

部署LLM模型到云端
文章目录 1 ECS 云服务器部署2 函数计算FC3 人工智能平台PAI-EAS4 大模型服务平台百炼压测实验结果显示,由于本地设备算力有限,本地部署的模型服务无法满足低延迟和高并发的需求。针对这类线上业务,可以考虑云端部署。 下面先来看看本地部署和云端部署的特点对比。 由上可…...
Python连接不同数据库的总结
Python连接不同数据库的总结 在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言。本文将深入探讨Python连接不同类型数据库的方法、常用库以及关键注意事项。 一、连接MySQL数据库 MySQL是广泛使用…...

web直播弹幕抓取分析 signature
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言 最近遇到太多难点了卡了很久&am…...

Linux ftrace 内核跟踪入门
文章目录 ftrace介绍开启ftraceftrace使用ftrace跟踪指定内核函数ftrace跟踪指定pid ftrace原理ftrace与stracetrace-cmd 工具KernelShark参考 ftrace介绍 Ftrace is an internal tracer designed to help out developers and designers of systems to find what is going on i…...

1Panel应用推荐:WordPress开源博客软件和内容管理系统
1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…...

【数据结构-C语言】绪论
文章目录 一、前言二、基本概念和术语2.1 数据元素、数据项和数据对象2.2 数据结构2.2.1 逻辑结构2.2.2 存储结构 2.3 时间复杂度 一、前言 数据结构部分是根据严蔚敏老师的《数据结构-C语言版第2版》书中内容整理的。 二、基本概念和术语 2.1 数据元素、数据项和数据对象 …...
java poi Excel 文件导入导出常见错误及解决方案
在使用 Apache POI 进行 Excel 文件的导入导出操作时,可能会遇到各种问题。以下是一些常见的错误及其解决方案: 一、文件格式相关问题 1. 文件格式不兼容 问题描述:尝试使用 HSSFWorkbook 读取 .xlsx 文件,或者使用 XSSFWorkbo…...
深入浅出DeepSeek LLM 以长远主义拓展开源语言模型
深入浅出地讲解DeepSeek LLM 以长远主义拓展开源语言模型 🌟 1. 什么是 DeepSeek LLM? 大家想象一下,你在游戏里要打造一个超级英雄角色,选择最强的装备、技能点和升级策略。那么,DeepSeek LLM 就是 AI 界的“超级英雄…...
【Leetcode 每日一题】59. 螺旋矩阵 II
问题背景 给你一个正整数 n n n,生成一个包含 1 1 1 到 n 2 n ^ 2 n2 所有元素,且元素按顺时针顺序螺旋排列的 n n n \times n nn 正方形矩阵 m a t r i x matrix matrix。 数据约束 1 n 20 1 \times n \times 20 1n20 解题过程 定义方向数组…...
回退 android studio emulator 的版本
前情提要 最近用 frida 需要一个完全跑 arm64 的手机 os,因为雷电实时转义 arm 到 x64 的方案本质上还是 x64,会导致 frida 有 bug。查了一下有帖子说 android studio 自带的模拟器支持直接跑 arm64 的镜像 (Other Images) 直接跑跑不通,调…...
数据资产的管理与价值释放
引言:从 “黑金” 到 “数据” 的文明跃迁 在探讨数字资产的未来之前,我们不妨先回顾一下黄金在人类历史长河中的角色。黄金,这种闪耀着独特光芒的金属,从远古时代起就与人类文明紧密相连。在古埃及,黄金被视为太阳神…...

LiveNVR 直播流拉转:Onvif/RTSP/RTMP/FLV/HLS 支持海康宇视天地 SDK 接入-视频广场页面集成与视频播放说明
LiveNVR直播流拉转:Onvif/RTSP/RTMP/FLV/HLS支持海康宇视天地SDK接入-视频广场页面集成与视频播放说明 一、视频页面集成1.1 关闭接口鉴权1.2 视频广场页面集成1.2.1 隐藏菜单栏1.2.2 隐藏播放页面分享链接 1.3 其它页面集成 二、播放分享页面集成2.1 获取 iframe 代…...

爬虫入门指南-某专利网站的专利数据查询并存储
免责声明 本教程仅用于教育目的,演示如何合法获取公开专利数据。在实际操作前,请务必: 1. 仔细阅读目标网站的robots.txt文件和服务条款 2. 控制请求频率,避免对服务器造成负担 3. 仅获取和使用公开数据 4. 不用于商业用途或…...
Java-File类基本方法使用指南
Java-File类基本方法使用指南 一、File类基础概念1.1 什么是File类1.2 File类的构造函数 二、文件和目录的创建与删除2.1 创建文件 - createNewFile()2.2 创建目录 - mkdir() 和 mkdirs()2.3 删除文件或目录 - delete() 三、文件和目录的查询与判断3.1 存在性判断 - exists()3.…...
用 Appuploader,让 iOS 上架流程真正“可交接、可记录、可复用”:我们是这样实现的
你可能听说过这样一类人:上线必找他,证书只有他有,Transporter 密码在他电脑上,描述文件什么时候过期,只有他知道。 如果你团队里有这样一位“发布大师”,他可能是个英雄——但也是个单点风险源。 我们团…...

R 语言科研绘图 --- 热力图-汇总
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Excel 操作 转图片,转pdf等
方式一 spire.xls.free(没找设置分辨率的方法) macOs开发Java GUI程序提示缺少字体问题解决 Spire.XLS:一款Excel处理神器_spire.xls免费版和收费版的区别-CSDN博客 官方文档 Spire.XLS for Java 中文教程 <dependency><groupI…...
MySQL访问控制与账号管理:原理、技术与最佳实践
MySQL的安全体系建立在精细的访问控制和账号管理机制上。本文基于MySQL 9.3官方文档,深入解析其核心原理、关键技术、实用技巧和行业最佳实践。 一、访问控制核心原理:双重验证机制 连接验证 (Connection Verification) 客户端发起连接时,MyS…...

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.11 R语言解题
本文是实验设计与分析(第6版,Montgomery著,傅珏生译) 第5章析因设计引导5.7节思考题5.11 R语言解题。主要涉及方差分析,正态假设检验,残差分析,交互作用图。 dataframe<-data.frame( densityc(570,565,…...

在 Android 上备份短信:保护您的对话
尽管我们的Android手机有足够的存储空间来存储无数的短信,但由于设备故障、意外删除或其他意外原因,您可能会丢失重要的对话。幸运的是,我们找到了 5 种有效的 Android SMS 备份解决方案,确保您的数字聊天和信息保持安全且可访问。…...

各种数据库,行式、列式、文档型、KV、时序、向量、图究竟怎么选?
慕然回首,发现这些年来涌现出了许多类型的数据库,今天抽空简单回顾一下,以便于后面用到时能快速选择。 1. 关系型数据库(行式) 关系型数据库(RDBMS),我们常说的数据库就是指的关系型数据库。 它的全称是关…...