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

FP通信框架入门使用

    博客分类:
  • java
阅读更多

        一个自己倒腾的简单的通信框架(目前只是基于请求响应模式),集成底层的API,目的在于提高通信层的开发效率。该通信框架包括如下几个功能:

        1.服务端采用NIO模式,提高通信速率

        2.内部提供可选连接池方式,尽可能的将连接重用,提高开发效率。

        3.提供过滤器自定义

        4.业务处理层自定义

        5.提供负载均衡

        6.连接选择器与消息选择器分离

        7.客户端采用连接池模式,具有自动识别服务端是否存活的功能。

 

       下面给出一个小的Demo,采用MINA官方的时间服务器示例来做,其主要功能是客户端向服务端发送一个简单的请求,服务端打印客户端的请求,并返回给客户端当前的请求时间。

        先写服务端,业务对象的定义需要实现通信框架的FPHandler接口。FPHandler接口当中定义了如下几个方法

        messRecv(FPSession session, byte[] mess)   当信道当中接收消息时触发该方法

        messSend(FPSession session, byte[] mess)  当信道当中有消息发送时触发该方法

        sessionClosed(FPSession session)  当信道关闭时触发

        sessionCreated(FPSession session) 当新连接产生时出发该方法

 

 

        自定义服务端TestHandler:

 

public class TestHandler implements FPHandler{

	@Override
	public void messRecv(FPSession session, byte[] mess) {
		try {
			if(mess != null){
				String Message = new String(mess,"UTF-8");
				// 打印客户端信息
				System.out.println("Client:" + Message);
				// 构造发送给客户端的时间信息
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				// 向客户端发送信息
				session.write(("Server4328:"+sdf.format(new Date())).getBytes("UTF-8"));
			}else{
				session.write("b".getBytes("UTF-8"));
			}
		} catch (IOException e) {
			e.printStackTrace();
			return;
		}
	}

	@Override
	public void messSend(FPSession session, byte[] mess) {
		
	}

	@Override
	public void sessionClosed(FPSession session) {
		
	}

	@Override
	public void sessionCreated(FPSession session) {
		session.setPool(true);
	}

}

 

 编写启动服务端的类,用于启动服务端

 

