java mina框架实例_MINA框架简介和一个简单的例子

基于MINA框架快速开发网络应用程序1.MINA框架简介MINA(MultipurposeInfrastructureforNetworkApplications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache…

大家好,又见面了,我是你们的朋友全栈君。

基于MINA框架快速开发网络应用程序

1.MINA框架简介

MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。MINA框架的应用比较广泛,应用的开源项目有Apache Directory、AsyncWeb、Apache Qpid、QuickFIX/J、Openfire、SubEthaSTMP、red5等。MINA框架当前稳定版本是1.1.6,最新的2.0版本目前已经发布了M1版本。

MINA框架的特点有:基于java NIO类库开发;采用非阻塞方式的异步传输;事件驱动;支持批量数据传输;支持TCP、UDP协议;控制反转的设计模式(支持Spring);采用优雅的松耦合架构;可灵活的加载过滤器机制;单元测试更容易实现;可自定义线程的数量,以提高运行于多处理器上的性能;采用回调的方式完成调用,线程的使用更容易。

2.MINA框架的常用类

类NioSocketAcceptor用于创建服务端监听;

类NioSocketConnector用于创建客户端连接;

类IoSession用来保存会话属性和发送消息;

类IoHandlerAdapter用于定义业务逻辑,常用的方法有:

方法 定义

sessionCreated() 当会话创建时被触发

sessionOpened() 当会话开始时被触发

sessionClosed() 当会话关闭时被触发

sessionIdle() 当会话空闲时被触发

exceptionCaught() 当接口中其他方法抛出异常未被捕获时触发此方法

messageRecieved() 当接收到消息后被触发

messageSent() 当发送消息后被触发

3.服务端应用开发示例

下面将以MINA2.0M1版本为基础,通过一个范例来演示一下如何使用MINA框架进行开发。开发环境为jdk6.0,开发工具NetBeans6.0,所需jar包slf4j-api.jar、slf4j-jdk14.jar、MINA-core-2.0.0-M1.jar。

首先定义一个业务逻辑处理器TimeServerHandler,继承自IoHandlerAdapter,实现的功能有:当客户端创建会话时会显示客户端设备的IP和端口;当客户端输入quit时结束会话;客户端输入其它内容时则向客户端发送当前时间。代码如下:

public class TimeServerHandler extends IoHandlerAdapter {

@Override

public void sessionCreated(IoSession session) {

// 显示客户端的ip和端口

System.out.println(session.getRemoteAddress().toString());

}

@Override

public void messageReceived(IoSession session, Object message)

throws Exception {

String str = message.toString();

System.out.println(“message=”+str);

if (str.trim().equalsIgnoreCase(“quit”)) {

session.close();// 结束会话

return;

}

Date date = new Date();

session.write(date.toString());// 返回当前时间的字符串

System.out.println(“Message written…”);

}

}

再定义一个类MinaTimeServer用来启动服务端:

public class MinaTimeServer {

private static final int PORT = 9123;// 定义监听端口

public static void main(String[] args) throws IOException {

IoAcceptor acceptor = new NioSocketAcceptor();

acceptor.getFilterChain().addLast(“logger”, new LoggingFilter());

acceptor.getFilterChain().addLast(“codec”,new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName(“UTF-8”))));// 指定编码过滤器

acceptor.setHandler(new TimeServerHandler());// 指定业务逻辑处理器

acceptor.setDefaultLocalAddress(new InetSocketAddress(PORT));// 设置端口号

acceptor.bind();// 启动监听

}

}

4.测试

首先运行MinaTimeServer,启动服务端,接着在命令行运行“telnet 127.0.0.1 9123”,来登录,这时会看到服务端输出如下:

2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log

/10.64.2.137:4140 IP和端口号

信息: CREATED

2008-2-21 16:15:29 org.apache.MINA.filter.logging.LogLevel$4 log

信息: OPENED 在客户端输入回车,在客户端可以看到服务端返回当前的时间:

Thu Feb 21 16:20:14 CST 2008

服务端输出:

2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log

信息: RECEIVED: HeapBuffer[pos=0 lim=2 cap=2048: 0D 0A] 接收收到回车符

Message written…

2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log

