附6Apache Mina应用.docx

上传人:b****5 文档编号:4446156 上传时间:2022-12-01 格式:DOCX 页数:13 大小:63.17KB
下载 相关 举报
附6Apache Mina应用.docx_第1页
第1页 / 共13页
附6Apache Mina应用.docx_第2页
第2页 / 共13页
附6Apache Mina应用.docx_第3页
第3页 / 共13页
附6Apache Mina应用.docx_第4页
第4页 / 共13页
附6Apache Mina应用.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

附6Apache Mina应用.docx

《附6Apache Mina应用.docx》由会员分享,可在线阅读,更多相关《附6Apache Mina应用.docx(13页珍藏版)》请在冰豆网上搜索。

附6Apache Mina应用.docx

附6ApacheMina应用

ApacheMina应用

目标:

1.掌握Mina通信框架的结构。

2.能在项目中应用Mina进行开发;

3.理解NIO的概念。

1.Main说明1

2.Mina简单入门:

1

1.编写服务器端代码:

1

2.实现Mina的客户机:

4

3.Mina框架的体系总结:

6

4.使用Mina直接传送对象:

7

5.扩展学习:

9

总结和任务:

9

1.Main说明

Mina是什么?

上http:

//mina.apache.org/己看啊,一句话就是“一个简洁易用的基于Tcp/IP通信的java框架“,什么?

什么是框架?

再问你就不要向下看了。

Mina能干什么?

先拉出来溜一下:

我们用它做两个小程序,一个为服务器,收到客户机的消息后,就回送给客户机;一个是简单的客户机,一连上服务器,就发一条消息报到,然后将从服务器接到的消息再发给服务器。

嗯,你是否意识到这是一个死循环的C/S通信?

折腾机器这叫,编程就是要先能折腾!

2.Mina简单入门:

1.编写服务器端代码:

第一步:

当然是下载Mina,然后在ec里建个项目,将下载后的mina-core-2.0.0-M1.jar这个包加到你的新建的Project的lib中。

第二步,编写服务器代码:

服务器端由两个类组成,一个是Min.java,启动服务器的主类;另一个是SamplMinaServerHandler.java,这个类负责处理连结上来的客户机,即消息处理器。

看代码了:

处理器代码:

SamplMinaServerHandler.java

packagecom.javake.mina.sampleserver;

importmon.IoHandlerAdapter;

importmon.IoSession;

/**

*自定议的消息处理器,必须实现IoHandlerAdapter类

*@authorjavaFound

*@蓝杰

*/