public static void main(String[] args) {
		try {
			// 使用NIO的方式开始连接
			FPAcceptor accept = new FPNIOAcceptor();
			// 设置业务处理对象
			accept.setHandlerClass(TestHandler.class);
			// 设置过滤器(可增加多条过滤器)
//			accept.getFilterList().add(TestFilter.class);
			// 设置负载均衡服务器地址
//			accept.setLbServer(new InetSocketAddress("192.168.7.26", 4323));
			// 设置服务器端监听端口
			accept.setPort(4327);
			// 开启服务,这里是阻塞方式。
			accept.startServer();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

 

        好了,这里服务端编写完毕,下面写客户端,客户端负责向服务端发送信息,并接收服务端返回的消息,客户端调用方式很简单;示例代码如下

 

FPIOConnector con = new FPIOConnector(true,new FPInetAddress("192.168.7.26",4327));
 // true:表示使用连接池模式,第二个参数用于定义服务端地址与端口
byte[] rebytes = con.request(line.trim().getBytes("UTF-8"));
System.out.println(new String(rebytes,"UTF-8")+"耗时:"+(end-start)+"毫秒");

 

 

      下面来写一个完整的客户端实现TestC.java,用户从键盘获取输入,并向服务端发送请求,并接收服务端的请求。

 

public class Test_C {
	/**
	 * @date created on Aug 6, 2010 
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException{
		
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = "";
		while((line = br.readLine()) != null){
			long start = System.currentTimeMillis();
			// true:设置连接池模式
			// FPInetAddress 服务器地址,端口号
			FPIOConnector con = new FPIOConnector(true,new FPInetAddress("192.168.7.26",4327));
			try {
				// 向服务端请求
				byte[] rebytes = con.request(line.trim().getBytes("UTF-8"));
				long end = System.currentTimeMillis();
				System.out.println(new String(rebytes,"UTF-8")+"耗时:"+(end-start)+"毫秒");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			} catch (FPComException e) {
				e.printStackTrace();
			}
		}
	}
}

 

     下面来看下运行结果吧:首先启动服务器,接着启动客户端,在客户端任意输入字符串,将返回服务端的当前时间:如下所示

 

>hello fpclient
Server4328:2010-10-09 14:24:32耗时:3毫秒
>hahahahha
Server4328:2010-10-09 14:24:44耗时:3毫秒
>你好
Server4328:2010-10-09 14:24:48耗时:1毫秒
 

 

Client:hello fpclient
Client:hahahahha
Client:你好

 


 

 

分享到:
评论
2 楼 febirdfly 2010-10-15  
相当不错,调用起来只需短短几行,很方便!
1 楼 huangfoxAgain 2010-10-12  

期待系列~

相关推荐

    Angular_FP:我的第一个Angular项目

    Angular_FP项目是一个初学者在Angular框架下创建的第一个项目,展示了如何使用Angular开发Web应用程序的基本步骤。Angular是一款由Google维护的开源JavaScript框架,用于构建单页应用程序(SPA)。它的核心特性包括...

    j2me 手机程序入门,让你快速掌握j2me手机程序开发

    常见的配置有CLDC(Connected Limited Device Configuration)和CDC(Connected Device Configuration),对应的框架有MIDP(Mobile Information Device Profile)和FP(Feature Profile)。 2. **开发环境搭建** ...

    JAVA技术体系

    Java 是一种广泛使用的计算机编程语言,具有简单性、面向对象、健壮性、安全性、平台独立性等特点。Java 的核心技术包括 Java Standard Edition (Java SE),Java Enterprise Edition (Java EE),以及 Java Micro ...

    干货 十分钟带你从入门到进阶python爬虫.docx

    - **Scrapy Engine(引擎)**:负责协调Spider、Item Pipeline、Downloader和Scheduler之间的通信。 - **Scheduler(调度器)**:接收引擎发来的请求,并按顺序排队等待处理。 - **Downloader(下载器)**:负责...

    apache-cxf-3.1.6

    官方文档涵盖了从入门教程到高级特性的全面内容,是学习和使用CXF的重要参考。 综上所述,Apache CXF 3.1.6是一个强大的Web服务框架,它提供了全面的功能,让开发者能够高效地构建和维护Web服务。通过cxf-wsdl.bat...

    Packt.Learning.Node.js.for.NET.Developers.2016

    - 使用测试框架(如 Mocha)编写测试。 - 确保代码质量和稳定性。 **为测试结构代码库:** - 设计可测试的应用架构。 - 将业务逻辑与外部依赖解耦。 **使用 Mocha 编写行为驱动测试 (BDD):** - Mocha 是一个灵活...

    郭克华J2ME教学PPT

    常见的配置有CLDC(Connected Limited Device Configuration)和CDC(Connected Device Configuration),对应的框架有MIDP(Mobile Information Device Profile)和FP(Foundation Profile)等。 **MIDP与CLDC** ...

    Ruby语言教程&案例&相关项目资源分享.docx

    它融合了面向对象编程(OOP)、函数式编程(FP)以及元编程等多种特性,具有极高的灵活性与可读性。Ruby的设计哲学之一是“程序员幸福第一”,旨在让开发者编写出既高效又易于理解的代码。 #### Ruby基础语法教程 -...

    J2ME中文教程,适合初学者学习的资料

    本教程针对初学者,将深入讲解J2ME的基础知识,帮助你快速入门。 一、J2ME概述 J2ME由Java ME配置(Configurations)和Java ME框架(Profiles)组成。配置定义了设备的最低硬件需求,如CLDC(Connected Limited ...

    Learn-NestJS

    NestJS 是一个基于 Node.js 的框架,它将传统的面向对象编程(OOP)原则与现代的函数式编程(FP)特性相结合,为构建高效、可扩展的服务器端应用提供了强大的工具。NestJS 采用 TypeScript 作为主要编程语言,这使得...

Global site tag (gtag.js) - Google Analytics