论坛首页 Java企业应用论坛

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

浏览 16550 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2011-02-26   最后修改:2011-02-26

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

 

   发表时间:2011-02-26  
就是mina或者Netty?
0 请登录后投票
   发表时间:2011-02-26  
yangyi 写道
就是mina或者Netty?

部分参照了mina~~~
0 请登录后投票
   发表时间:2011-02-26   最后修改:2011-02-26
yangyi 写道
就是mina或者Netty?

准确说业务对象的绑定,和两个选择器的分离参照了mina的思想,实现方式不同
0 请登录后投票
   发表时间:2011-02-27  
请问你考虑封包的问题了吗?就是tcp只保证数据传输的顺序,但不保证数据接收与发送是同一个包。
0 请登录后投票
   发表时间:2011-02-27  
求源代码...
0 请登录后投票
   发表时间:2011-02-27  
MINA的模式么
0 请登录后投票
   发表时间:2011-02-27  
为啥要重复造轮子呢?有现成的不用???
有这个时间可以去做很多其它的事了!
0 请登录后投票
   发表时间:2011-02-27  
工程师平时时间多重复造轮子,用到的时候才能拿出合适的轮子。
0 请登录后投票
   发表时间:2011-02-27  
bastengao 写道
请问你考虑封包的问题了吗?就是tcp只保证数据传输的顺序,但不保证数据接收与发送是同一个包。

本次发布的jar包里面还没做,这个版本只可以实现同步的请求与响应,前面也考虑到了你说的这个问题,封包的还在写~
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics