附6Apache Mina应用Word下载.docx

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

附6Apache Mina应用Word下载.docx

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

附6Apache Mina应用Word下载.docx

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.自己摸索学习另外一个开源通信框架的简单入门。

关键总结:

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

当前位置:首页 > 高中教育 > 英语

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

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