信息: SENT: HeapBuffer[pos=0 lim=29 cap=30: 54 68 75 20 46 65 62 20 32 31 20 31 36 3A 32 30…]

2008-2-21 16:20:14 org.apache.MINA.filter.logging.LogLevel$4 log

信息: SENT: HeapBuffer[pos=0 lim=0 cap=0: empty] 5.客户端开发示例

首先定义类TimeClientHandler来处理消息接收事件:

class TimeClientHandler extends IoHandlerAdapter {

public TimeClientHandler() {

}

@Override

public void messageReceived(IoSession session, Object message)

throws Exception {

System.out.println(“message=” + message);// 显示接收到的消息

}

}

接着定义MinaTimeClient类用于连接服务端,并向服务端发送消息:

public class MinaTimeClient {

public static void main(String[] args) {

// 创建客户端连接器.

NioSocketConnector connector = new NioSocketConnector();

connector.getFilterChain().addLast(“logger”, new LoggingFilter());

connector.getFilterChain().addLast(“codec”,new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName(“UTF-8”)))); // 设置编码过滤器

connector.setConnectTimeout(30);

connector.setHandler(new TimeClientHandler());// 设置事件处理器

ConnectFuture cf = connector.connect(new InetSocketAddress(“127.0.0.1”,9123));// 建立连接

cf.awaitUninterruptibly();// 等待连接创建完成

cf.getSession().write(“hello”);// 发送消息

cf.getSession().write(“quit”);// 发送消息

cf.getSession().getCloseFuture().awaitUninterruptibly();// 等待连接断开

connector.dispose();

}

}

6.总结

通过上述示例可以了解到:使用MINA框架来开发的网络应用程序代码结构更清晰;MINA框架完成了底层的线程管理;MINA内置的编码器可以满足大多数用户的需求,省去了开发人员消息编码解码的工作。具称使用MINA开发服务器程序的性能已经逼近使用 C/C++ 语言开发的网络服务。因此,建议在网络应用程序开发过程中尝试使用MINA框架来提高我们的开发效率和应用程序的执行效率。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127309.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 数据结构课程设计–实验室设备管理系统(c语言)[通俗易懂]

    数据结构课程设计–实验室设备管理系统(c语言)[通俗易懂]#include<stdio.h>//标准输入输出函数库#include<stdlib.h>//标准函数库#include<string.h>//字符串函数库#include<conio.h>//屏幕操作函数库#defineHEADER1″——————————-实验室…

    2022年10月10日
  • 使用Java中间MessageDigest该文本MD5加密(Java中间MD5样品加密算法演示)

    使用Java中间MessageDigest该文本MD5加密(Java中间MD5样品加密算法演示)

  • ORM常用操作

    一般操作专业官网文档必会13条查询<1>all():查询所有结果<2>filter(**kwargs):它包含了与所给筛选条件相匹配的对象<3>

  • 特立独行的理解_喜欢特立独行的人

    特立独行的理解_喜欢特立独行的人原题链接对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数

  • 全方位剖析QT 面试题 胡峰原创

    全方位剖析QT 面试题 胡峰原创自己毕业后参加过很多面试,当然有以应聘者的身份参加的也有以面试官的身份参加的,下面我想总结下一些面试官出题的方向和回答的技巧,下面截取我对一个应届毕业生的面试过程作为讲解,希望能对再今后的面试任职时有所帮助。姓名AAA性别男民族汉族籍贯河北省AA出生日期AAA婚姻状况否学历学士政治面貌AA专业计算机科学与技术健康情况健康毕业院校AAA邮编A联系电话AAA邮箱AA个人技能我学习了嵌入式方向所涉及的51单片机、操作系统、ARM、Qt等,期间做过许多小实验,单片机最经典的

  • maven常用打包命令

    maven常用打包命令maven常用打包命令1、mvncompile编译,将Java源程序编译成class字节码文件。2、mvntest测试,并生成测试报告3、mvnclean将以前编译得到的旧的class字节码文件删除4、mvnpakage打包,动态web工程打war包,Java工程打jar包。5、mvninstall将项目生成jar包放在仓库中,以便别的模块调用6、mvncleaninstall-Dmaven.test.skip=true打成jar包,并且抛弃测

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号