一个自己倒腾的简单的通信框架(目前只是基于请求响应模式),集成底层的API,目的在于提高通信层的开发效率。该通信框架包括如下几个功能:
1.服务端采用NIO模式,提高通信速率
2.内部提供可选连接池方式,尽可能的将连接重用,提高开发效率。
3.提供过滤器自定义
4.业务处理层自定义
5.提供负载均衡
6.连接选择器与消息选择器分离
7.客户端采用连接池模式,具有自动识别服务端是否存活的功能。
因为环境受限,自己在自己的机子上测试了一下,16分钟,8个客户端,一共640万次简单请求,错误率基本为0
机子的配置是:CPU:2.93G双核,内存:2G内存,操作系统:ununtu10.10
写的还不是很好,如果大家对java写通信方面的东西比较感兴趣的可以私信交流^_^
下个写一个小Demo,首先我们定义个服务端的业务对象ServerHandler实现框架的FPHandler接口,,主要是从客户端接收消息以后,将当前时间和客户端发送过来的消息一并发给客户端,代码如下:
package com.foolfish.Zfocomint.test;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.foolfish.comint.handler.FPHandler;
import com.foolfish.comint.session.FPSession;
/**
* 服务端业务处理对象,实现自自FPHandler接口
* messRecv,接收消息时候触发的方法
* messSend,发送消息时候出发的方法
* sessionClosed,链接关闭触发的方法
* sessionCreated,链接创建出发的方法
* @author foolfish
*
*/
public class ServerHandler implements FPHandler{
@Override
public void messRecv(FPSession session, byte[] mess) {
try {
// 处理接收客户端的消息
String m = new String(mess,"utf-8");
/*************************************
* 此处可以做具体的业务处理,demo当中就省略了,
* 只是简单的将客户端的信息返回
*************************************/
// 向客户端回写信息
String date = new SimpleDateFormat("yyyyMMdd HH:mm:ss").format(new Date());
session.write(("服务端返回消息"+ date +m).getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void messSend(FPSession session, byte[] mess) {
// TODO Auto-generated method stub
}
@Override
public void sessionClosed(FPSession session) {
// TODO Auto-generated method stub
}
@Override
public void sessionCreated(FPSession session) {
// TODO Auto-generated method stub
}
}
定义服务端的启动方法,ServerStart
public class ServerStart {
public static void main(String[] args) throws Exception{
// 启动服务端,采用NIO模式
FPAcceptor acceptor = new FPNIOAcceptor();
// 绑定业务处理类
acceptor.setHandlerClass(ServerHandler.class);
// 设置连接池大小
acceptor.setPoolSize(10);
// 设置是否采用连接池(默认使用单链接方式)
acceptor.setIsPool(true);
// 设置负载均衡器(该功能未做性能测试,功能已经完成)
//acceptor.setLbServer(new InetSocketAddress("127.0.0.1", 4320));
// 设置服务端口
acceptor.setPort(4331);
// 启动服务
acceptor.startServer();
}
}
下面定义个客户端:客户端使用一个while循环,不断向服务端发送消息(模拟不断的请求)
/**
* @param args
* @throws IOException
* @throws FPComException
*/
public static void main(String[] args){
String line = "Hello";
int i = 0;
int j = 0;
while(true){
try {
// 设置服务端的地址和端口号
FPIOConnector conn = new FPIOConnector(true, new FPInetAddress("127.0.0.1", 4331));
// 设定自动重发次数(对于延迟等错误情况可以选择自动重发)
conn.setRetryCount(2);
// 发送并接收返回的结果信息,并统计错误率
System.out.println(new String(conn.request(line.getBytes("utf-8")),"utf-8")+"共请求"+(i++)+"次,错误"+(j)+"次");
}catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FPComException e) {
j++;
continue;
}
}
}
运行服务端启动方法,ServerStart.java,然后运行客户端Client.java,就可以看到运行结果如下
服务端返回消息20110226 20:53:33Hello共请求5445次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5446次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5447次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5448次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5449次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5450次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5451次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5452次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5453次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5454次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5455次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5456次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5457次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5458次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5459次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5460次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5461次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5462次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5463次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5464次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5465次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5466次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5467次,错误0次
服务端返回消息20110226 20:53:33Hello共请求5468次,错误0次
分享到:
相关推荐
.NET Standard 2.1、.NET 6、.NET 7、.NET8 版本SQLBuilder,Expression表达式转换为SQL语句,支持SqlServer、MySql、Oracle、Sqlite、PostgreSql;基于Dapper实现了不同数据库对应的数据仓储Repository;
各国数字服务贸易进出口额(2010-2022年)
2024版银行及保险高净值客户健康绿皮书
【博客】MVC、MVP、MVVM设计模式的案例_pgc
Python数据抓取淘宝电商商品图片
基于python开发爬虫脚本,并使用django,echarts对数据进行分析_pgc
Tesseract繁体中文OCR数据文件,垂直布局
## 介绍 碳排放数据是衡量地方经济发展与环境可持续性的重要指标。碳排放数据通常包括二氧化碳排放量,来源包括能源消耗以及工业、交通、建筑等领域的排放。由于中国地理辽阔、经济发展不平衡,各地的碳排放水平差异较大。本次分享的数据是根据EDGAR资源提取的中国地级市二氧化碳排放数据,数据年份为2000-2023年 ## 一、数据介绍 数据名称:中国地级市二氧化碳排放数据 数据年份:2000-2023年 数据范围:300个地级以上城市 数据来源:EDGAR_2024_GHG of October 2024 数据说明:根据EDGAR提取的城市碳排放数据 ## 二、数据指标 年份、省份、城市、城市代码、所属地域、二氧化碳排放总量
基于多算法融合的齿轮箱故障诊断模型优化:GADF-CNN-BKA-LSSVM算法的原理与应用,基于GADF-CNN-BKA-LSSVM的齿轮箱故障诊断 首先,利用格拉姆角场差(GADF)时频分辨率高、可以深度反映时间序列内在结构和关系的特点,对采集到的一维故障数据信号转为二维图像,得到图像后并将图像进行降维处理;然后,将第一步得到的格拉姆角场差图像输入二维卷积神经网络(CNN)进行自适应故障特征提取;最后,取CNN的全连接层结果作为LSSVM分类器的输入,并采用黑翅鸢优化算法BKA对LSSVM分类器的超参数进行优化,以提高模型泛化能力,避免模型陷入局部最优 附赠常春藤优化算法IVY和鹈鹕优化算法POA ,基于GADF-CNN-BKA-LSSVM; 故障诊断; 图像降维; 特征提取; 模型泛化; 常春藤优化算法IVY; 鹈鹕优化算法POA,基于多算法优化的齿轮箱故障诊断:GADF-CNN-BKA-LSSVM模型
省级-创新资源错配指数(2000-2022年)
TencentMeeting_0300000000_3.30.30.420_x86_64.publish.officialwebsite.exe
基于FPGA的Endat绝对值编码器PG卡源代码优化与实现:海德汉1313编码器应用案例,基于fpga的海德汉1313 Endat绝对值编码器pg卡源代码 ,基于FPGA的海德汉1313; Endat; 绝对值编码器; PG卡; 源代码,基于FPGA的Endat绝对值编码器PG卡源代码
【Vue+PHP】基于thinkphp6、vue(iview-admin)前后端分离快速开发框架
## 1.基本信息 数据名称:ALOS 12.5m DEM 数据 空间位置:中国 数据格式:栅格 数据大小:61.5GB 空间分辨率:12.5m ## 2.内容概述 ALOS 12.5m DEM 数据,是ALOS(Advanced Land Observing Satellite. 2006年发射)卫星相控阵型L波段合成孔径雷达(PALSAR)采集的高程数据。PALSAR传感器具有高分辨率、扫描式合成孔径雷达、极化三种观测模式。ALOS Dem高程数据水平及垂直精度可达12.5米。 ALOS是日本宇宙航空研究所(JAXA)的Advanced Land Observing Satellite-1(高级陆地观测卫星-1,ALOS)项目。ALOS卫星载有三个传感器:全色遥感立体测绘仪(PRISM),主要用于数字高程测绘;先进可见光与近红外辐射计-2(AVNIR-2),用于精确陆地观测;相控阵型L波段合成孔径雷达(PALSAR),用于全天时全天候陆地观测。
基于六自由度机械臂模型的MPC预测控制方法研究,六自由度机械臂模型预测控制mpc ,六自由度机械臂;模型预测控制;MPC,六自由度机械臂的MPC预测控制模型
## 介绍 碳排放数据是衡量地方经济发展与环境可持续性的重要指标。碳排放数据通常包括二氧化碳排放量,来源包括能源消耗以及工业、交通、建筑等领域的排放。由于中国地理辽阔、经济发展不平衡,各地的碳排放水平差异较大。 本次分享的数据是根据EDGAR资源提取的中国各省、地级市、区县二氧化碳排放数据,数据年份为1980-2023年。 ## 一、数据介绍 数据名称:中国省、市、县二氧化碳排放数据 数据年份:1980-2023年 数据范围:各省、地级市、区县 数据来源:EDGAR_2024_GHG of October 2024 数据说明:根据EDGAR提取的城市碳排放数据 ## 二、数据指标 年份、省份、城市、城市代码、区县、二氧化碳排放总量 ## 三、数据展示
基于混合整数规划与次梯度法的分散PEV充电控制策略:比较与验证分析,基于混合整数规划问题次梯度法的分散PEV控制 本文提出了一种解决智能电网中充电式电动汽车(pev)车队充电问题的分散方法,其中通过MPC策略将全局和局部约束和目标与电网模型一起考虑。 充电问题的表示涉及连续变量和整数变量的组合(特别是布尔性质的)。 它被公式化为混合整数线性规划(MILP)问题,使用次梯度方法求解。 将所提出的方法与集中式方法进行比较,集中式方法通常通过分支定界算法来解决。 结果表明,分散式方法能够实现接近集中式方法的性能,同时减少计算负担,特别是对于大型车队。 这些发现通过在测试案例上执行的模拟来支持。 ,混合整数规划问题;次梯度法;分散PEV控制;MPC策略;全局和局部约束;MILP问题;计算负担;测试案例模拟,基于混合整数规划的次梯度法:分散PEV充电控制策略研究
.archivetemp活动七:小古文.doc
适用操作系统:windows。 适用CPU架构:x64。
数值分析与公式定理