附6Apache Mina应用Word下载.docx
- 文档编号:17372228
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:13
- 大小:63.17KB
附6Apache Mina应用Word下载.docx
《附6Apache Mina应用Word下载.docx》由会员分享,可在线阅读,更多相关《附6Apache Mina应用Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
Mina能干什么?
先拉出来溜一下:
我们用它做两个小程序,一个为服务器,收到客户机的消息后,就回送给客户机;
一个是简单的客户机,一连上服务器,就发一条消息报到,然后将从服务器接到的消息再发给服务器。
嗯,你是否意识到这是一个死循环的C/S通信?
折腾机器这叫,编程就是要先能折腾!
第一步:
当然是下载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());
}
//当一个客户端关闭时
publicvoidsessionClosed(IoSessionsession){
System.out.println("
oneClinetDisconnect!
"
);
//当客户端发送的消息到达时:
publicvoidmessageReceived(IoSessionsession,Objectmessage)
throwsException{
//我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:
Strings=(String)message;
//Writethereceiveddatabacktoremotepeer
收到客户机发来的消息:
+s);
//测试将消息回送给客户端
session.write(s+count);
count++;
privateintcount=0;
}
处理器是是我们重写了mon.IoHandlerAdapter的一个类,其中被重写的方法,你根据方法名应可以想到这些方法的用途吧?
!
编程还有一点很重要,就是要会连猜带蒙。
启动服务器的主类:
MainServer.java
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示例
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));
MinaServerisListingon:
="
+bindPort);
就这么简单!
启动服务器,试一下!
不幸的是,输出的是如下的一行异常信息:
Exceptioninthread"
main"
java.lang.NoClassDefFoundError:
org/slf4j/LoggerFactoryatmon.SimpleIoProcessorPool.<
init>
(SimpleIoProcessorPool.java:
78)atmon.SimpleIoProcessorPool.<
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)的读取数据
总是用telnet不行吧,用Mina编写客户机,跟服务器是一样的简单!
goon!
就不废话了,还是两个类,一个启动主类,一个消息处理器:
启动主类:
MainClient.java
importmon.ConnectFuture;
importorg.apache.mina.transport.socket.nio.NioSocketConnector;
*简单MinaClient示例
*/
publicclassMainClient{
//CreateTCP/IPconnector.
NioSocketConnectorconnector=newNioSocketConnector();
//创建接收数据的过滤器
DefaultIoFilterChainBuilderchain=connector.getFilterChain();
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;
*MinaClient接收消息的处理器
publicclassSamplMinaClientHandlerextendsIoHandlerAdapter{
//当一个客端端连结进入时
@Override
publicvoidsessionOpened(IoSessionsession)throwsException{
session.write("
我来啦........"
}
//当一个客户端关闭时
publicvoidsessionClosed(IoSessionsession){
System.out.println("
//当客户端发送的消息到达时:
publicvoidmessageReceived(IoSessionsession,Objectmessage)
throwsException{
//我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:
Strings=(String)message;
//Writethereceiveddatabacktoremotepeer
服务器发来的收到消息:
//测试将消息回送给客户端
session.write(s);
编写完成,启动服务器,再启动客户机,让你的机器狂奔吧!
所谓总结,是我们这两个程序中用到了Mina包中的几个API,我们分析其用途而己,其实这个总结应该你自己查看Mina的文档来完成:
还是简单的说下我们用到的几个关键API:
NioSocketAcceptor:
这是创建非阻塞服务器端的类,类似与java中的ServerSocket,非阻塞I/O,是java5里提供的一组新的API,意思是我们的服务器不用像以前那样调用accept()方法,阻塞等待了。
NioSocketConnector:
功能似于jdk中的Socket类,当然,也是非阻塞的读取数据!
DefaultIoFilterChainBuilder:
对接收到的数据进行过滤的创建器,用以设定通信时的协议,在本例中,程序规则是一行数据就是一条消息,通过:
来设定
IoHandlerAdapter:
这是一个抽像类,专门用来让我们重写以处理程序接收到的消息的,并处理通信中的连结,断开,消息到达等事件。
客户机和服务器端创建后,都有一个setHandler方法,就是要传入我们重写了这个类的对象。
其中各个方法在通信中会根据情况自动调用,类似与Swing事件中的调用机制。
IoHandlerAdapter实现类中最重要的一个方法是:
//当客户端发送的消息到达时:
这个方法传进来两个参数,第一个,代表了与对方机器的Tcp/IP连结,第二个,代表了接收到的数据,为什么定义为Object型?
为了你灵活使用啊,怎个灵活法?
看我们后面的Demo!
开发一个Mina应用,简单的说,就是创建连结,设定过滤规则,编写自己的消息处理器这三步!
比我们直接用Socket/ServerSocket思路清晰得多了吧。
还不够清楚?
那我就画个Mina结构图给你看,看你看得懂不?
这只是Mina小试,如果你以为Mina只有这点用处,你就太没有探索精神了!
总结就这么些,去看Minadoc,比这详细得多!
还要我帮你再探索下,什么安全通信,日志记录,图片传送,UDP消息…?
OK,再教一招使用Mina直接传送对象:
不要以为直接传送对象是RMI的专利,在Mina中变得更容易,我就长话短说,不堆代码了,当然,关键的代码还是会给出:
第一步:
编写序列化对象类,你当然要写一个被传送对象的类,在服务器端和客户机端公用。
这不是废话,要记住的关键是这个类必须这样:
publicclassUserinfoimplementsjava.io.Serializable{
...}
第二步:
设定过滤器,你现在应己理解,Mina中对流数的数据解析规则是依靠我们设定的Filter实现的,上例上我们传的是以一行为单位的字符串,这里我们要传对象,就不能用那个Filter了(至于都有哪些Filter,去看文档吧!
),这里,我们要设定是的ObjectSerializationCodecFactory这个Filter,看名字你应知道是什么意思了吧,在服务器端:
//创建一个非阻塞的Server端Socket,用NIO
//设定这个过滤器将以对象为单位读取数据
ProtocolCodecFilterfilter=newProtocolCodecFilter(newObjectSerializationCodecFactory());
objectFilter"
filter);
...
当然,也少不了客户端要设定:
//设定服务器端的消息处理器:
...
第三步:
收发对象:
在自己实现IoHandlerAdapter的类中,编写代码就是。
这是最简单的一步了,看代码自己理解吧:
//我们己设定了服务器解析消息的规则一个Userinfo对象为单位传输:
Userinfous=(Userinfo)message;
收到客户机发来的用户对象:
+us.toString());
//将对象发送给客户端
us.setUserName("
服务器收到"
+count);
session.write(us);
Mina结构优雅,使用简单,功能强大,这是我给它的评价---但你不要在这一棵树上吊死哦,再推荐几个类似的东东,你可以自行比较其优劣:
Cindy:
QuickServer:
http:
//www.quickserver.org/
hessian:
任务:
1.完成如上示例代码编写,并使用Mina代替以前所写的Socket通信;
2.使用Mina测试你机器上可能的并发连结数;
3.自己摸索学习另外一个开源通信框架的简单入门。
关键总结:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 附6Apache Mina应用 Apache Mina 应用