`
DAOException
  • 浏览: 122250 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

自己写的一个简单的TCP通信框架

阅读更多

 一个自己倒腾的简单的通信框架(目前只是基于请求响应模式),集成底层的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次
 

 

分享到:
评论
39 楼 littleJava 2011-03-03  
DAOException 写道
on-the-way 写道
求源代码...

需要源码私信我~

希望楼主把源码公开,围观一个框架从无到有的慢慢成长还是很喜庆的
38 楼 littleJava 2011-03-03  
JavaYwsEye 写道
为啥要重复造轮子呢?有现成的不用???
有这个时间可以去做很多其它的事了!

每个框架的实现都有作者自己的想法,哪怕仅仅是为了练手。Spring很牛X,Guice就不应该存在?!
37 楼 wangdongjie03 2011-03-02  
呵呵,用的地方不一样,楼上不用纠结
36 楼 bitray 2011-03-01  
JavaYwsEye 写道
为啥要重复造轮子呢?有现成的不用???
有这个时间可以去做很多其它的事了!


你了解轮子的构造吗?让你做一个轮子,钢结构的你能做吗?

仅仅停留在用轮子,不会生产轮子的境界,也不是什么高人

楼主不是在发明创造,而是在生产制造。你能制造一个吗?我不能,所以我想学。你会可以不学,呵呵
35 楼 bitray 2011-03-01  
我想给你投支持,可是我点不了,不知道为什么。我只好在回复里支持你下。

很多人根本不了解实现,仅仅停留在应用层,有一个机会让我们了解,其实是非常感谢的
34 楼 zhaosong 2011-03-01  
开源框架中 mina还不是性能最好的。
其实只要理解了非堵塞机制,很好的把握工作线程和请求连接之间的平衡,针对业务来调整框架,性能都差不了。
主要还是看业务来写框架,不同的业务适用于不同的框架。
33 楼 DAOException 2011-02-28  
rocketball 写道
DAOException 写道
zhaosong 写道
单从性能角度,如果每秒处理请求达不到2万,只能说是太一般了。更别说整体的稳定性和健壮性。

仅仅做了一定量的压力测试,没有做最大压力的测试,晚上回去测试看看最多能抗多少~~~~~

你这种情况,线程池其实也没啥用处,你基本没有业务层。在decoder层是单线程的,多线程会增加调度的负荷。我在8核的电脑上对Mina做个一个简单的压力测试,有一点简单的业务逻辑(没有数据库操作),5w/s没有问题

嗯,我的压力测试业务层基本算是忽略了,这也体现不出线程池的优势了,反而增加了负担,谢谢你的提醒啊~~~
32 楼 DAOException 2011-02-28  
cx6445 写道
DAOException 写道
zhaosong 写道
单从性能角度,如果每秒处理请求达不到2万,只能说是太一般了。更别说整体的稳定性和健壮性。

仅仅做了一定量的压力测试,没有做最大压力的测试,晚上回去测试看看最多能抗多少~~~~~


压测要分两台不同的机器,一台clinet和一台server,要评估每次RPC数据量大小,观察server的CPU占用和jvm的GC情况。一般情况下1K数据的RPC,5万以上的TPS没啥问题的。

谢谢指点,受教了
31 楼 rocketball 2011-02-28  
DAOException 写道
zhaosong 写道
单从性能角度,如果每秒处理请求达不到2万,只能说是太一般了。更别说整体的稳定性和健壮性。

仅仅做了一定量的压力测试,没有做最大压力的测试,晚上回去测试看看最多能抗多少~~~~~

你这种情况,线程池其实也没啥用处,你基本没有业务层。在decoder层是单线程的,多线程会增加调度的负荷。我在8核的电脑上对Mina做个一个简单的压力测试,有一点简单的业务逻辑(没有数据库操作),5w/s没有问题
30 楼 cx6445 2011-02-28  
DAOException 写道
zhaosong 写道
单从性能角度,如果每秒处理请求达不到2万,只能说是太一般了。更别说整体的稳定性和健壮性。

仅仅做了一定量的压力测试,没有做最大压力的测试,晚上回去测试看看最多能抗多少~~~~~


压测要分两台不同的机器,一台clinet和一台server,要评估每次RPC数据量大小,观察server的CPU占用和jvm的GC情况。一般情况下1K数据的RPC,5万以上的TPS没啥问题的。
29 楼 DAOException 2011-02-28  
zhaosong 写道
单从性能角度,如果每秒处理请求达不到2万,只能说是太一般了。更别说整体的稳定性和健壮性。

仅仅做了一定量的压力测试,没有做最大压力的测试,晚上回去测试看看最多能抗多少~~~~~
28 楼 zhaosong 2011-02-28  
单从性能角度,如果每秒处理请求达不到2万,只能说是太一般了。更别说整体的稳定性和健壮性。
27 楼 sky_sz 2011-02-28  
留个脚印,以后学习
26 楼 DAOException 2011-02-28  
ahuango 写道
楼主很有学习精神,但是有一件事不是很清楚。我一直认为NIO会节省资源,它会提高效率吗?

NIO使用非阻塞的方式可以提高线程的利用率,原有的方式需要一条线程监管一条连接,相对来说比较消耗资源。不过这也要看具体的需求去做了,NIO使用方面稍微繁琐点~~。
25 楼 ahuango 2011-02-28  
楼主很有学习精神,但是有一件事不是很清楚。我一直认为NIO会节省资源,它会提高效率吗?
24 楼 hc_face 2011-02-28  
楼主,很厉害啊,平时多造轮子,真正用的时候才能够有创造性!学习!
23 楼 corelengine 2011-02-28  
对这个不懂,请问这个框架用在哪方面?
22 楼 小哥1900 2011-02-28  
JavaYwsEye 写道
为啥要重复造轮子呢?有现成的不用???
有这个时间可以去做很多其它的事了!

你这种人标准的Loser吧
21 楼 wubg 2011-02-28  
能超出Mina框架,如果根本达不到其水平,或者只是借鉴,就没必要写什么“自忆写的”
20 楼 DAOException 2011-02-28  
分离的北极熊 写道
看代码,和我现在用mina进行封装的很类似···

我封装了底层的socket和nio,有空可以而多交流交流啊

相关推荐

    C# socket tcp通信的一个框架

    很好的一个关于C# socket通信的一个框架,这个是我朋友写的,我想肯定能够给你带来惊喜!

    JAVA TCP和UDP Socket通信框架

    Java中的TCP和UDP Socket通信是网络编程的基础,用于在不同设备之间建立可靠的数据传输通道。TCP(Transmission Control Protocol)...对于初学者,通过研究这个框架,也能深入理解TCP和UDP Socket通信的原理和实践。

    一个java tcp服务器的基础框架

    本框架提供了一个简单的起点,帮助开发者快速搭建自己的TCP服务。以下是对该框架的详细解析: 一、TCP基础 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它通过三次握手建立连接,确保数据的无丢失、...

    .net 稳定 高效 易用 可同步 TCP 通信框架

    .net 稳定 高效 易用 可同步 TCP 通信框架 使用平台: WinXP,WIN7,WIN8,WINCE,WINPHONE。 使用.net 2.0 框架。 主要功能介绍: 1、可以代替 Oracle,Mysql客户端 在不安装Oracle,MySql客户端的情况下访问, ...

    TCP通信框架

    TCP通信框架是网络通信中的重要组成部分,特别是在云通信、音频和视频传输等领域有着广泛的应用。本文将详细解析TCP通信框架的各个层面,包括其概述、整体结构、通信方式以及通信安全。 1. 概述 TCP(Transmission ...

    TCP通讯框架资源包,mina 通讯框架

    Mina,全称为“Apache MINA (Multipurpose Infrastructure for Network Applications)”,是由Apache软件基金会开发的开源项目,它为Java开发者提供了一个高级的网络通信框架。Mina不仅支持TCP/IP协议,还支持UDP/IP...

    MFC-TCP.rar_TCP通信_TCP通信MFC_mfc tcp 多线程_mfc tcp通信_mfc 多线程

    本资源“MFC-TCP.rar”聚焦于如何在Microsoft Foundation Classes (MFC)框架下实现TCP通信,这对于理解和实践Windows环境下C++编程的网络通信具有很高的价值。 MFC是微软提供的一个C++类库,它封装了Windows API,...

    基于C++信号槽框架xsignalslot的TCP通信框架设计源码

    本项目是基于C++信号槽框架xsignalslot的TCP...该项目适用于基于C++信号槽框架xsignalslot设计的TCP通信框架的开发和设计,为用户提供了一个丰富的资源库,包含多种文件类型,方便进行TCP通信相关的开发和设计工作。

    用socket写的一个简单的TCP通信程序

    本示例中,我们有一个使用C++编写的简单TCP通信程序,包含两个文件:sever.cpp(服务器端)和client.cpp(客户端)。这个程序提供了一个基本的框架,便于初学者理解TCP通信的工作原理。 1. **TCP协议**: - TCP...

    TCP异步通信试验

    首先,TCP通信是一种面向连接的通信方式,它在数据传输前先建立连接,然后在连接上进行双向通信。这确保了数据的有序性和无丢失性,适用于需要高可靠性的应用,如文件传输、网页浏览等。 其次,套接字(SOCKET)是...

    TCP简单信息通信案例Unity个人

    以上就是Unity个人TCP简单信息通信案例所涵盖的关键技术点,通过理解和实践这些知识点,你可以构建起一个基本的TCP通信框架,进一步实现复杂的游戏网络功能。这个案例是一个很好的起点,可以帮助开发者掌握TCP通信的...

    基于CocoaAsyncSocket的tcp通信框架

    基于CocoaAsyncSocket的tcp通信框架 文件内容和下面博文一致,可以先看文章,确认有用后再下载。 当然最好是自己实践一遍了。 http://blog.csdn.net/zhu410289616/article/details/46731605 ...

    c# tcp异步通讯框架

    自己写的TCP异步通讯框架,对原来的进行封装,使得收发消息方便。

    C#winform TCP通信 UDP通信 Socket通信 vs2017 .net4.0

    TCP通信的一个关键特性是它提供了数据的顺序传递和错误检查,确保数据无损、有序地到达目的地。 UDP(User Datagram Protocol)则是一种无连接的、不可靠的传输协议,它不保证数据的顺序或完整性,但相比TCP,其...

    Java tcp服务器框架

    2. `packages` 可能是一个文件夹,包含了框架的不同模块或组件,每个子目录代表一个特定的功能或服务。 3. `architecture.pdf` 应该是一份文档,详细解释了框架的设计架构,包括服务器和客户端的组件结构、通信流程...

    qt 中 多线程tcp通信

    在Qt框架下实现多线程TCP通信是一种常见且高效的方法,尤其在处理实时性要求高、数据量大的网络应用中。以下将详细讲解Qt中如何进行多线程TCP通信,以及涉及的关键知识点。 首先,标题"qt 中 多线程tcp通信"表明...

    SocketTcp_TcpSocket服务端框架_

    SocketTcp_TcpSocket服务端框架是一个专为开发者设计的简单且通用性强的TCP服务器实现。这个框架旨在简化网络编程过程,让开发者能够快速构建自己的TCP服务应用,只需要对原有代码进行少量修改,即可轻松地将其集成...

    tcp服务器框架 以及一个简单命令行聊天的测试例子

    而"libs"目录则包含了项目所依赖的外部库文件,这些库可能包含了实现TCP通信、加密算法、日志管理等功能的类库。 总的来说,这个TCP服务器框架是一个集成了多线程处理、加密通信和日志管理的完整系统,旨在提供安全...

    Go-Go语言的TCP网络通信框架

    Go语言,也被称为Golang,是由Google开发的一种静态类型的、编译式的、并发型的、垃圾回收的、C风格的编程语言。...结合`DxTcpServer-master`中的实例,你将能深入理解Go语言在TCP网络通信框架中的实践应用。

    一个简单的TCP通信类

    总的来说,这个项目提供了一个基础的TCP通信框架,对于初学者来说,可以通过它学习TCP通信的基本流程、数据交换方式以及简单的命令控制机制。进一步深入,可以在此基础上添加加密、身份验证等高级特性,或者优化...

Global site tag (gtag.js) - Google Analytics