publicclassSamplMinaServerHandlerextendsIoHandlerAdapter{

//当一个客端端连结进入时

@Override

publicvoidsessionOpened(IoSessionsession)throwsException{

System.out.println("incommingclient:

"+session.getRemoteAddress());

}

//当一个客户端关闭时

@Override

publicvoidsessionClosed(IoSessionsession){

System.out.println("oneClinetDisconnect!

");

}

//当客户端发送的消息到达时:

@Override

publicvoidmessageReceived(IoSessionsession,Objectmessage)

throwsException{

//我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:

Strings=(String)message;

//Writethereceiveddatabacktoremotepeer

System.out.println("收到客户机发来的消息:

"+s);

//测试将消息回送给客户端

session.write(s+count);

count++;

}

privateintcount=0;

}

处理器是是我们重写了mon.IoHandlerAdapter的一个类,其中被重写的方法,你根据方法名应可以想到这些方法的用途吧?

编程还有一点很重要,就是要会连猜带蒙。

启动服务器的主类:

MainServer.java

packagecom.javake.mina.sampleserver;

import.InetSocketAddress;

importmon.DefaultIoFilterChainBuilder;

importorg.apache.mina.filter.codec.ProtocolCodecFilter;

importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;

importorg.apache.mina.transport.socket.SocketAcceptor;

importorg.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**

*简单MinaServer示例

*@authorjavaFound

*@蓝杰

*/

publicclassMainServer{

publicstaticvoidmain(String[]args)throwsException{

//创建一个非阻塞的Server端Socket,用NIO

SocketAcceptoracceptor=newNioSocketAcceptor();

//创建接收数据的过滤器

DefaultIoFilterChainBuilderchain=acceptor.getFilterChain();

//设定这个过滤器将一行一行(/r/n)的读取数据

chain.addLast("myChin",newProtocolCodecFilter(newTextLineCodecFactory()));

//设定服务器端的消息处理器:

一个SamplMinaServerHandler对象,

acceptor.setHandler(newSamplMinaServerHandler());

//服务器端绑定的端口

intbindPort=9988;

//绑定端口,启动服务器

acceptor.bind(newInetSocketAddress(bindPort));

System.out.println("MinaServerisListingon:

="+bindPort);

}

}

就这么简单!

启动服务器,试一下!

不幸的是,输出的是如下的一行异常信息:

Exceptioninthread"main"java.lang.NoClassDefFoundError:

org/slf4j/LoggerFactoryatmon.SimpleIoProcessorPool.(SimpleIoProcessorPool.java:

78)atmon.SimpleIoProcessorPool.(SimpleIoProcessorPool.java:

90)atmon.AbstractPollingIoConnector.(AbstractPollingIoConnector.java:

61)atorg.apache.mina.transport.socket.nio.NioSocketConnector.(NioSocketConnector.java:

52)

atcom.javake.mina.sampleclient.Main.main(Main.java:

13)

意思是org.slf4j.LoggerFactory这个类找不到?

怎么办?

google啊!

slf4j也是一个开源的项目,专用做日志记录,到http:

//www.slf4j.org/上面去下载后,将log4j-over-slf4j-1.5.0.jar、和slf4j-nop-1.5.0.jar这两个jsr包加到项目中,再运行!

如果还报错,那烦请你告诉我,我再去google!

如果运行成功,就进行下一步吧:

第三步:

测试服务器:

非要编写客户端代码才能测试吗?

N!

,启动服务器,我们使用命令行的Telnet测试:

现在你只要按一下回车,命令行的telnet就会做为一个client连上我们编写的服务器:

如果能像上图那样收发消息,(不要忘了,在命令行输入消息后要qiao回车,消息才会发送到服务器),就证明你的服务器编写成功了!

为什么输入消息后要qiao回车?

你忘了我们程序中这一句了吧:

//设定这个过滤器将一行一行(/r/n)的读取数据

chain.addLast("myChin",newProtocolCodecFilter(newTextLineCodecFactory()));

总是用telnet不行吧,用Mina编写客户机,跟服务器是一样的简单!

goon!

2.实现Mina的客户机:

就不废话了,还是两个类,一个启动主类,一个消息处理器:

启动主类:

MainClient.java

import.InetSocketAddress;

importmon.ConnectFuture;

importmon.DefaultIoFilterChainBuilder;

importorg.apache.mina.filter.codec.ProtocolCodecFilter;

importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;

importorg.apache.mina.transport.socket.nio.NioSocketConnector;

/**

*简单MinaClient示例

*@authorjavaFound

*@蓝杰

*/

publicclassMainClient{

publicstaticvoidmain(String[]args)throwsException{

//CreateTCP/IPconnector.

NioSocketConnectorconnector=newNioSocketConnector();

//创建接收数据的过滤器

DefaultIoFilterChainBuilderchain=connector.getFilterChain();

//设定这个过滤器将一行一行(/r/n)的读取数据

chain.addLast("myChin",newProtocolCodecFilter(newTextLineCodecFactory()));

//设定服务器端的消息处理器:

一个SamplMinaServerHandler对象,

connector.setHandler(newSamplMinaClientHandler());

//Setconnecttimeout.

connector.setConnectTimeout(30);

//连结到服务器:

ConnectFuturecf=connector.connect(newInetSocketAddress("localhost",9988));

//Waitfortheconnectionattempttobefinished.

cf.awaitUninterruptibly();

cf.getSession().getCloseFuture().awaitUninterruptibly();

connector.dispose();

}

}

消息处理器类:

SamplMinaClientHandler.java

packagecom.javake.mina.sampleclient;

 

importmon.IoHandlerAdapter;

importmon.IoSession;

/**

*MinaClient接收消息的处理器

*@authorjavaFound

*@蓝杰

*/

publicclassSamplMinaClientHandlerextendsIoHandlerAdapter{

//当一个客端端连结进入时

@Override

publicvoidsessionOpened(IoSessionsession)throwsException{

System.out.println("incommingclient:

"+session.getRemoteAddress());

session.write("我来啦........");

}

//当一个客户端关闭时

@Override

publicvoidsessionClosed(IoSessionsession){

System.out.println("oneClinetDisconnect!

");

}

//当客户端发送的消息到达时:

@Override

publicvoidmessageReceived(IoSessionsession,Objectmessage)

throwsException{

//我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:

Strings=(String)message;

//Writethereceiveddatabacktoremotepeer

System.out.println("服务器发来的收到消息:

"+s);

//测试将消息回送给客户端

session.write(s);

}

}

编写完成,启动服务器,再启动客户机,让你的机器狂奔吧!

3.Mina框架的体系总结:

所谓总结,是我们这两个程序中用到了Mina包中的几个API,我们分析其用途而己,其实这个总结应该你自己查看Mina的文档来完成:

还是简单的说下我们用到的几个关键API:

NioSocketAcceptor:

这是创建非阻塞服务器端的类,类似与java中的ServerSocket,非阻塞I/O,是java5里提供的一组新的API,意思是我们的服务器不用像以前那样调用accept()方法,阻塞等待了。

NioSocketConnector:

功能似于jdk中的Socket类,当然,也是非阻塞的读取数据!

DefaultIoFilterChainBuilder:

对接收到的数据进行过滤的创建器,用以设定通信时的协议,在本例中,程序规则是一行数据就是一条消息,通过:

//设定这个过滤器将一行一行(/r/n)的读取数据

chain.addLast("myChin",newProtocolCodecFilter(newTextLineCodecFactory()));

来设定

IoHandlerAdapter:

这是一个抽像类,专门用来让我们重写以处理程序接收到的消息的,并处理通信中的连结,断开,消息到达等事件。

客户机和服务器端创建后,都有一个setHandler方法,就是要传入我们重写了这个类的对象。

其中各个方法在通信中会根据情况自动调用,类似与Swing事件中的调用机制。

IoHandlerAdapter实现类中最重要的一个方法是:

//当客户端发送的消息到达时:

@Override

publicvoidmessageReceived(IoSessionsession,Objectmessage)

这个方法传进来两个参数,第一个,代表了与对方机器的Tcp/IP连结,第二个,代表了接收到的数据,为什么定义为Object型?

为了你灵活使用啊,怎个灵活法?

看我们后面的Demo!

开发一个Mina应用,简单的说,就是创建连结,设定过滤规则,编写自己的消息处理器这三步!

比我们直接用Socket/ServerSocket思路清晰得多了吧。

还不够清楚?

那我就画个Mina结构图给你看,看你看得懂不?

这只是Mina小试,如果你以为Mina只有这点用处,你就太没有探索精神了!

总结就这么些,去看Minadoc,比这详细得多!

还要我帮你再探索下,什么安全通信,日志记录,图片传送,UDP消息…?

OK,再教一招使用Mina直接传送对象:

4.使用Mina直接传送对象:

不要以为直接传送对象是RMI的专利,在Mina中变得更容易,我就长话短说,不堆代码了,当然,关键的代码还是会给出:

第一步:

编写序列化对象类,你当然要写一个被传送对象的类,在服务器端和客户机端公用。

这不是废话,要记住的关键是这个类必须这样:

publicclassUserinfoimplementsjava.io.Serializable{

...}

第二步:

设定过滤器,你现在应己理解,Mina中对流数的数据解析规则是依靠我们设定的Filter实现的,上例上我们传的是以一行为单位的字符串,这里我们要传对象,就不能用那个Filter了(至于都有哪些Filter,去看文档吧!

),这里,我们要设定是的ObjectSerializationCodecFactory这个Filter,看名字你应知道是什么意思了吧,在服务器端:

//创建一个非阻塞的Server端Socket,用NIO

SocketAcceptoracceptor=newNioSocketAcceptor();

//创建接收数据的过滤器

DefaultIoFilterChainBuilderchain=acceptor.getFilterChain();

//设定这个过滤器将以对象为单位读取数据

ProtocolCodecFilterfilter=newProtocolCodecFilter(newObjectSerializationCodecFactory());

chain.addLast("objectFilter",filter);

...

当然,也少不了客户端要设定:

//CreateTCP/IPconnector.

NioSocketConnectorconnector=newNioSocketConnector();

//创建接收数据的过滤器

DefaultIoFilterChainBuilderchain=connector.getFilterChain();

//设定这个过滤器将以对象为单位读取数据

ProtocolCodecFilterfilter=newProtocolCodecFilter(newObjectSerializationCodecFactory());

//设定服务器端的消息处理器:

一个SamplMinaServerHandler对象,

chain.addLast("objectFilter",filter);

...

第三步:

收发对象:

在自己实现IoHandlerAdapter的类中,编写代码就是。

这是最简单的一步了,看代码自己理解吧:

//当客户端发送的消息到达时:

@Override

publicvoidmessageReceived(IoSessionsession,Objectmessage)

throwsException{

//我们己设定了服务器解析消息的规则一个Userinfo对象为单位传输:

Userinfous=(Userinfo)message;

//Writethereceiveddatabacktoremotepeer

System.out.println("收到客户机发来的用户对象:

"+us.toString());

//将对象发送给客户端

us.setUserName("服务器收到"+count);

session.write(us);

count++;

}

5.扩展学习:

Mina结构优雅,使用简单,功能强大,这是我给它的评价---但你不要在这一棵树上吊死哦,再推荐几个类似的东东,你可以自行比较其优劣:

Cindy:

QuickServer:

http:

//www.quickserver.org/

hessian:

总结和任务:

任务:

1.完成如上示例代码编写,并使用Mina代替以前所写的Socket通信;

2.使用Mina测试你机器上可能的并发连结数;

3.自己摸索学习另外一个开源通信框架的简单入门。

关键总结:

 

 

 

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1