请去360手机助手下载android学习手册里面有例子、源码和文档
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。
以上是从网上找到的mina框架简单介绍。
由于正在开发的项目中要求加入及时通信功能(游戏方面),所以在网上找了好几种框架,像openfire、tigase等都是基于Xmpp协议开发的优秀框架。但这些侧重于消息的推送,不适合游戏上的简单交互。所以后来找到了mina这个框架,顺手搭建起来。接下来就是这几天学习的总结了,文章里面没有涉及到逻辑层的方面,只是简单的实现即时通信功能。资源下载我会放在文章的最后面。
一、相关资源下载
(1)Apache官方网站:http://mina.apache.org/downloads.html
(2) Android用jar包(包括官网的资源,我会一律放在百度网盘下)
二、Mina简单配置
服务器端一共要用到四个jar包,包括一个日志包。将他们放在lib中,并加载进去
分别为 mina-core-2.0.7.jar slf4j-log4j12-1.7.6.jar slf4j-api-1.7.6.jar log4j-1.2.14.jar(日志管理包)
如果要使用日志的jar包,则要在项目的src目录下新建一个log4j.properties,添加内容如下:
log4j.rootCategory=INFO, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL
log4j.logger.com.canoo.webtest=WARN
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN
log4j.rootCategory=INFO, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=D:\\Tomcat 5.5\\logs\\qc.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
1log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
log4j.logger.com.neusoft=DEBUG
log4j.logger.com.opensymphony.oscache=ERROR
log4j.logger.net.sf.navigator=ERROR
log4j.logger.org.apache.commons=ERROR
log4j.logger.org.apache.struts=WARN
log4j.logger.org.displaytag=ERROR
log4j.logger.org.springframework=DEBUG
log4j.logger.com.ibatis.db=WARN
log4j.logger.org.apache.velocity=FATAL
log4j.logger.com.canoo.webtest=WARN
log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
log4j.logger.org.hibernate=DEBUG
log4j.logger.org.logicalcobwebs=WARN
Android客户端要加入的jar包:mina-core-2.0.7.jar slf4j-android-1.6.1-RC1.jar 两个jar包(可能直接使用上面的jar包也会行,我没试过~)
二、Mina服务端
我这边使用的是mina2.0版本,所以可能与mina1.0的版本有所不同。那么首先在服务器端创建开始
新建一个Demo1Server.class文件,里面包含着程序的入口,端口号,Acceptor连接.
1 public class Demo1Server {
2 //日志类的实现
3 private static Logger logger = Logger.getLogger(Demo1Server.class)
4 //端口号,要求客户端与服务器端一致
5 private static int PORT = 4444
6
7 public static void main(String[] args){
8 IoAcceptor acceptor = null
9 try{
10 //创建一个非阻塞的server端的Socket
11 acceptor = new NioSocketAcceptor()
12 //设置过滤器(使用mina提供的文本换行符编解码器)
13 acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())))
14 //自定义的编解码器
15 //acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()))
16 //设置读取数据的换从区大小
17 acceptor.getSessionConfig().setReadBufferSize(2048)
18 //读写通道10秒内无操作进入空闲状态
19 acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10)
20 //为接收器设置管理服务
21 acceptor.setHandler(new Demo1ServerHandler())
22 //绑定端口
23 acceptor.bind(new InetSocketAddress(PORT))
24
25 logger.info("服务器启动成功... 端口号未:"+PORT)
26
27 }catch(Exception e){
28 logger.error("服务器启动异常...",e)
29 e.printStackTrace()
30 }
31 }
32
33 }
一个很简单的程序入口吧,简单的说就是在服务器上设置一个消息接收器,让它监听从端口传过来的消息并进行处理。那么接下来我们看看怎么进行消息处理。
新建一个消息处理类,或者说是是业务逻辑处理器——Demo1ServerHandler,它继承了IoHandlerAdapter类,它默认覆盖了七个方法,而我们主要使用messageReceived()。
public class Demo1ServerHandler extends IoHandlerAdapter {
public static Logger logger = Logger.getLogger(Demo1ServerHandler.class)
//从端口接受消息,会响应此方法来对消息进行处理
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = message.toString()
if("exit".equals(msg)){
//如果客户端发来exit,则关闭该连接
session.close(true)
}
//向客户端发送消息
Date date = new Date()
session.write(date)
logger.info("服务器接受消息成功...")
super.messageReceived(session, message)
}
//向客服端发送消息后会调用此方法
@Override
public void messageSent(IoSession session, Object message) throws Exception {
logger.info("服务器发送消息成功...")
super.messageSent(session, message)
}
//关闭与客户端的连接时会调用此方法
@Override
public void sessionClosed(IoSession session) throws Exception {
logger.info("服务器与客户端断开连接...")
super.sessionClosed(session)
}
//服务器与客户端创建连接
@Override
public void sessionCreated(IoSession session) throws Exception {
logger.info("服务器与客户端创建连接...")
super.sessionCreated(session)
}
//服务器与客户端连接打开
@Override
public void sessionOpened(IoSession session) throws Exception {
logger.info("服务器与客户端连接打开...")
super.sessionOpened(session)
}
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
logger.info("服务器进入空闲状态...")
super.sessionIdle(session, status)
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.info("服务器发送异常...")
super.exceptionCaught(session, cause)
}
}
很直白的一段程序,相当于将服务器分成了七个状态,而每个状态都有自己的一套逻辑处理方案。
至此,一个最简单的Mina服务器框架就搭好了,我们可以使用电脑上的telnet命令来测试一下服务器能否使用
cmd控制台—>telnet <ip地址><端口号> 如我的服务器ip地为192.168.1.10 那我就写telnet 192.168.1.10 4444 .此时我们可以看到输出日志为
此时连接已经创建,我们在输入信息服务器就会对信息进行处理,并给出相应的应答。
(telnet的用法不知道的可以自行百度)
三、Mina客户端(Android端)
服务器简单搭建完毕,那么开始在Android端是配置服务器吧。同样的不要忘记加载jar包, 由于Android自带了Logout,所以就不使用Mina的日志包了。
由于接受消息会阻塞Android的进程,所以我把它开在子线程中(同时将其放在Service中,让其在后台运行)
1 public class MinaThread extends Thread {
2
3 private IoSession session = null
4
5 @Override
6 public void run() {
7 // TODO Auto-generated method stub
8 Log.d("TEST","客户端链接开始...")
9 IoConnector connector = new NioSocketConnector()
10 //设置链接超时时间
11 connector.setConnectTimeoutMillis(30000)
12 //添加过滤器
13 //connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()))
14 connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),LineDelimiter.WINDOWS.getValue(),LineDelimiter.WINDOWS.getValue())))
15 connector.setHandler(new MinaClientHandler(minaService))
16
17 try{
18 ConnectFuture future = connector.connect(new InetSocketAddress(ConstantUtil.WEB_MATCH_PATH,ConstantUtil.WEB_MATCH_PORT))//创建链接
19 future.awaitUninterruptibly()// 等待连接创建完成
20 session = future.getSession()//获得session
21 session.write("start")
22 }catch (Exception e){
23 Log.d("TEST","客户端链接异常...")
24 }
25 session.getCloseFuture().awaitUninterruptibly()//等待连接断开
26 Log.d("TEST","客户端断开...")
27 connector.dispose()
28 super.run()
29 }
30
31 }
不知道你们注意到了没,客户端的代码与服务器端的极其相似,不同的是服务器是创建NioSocketAcceptor对象,而客户端是创建NioSocketConnect对象。当然同样需要添加编码解码过滤器和业务逻辑过滤器。
业务逻辑过滤器代码:
1 public class MinaClientHandler extends IoHandlerAdapter{
2
3
4 @Override
5 public void exceptionCaught(IoSession session, Throwable cause)
6 throws Exception {
7 Log.d("TEST","客户端发生异常")
8 super.exceptionCaught(session, cause)
9 }
10
11 @Override
12 public void messageReceived(IoSession session, Object message)
13 throws Exception {
14 String msg = message.toString()
15 Log.d("TEST","客户端接收到的信息为:" + msg)
16 super.messageReceived(session, message)
17 }
18
19 @Override
20 public void messageSent(IoSession session, Object message) throws Exception {
21 // TODO Auto-generated method stub
22 super.messageSent(session, message)
23 }
24 }
方法功能与服务器端一样。测试这里就不做了。可以的话自己写个Demo效果更好
四、Mina的更多功能
拿到所有客户端Session
Collection<IoSession>sessions = session.getService().getManagedSessions().values()
自定义编码解码器,可以对消息进行预处理。要继承ProtocolEncoder和ProtocolDecode类。
数据对象的传递
这些功能不便放在这里讲了,可能我会以后再找机会另开一篇来讲述这些功能~,大家可以浏览结尾处的参考文章来加深对mina的理解。
在我认为,熟悉和快速使用一个新的的框架可以看出一个程序员的水平,同样及时总结和归纳自己学到的新知识也是一个好的程序员该具有的习惯。那么Mina的简单搭建就到这里为止了,希望对大家有所帮助
这个多了去了 ,apache 绝对是 开源里面的领头羊for example:
分类 项目名 说明 开发语言
服务器
(共20) Apache HTTP Server 全球第一HTTP服务器 C/C++
Tomcat Java的Web服务器 Java
James 邮件服务器 Java
SpamAssassin 反垃圾邮件 C/C++
Perl Apache的Perl编程语言支持 C/C++
Tcl TCL脚本语言 C/C++
Directory Server 超级目录服务器 Java
Axis WebServic服务器 Java
Kandula Axis中WS-Coordination、WS-AtomicTransaction、WS-BusinessActivity协议的实现 Java
Muse Axis中WS-ResourceFramework (WSRF), WS-BaseNotification (WSN), and WS-DistributedManagement (WSDM) 标准的实现(该项目Logo是个不认识的古汉字) Java
Pubscribe Web Services Notification (WSN) 标准实现 Java
Sandesha WS-ReliableMessaging 标准实现 Java
WSS4J WS-Security 标准实现 Java
WSRF Web Services Resource Framework 标准实现 Java
Addressing WebService的WS-Addressing标准(IBM、微软、BEA发布)实现 Java
XML Security XML签名与加密标准的Java、C++实现 Java/C++
jUDDI UDDI的Java实现 Java
XML-RPC XML-RPC实现 Java
Derby 纯Java做的关系数据库 Java
Xindice XML数据库 Java
开发工具(共5) Ant 自动编译 Java
Maven 项目管理工具,比Ant强大,支持插件开发 Java
Gump 每日集成工具,支持Ant、Maven Python
JMeter Web应用性能测试 Java
DdlUtils 用XML来定义DDL Java
Web开发框架(共19) Struts MVC的Web开发框架 Java
Cocoon Web开发框架,基于可运行的XML管道语言 Java
FOP XSL-FO 打印与输出解决方案,基于Java Java
AxKit 基于XML的Web发布 Java
Tapestry Web开发框架 Java
Turbine Web开发框架 Java
Shale 基于JSF的Web开发框架 Java
MyFaces 第一个开源的JSF实现 Java
Beehive 基于Structs的J2EE框架,简化J2EE编程;含Web界面、WebService开发框架 Java
Velocity 模板引擎 Java
Portals 门户解决方案 Java
Cactus Web开发测试框架 Java
Forrest 基于Cocoon的Web发布解决方案 Java
Slide 内容管理,支持WebDAV Java
Jackrabbit 内容库,用于内容管理 Java
Lenya 内容管理,支持版本管理、工作流、所见所得编辑器 Java
Xang 基于JavaScript进行动态Web开发 Java
Xindice 纯XML数据库 Java
JCS 分布式Cache系统(Java Caching System) Java
容器(共7) Geronimo J2EE容器,类似JBoss Java
iBATIS 简单OR映射,有.NET版本 Java/C#
Torque OR映射 Java
ORB ObjectRelationalBridge,OR映射 Java
JDO JDO标准的一个实现 Java
HiveMind 类似Spring的东西,微内核DI容器 Java
Excalibur IoC容器 Java
组件(共82) APR 不同操作系统间可移植运行时库 C/C++
Regexp Java正则表达式 Java
ORO Perl风格的正则表达式 Java
Xerces XML解析,Java/C两种版本 Java/C++
Crimson XML解析器 Java
AXIOM 更高效的DOM实现 Java
Lucene 全文检索,有.NET版本 Java/C#
Logging 不仅Log4j,各个语言的版本都有了 Java/C++/Perl/C#
XMLBeans XML转对象 Java
JaxMe Java/XML绑定的实现 Java
Taglibs JSP Tag库 Java
HttpComponents HTTP访问控件 Java
ECS 辅助生成标签(Element Construction Set) Java
WSIF WebService调用(Web Services Invocation Framework) Java
SOAP SOAP标准实现 Java
Woden WSDL书写工具 Java
Tuscany 简化SOA开发 Java
MIRAE 让手机支持基于XML的服务 Java
BSF 脚本语言框架(Bean Scripting Framework),支持JavaScript等多种脚本语言 Java
BCEL 用于直接生成字节码(Byte Code Engineering Library) Java
POI 存取Office文档 Java
Batik JAVA的SVG实现 Java
Attributes 访问Java 1.5语言中定义的meta 这些项目都在jakarta commons中,都是Java的
BeanUtils 反射支持
Betwixt XML/JavaBean转换
Chain 职责链模式实现
CLI 命令行参数解析
Codec 通用加密/加密算法
Collections Java容器类完善扩充
Configuration 各种来源配置文件存取
Daemon Java模拟Unix的Daemon
DBCP 数据链连接池
DbUtils JDBC辅助类
Digester XML到Java对象映射工具
Discovery 根据名称来查找资源
EL JSP 2.0 表达式标准实现
Email 发送Email类
FileUpload 文件上传辅助类
HttpClient HTTP客户端
IO IO操作辅助类
Jelly 基于XML的脚本引擎
Jexl JSTL 表达式语言扩展
JXPath 用XPath语言来操作对象的辅助类
Lang java.lang.类扩充
Launcher 跨平台Java应用启动器
Logging 不同Log实现的封装
Math 数学、统计辅助类
Modeler 创建兼容JMX标准的MBeans
Net 各种网络协议实现
Pool 对象池
Primitives 很小的Java原始对象类型操作辅助类
SCXML 状态图XML标准实现
Transaction 多层次容器、文件操作事务支持
Validator 用XML定义校验器和校验规则
VFS 虚拟文件系统用于操作FTP、SMB、Zip等
Compress tar、zip、bzip2压缩格式文件操作 这些项目都在jakarta commons中的Sandbox中
CSV CSV文件格式支持
Exec 外部进程执行和环境设置辅助类
Finder 模拟Unix find命令
I18n 国际化辅助类
Id 生成ID辅助类
Javaflow 应用状态管理
JCI Java编译器接口
OpenPGP OpenPGP封装
Pipeline 管道辅助类用于并行或者顺序操作数据
Proxy 动态代码生成辅助类
Cache 对象缓存服务 这些项目都在jakarta commons中的Dormant(睡眠)中
Clazz class操作和反射操作
Contract 契约编程用到Java中
Convert Java对象类西转换辅助类
Events 事件管理容器
Feedparser RSS和Atom实现
Functor 用对象方式来操作函数
JJar Jar操作
Latka HTTP功能测试
Mapper 简单封装后可以选择不同的对象映射实现
Messenger JMS用于Web开发中的辅助类
Resources 国际化资源信息查找
Scaffold Web应用开发工具
ThreadPool 线程池
Workflow 工作流管理系统框架
XMLIO XML配置快速简便导入
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)