当前位置: 首页 > news >正文

JAVA异步的TCP 通讯-客户端

一、客户端代码示例

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class AdvancedAsyncTCPClient {private static final String SERVER_HOST = "localhost";private static final int SERVER_PORT = 8888;private static final int BUFFER_SIZE = 1024;private final AsynchronousSocketChannel clientChannel;private final ExecutorService threadPool;public AdvancedAsyncTCPClient() throws IOException {// 创建异步套接字通道clientChannel = AsynchronousSocketChannel.open();// 创建一个固定大小的线程池,用于处理业务逻辑threadPool = Executors.newFixedThreadPool(5);}public void connect() {// 异步连接到服务器clientChannel.connect(new InetSocketAddress(SERVER_HOST, SERVER_PORT), null, new CompletionHandler<Void, Void>() {@Overridepublic void completed(Void result, Void attachment) {System.out.println("Connected to server: " + SERVER_HOST + ":" + SERVER_PORT);// 连接成功后开始读取服务器数据startReading();// 发送初始消息sendMessage("Hello, server!");}@Overridepublic void failed(Throwable exc, Void attachment) {System.err.println("Failed to connect to server: " + exc.getMessage());closeChannel();}});}private void startReading() {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 server: " + message);// 继续读取服务器数据buffer.clear();clientChannel.read(buffer, buffer, this);} else if (bytesRead == -1) {// 服务器关闭连接System.out.println("Server closed the connection");closeChannel();}}@Overridepublic void failed(Throwable exc, ByteBuffer buffer) {System.err.println("Failed to read data from server: " + exc.getMessage());closeChannel();}});}public void sendMessage(String message) {ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());// 异步发送消息到服务器clientChannel.write(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {@Overridepublic void completed(Integer bytesWritten, ByteBuffer buffer) {if (buffer.hasRemaining()) {// 如果还有数据未发送完,继续发送clientChannel.write(buffer, buffer, this);} else {System.out.println("Message sent to server: " + message);}}@Overridepublic void failed(Throwable exc, ByteBuffer buffer) {System.err.println("Failed to send message to server: " + exc.getMessage());closeChannel();}});}private void closeChannel() {try {System.out.println("Closing client connection");clientChannel.close();threadPool.shutdown();} catch (IOException e) {System.err.println("Error closing client channel: " + e.getMessage());}}public static void main(String[] args) {try {AdvancedAsyncTCPClient client = new AdvancedAsyncTCPClient();client.connect();} catch (IOException e) {System.err.println("Error creating client: " + e.getMessage());}}
}

二、代码分析

AdvancedAsyncTCPClient 类

  1. 构造函数:创建 AsynchronousSocketChannel 并初始化一个固定大小的线程池

  2. connect() 方法:异步连接到服务器,连接成功后开始读取服务器数据并发送初始消息。

  3. startReading() 方法:异步读取服务器发送的数据,使用 CompletionHandler 处理读取结果。

  4. sendMessage() 方法:异步发送消息到服务器,处理可能的未发送完的数据。

  5. closeChannel() 方法:关闭客户端通道并关闭线程池,处理关闭过程中可能出现的异常。

CompletionHandler

  1. 在 connect()startReading() 和 sendMessage() 方法中使用 CompletionHandler 来处理异步操作的完成结果。
  2. completed() 方法处理操作成功的情况,failed() 方法处理操作失败的情况。

线程池

        1.使用 Executors.newFixedThreadPool(5) 创建一个固定大小的线程池,用于处理业务逻辑,避免阻塞 I/O 操作。

三、优点

  • 异步 I/O:利用 Java NIO 2 的异步 I/O 特性,提高了客户端的并发处理能力。
  • 线程池:使用线程池处理业务逻辑,减少了线程创建和销毁的开销。
  • 异常处理:对各种异常情况进行了处理,增强了代码的健壮性。
  • 资源管理:在关闭客户端时,正确关闭客户端通道和线程池,避免资源泄漏。

四、注意事项

  • 该示例假设服务器运行在 localhost 的 8888 端口,你可以根据实际情况修改 SERVER_HOST 和 SERVER_PORT
  • 此代码只是一个基础示例,实际应用中可能需要根据具体需求进行扩展,如处理更复杂的消息格式、实现重连机制等。

相关文章:

JAVA异步的TCP 通讯-客户端

一、客户端代码示例 import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.ExecutorService; impo…...

MySQL的存储引擎对比(InnoDB和MyISAM)

InnoDB 特点&#xff1a; 事务支持&#xff1a;InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;支持 ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;事务。行级锁定&#xff1a;支持行级锁&#xff0c;能够并发执行查询和更新操作&#xff0c;提升多用户环境…...

【2025-02-06】简单算法:相向双指针 盛最多水的容器 接雨水

&#x1f4dd;前言说明&#xff1a; ●本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;主要跟随B站博主灵茶山的视频进行学习&#xff0c;专栏中的每一篇文章对应B站博主灵茶山的一个视频 ●题目主要为B站视频内涉及的题目以及B站视频中提到的“课后作业”。…...

2.6-组合博弈入门

组合博弈入门 组合游戏 要求 有两个玩家&#xff1b;游戏的操作状态是一个有限的集合&#xff08;比如&#xff1a;限定大小的棋盘&#xff09;&#xff1b;游戏双方轮流操作&#xff1b;双方的每次操作必须符合游戏规定&#xff1b;当一方不能将游戏继续进行的时候&#xf…...

【教学】推送docker仓库

引言 Docker Hub 这个最常见的公共 Docker 仓库为例&#xff0c;本文将介绍如何把本地 Docker 镜像推送到公共 Docker 仓库 1. 注册 Docker Hub 账号 如果你还没有 Docker Hub 账号&#xff0c;需要先在 Docker Hub 官网 进行注册。注册完成后&#xff0c;记住你的用户名和密…...

【大数据技术】本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …...

3060显卡掉帧是为什么?3060掉帧卡顿解决方法

NVIDIA GeForce RTX 3060是一款性能强劲的显卡&#xff0c;它可以在高画质的情况下运行大多数的游戏&#xff0c;但是也有一些用户反映&#xff0c;3060玩游戏时会出现掉帧和卡顿的现象&#xff0c;这让很多玩家感到困扰。那么&#xff0c;3060显卡掉帧是什么原因呢&#xff1f…...

Kubernetes集群通过Filebeat收集日志

Filebeat收集容器日志&#xff0c;其中NODE_NAME配置&#xff0c;是将node信息添加到日志中&#xff0c;所以需要serviceAccount权限&#xff0c;如果不需要配置NODE信息&#xff0c;可以不创建serviceAccount&#xff0c;其他内容可根据实际情况修改 apiVersion: v1 kind: Ser…...

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具

SQLAlchemy-2.0中模型定义和alembic的数据库迁移工具 一、SQLAIchemy的介绍二、数据库引擎1、支持的数据库1.1、sqlite数据库1.2、MySQL数据库1.3、数据库引擎的参数 三、定义模型类1、定义模型2、engine负责数据库迁移 四、alembic数据库迁移⼯具1、安装alembic2、初始化alemb…...

[含文档+PPT+源码等]精品基于Python实现的django个性化健康餐计划订制系统

软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.js&#xff08;2.X&#xff09;、css3 开发工具&#xff1a;pycharm、Visual Studio Code、HbuildX 数据库&#xff1a;MySQL 5.7.26&am…...

Python3中异常处理:try/except语句

一. 简介 什么是异常处理 &#xff1f; 在 Python中&#xff0c;异常处理是一种用于管理程序运行时错误的机制。通过使用异常处理&#xff0c;你可以编写更加健壮和可靠的代码。 Python 提供了 try&#xff0c;except&#xff0c;else和 finally关键字来处理异常&#xff0c…...

[ Spring] Integrate Spring Boot Dubbo with Nacos 2025

文章目录 Dubbo Project StructureDeclare Plugins and RepositoriesIntroduce DependenciesDubbo Consumer PropertiesDubbo Provider ApplicationDubbo Provider ServiceDubbo Consumer PropertiesDubbo Consumer ApplicationDubbo Consumer ControllerCommand References Du…...

【3分钟极速部署】在本地快速部署deepseek

第一步&#xff0c;找到网站&#xff0c;下载&#xff1a; 首先找到Ollama &#xff0c; 根据自己的电脑下载对应的版本 。 我个人用的是Windows 我就先尝试用Windows版本了 &#xff0c;文件不是很大&#xff0c;下载也比较的快 第二部就是安装了 &#xff1a; 安装完成后提示…...

【QT笔记】使用QScrollArea实现多行文本样式显示

目录 一、QScrollArea 的基本概念 二、demo代码 三、实现效果 1、页面空间足够&#xff0c;无滚动条时显示效果 2、有滚动条时显示效果 一、QScrollArea 的基本概念 QScrollArea 是 Qt 框架中用于提供一个滚动条区域&#xff0c;允许用户滚动查看比当前可视区域更大的内容…...

大模型中提到的超参数是什么

在大模型中提到的超参数是指在模型训练之前需要手动设置的参数&#xff0c;这些参数决定了模型的训练过程和最终性能。超参数与模型内部通过训练获得的参数&#xff08;如权重和偏置&#xff09;不同&#xff0c;它们通常不会通过训练自动学习&#xff0c;而是需要开发者根据任…...

【Uniapp-Vue3】z-paging插件组件实现触底和下拉加载数据

一、下载z-paing插件 注意下载下载量最多的这个 进入Hbuilder以后点击“确定” 插件的官方文档地址&#xff1a; https://z-paging.zxlee.cn 二、z-paging插件的使用 在文档中向下滑动&#xff0c;会有使用方法。 使用z-paging标签将所有的内容包起来 配置标签中的属性 在s…...

UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理

UE虚幻引擎No Google Play Store Key&#xff1a;No OBB found报错如何处理&#xff1f; 问题描述&#xff1a; UE成功打包APK并安装过后&#xff0c;启动应用时提示&#xff1a; No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …...

OKHttp拦截器解析

OKHttp涉及到拦截器大概的执行步骤为&#xff1a; 1.通过newCall生成RealCall对象 具体代码如下&#xff1a; Override public Call newCall(Request request) {return new RealCall(this, request, false /* for web socket */);}2.调用Call的execute方法 当然这也可以是执…...

STM32标准库移植RT-Thread nano

STM32标准库移植RT-Thread Nano 哔哩哔哩教程链接&#xff1a;STM32F1标准库移植RT_Thread Nano 移植前的准备 stm32标准库的裸机代码&#xff08;最好带有点灯和串口&#xff09;RT-Thread Nano Pack自己的开发板 移植前的说明 本人是在读学生&#xff0c;正在学习阶段&a…...

c++11总结26——std::regex

std::regex 是 C11 引入的 正则表达式库&#xff0c;用于 字符串匹配、搜索和替换。 &#x1f539; 头文件&#xff1a;#include <regex> &#x1f539; 命名空间&#xff1a;std &#x1f539; 支持的匹配模式&#xff1a;ECMAScript&#xff08;默认&#xff09;、POS…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...