1、 Mina能干什么?先拉出来溜一下:我们用它做两个小程序,一个为服务器,收到客户机的消息后,就回送给客户机;一个是简单的客户机,一连上服务器,就发一条消息报到,然后将从服务器接到的消息再发给服务器。嗯,你是否意识到这是一个死循环的C/S通信?折腾机器这叫,编程就是要先能折腾! 第一步:当然是下载Mina,然后在ec里建个项目,将下载后的mina-core-2.0.0-M1.jar 这个包加到你的新建的Project的lib中。第二步,编写服务器代码:服务器端由两个类组成,一个是Min.java,启动服务器的主类;另一个是SamplMinaServerHandler.java,这个类负责处理连结
2、上来的客户机,即消息处理器。看代码了:处理器代码:SamplMinaServerHandler.javapackage com.javake.mina.sampleserver;import mon.IoHandlerAdapter;import mon.IoSession;/* * 自定议的消息处理器,必须实现IoHandlerAdapter类 * author javaFound * 蓝杰 */public class SamplMinaServerHandler extends IoHandlerAdapter /当一个客端端连结进入时 Override public void sess
3、ionOpened(IoSession session) throws Exception System.out.println(incomming client : +session.getRemoteAddress(); /当一个客户端关闭时 public void sessionClosed(IoSession session) System.out.println(one Clinet Disconnect !); /当客户端发送的消息到达时: public void messageReceived(IoSession session, Object message) throws E
4、xception /我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String: String s=(String)message; / Write the received data back to remote peer收到客户机发来的消息:+s); /测试将消息回送给客户端 session.write(s+count); count+; private int count=0; 处理器是是我们重写了mon.IoHandlerAdapter的一个类,其中被重写的方法,你根据方法名应可以想到这些方法的用途吧?!编程还有一点很重要,就是要会连猜带蒙。启动服务器的主类:MainSe
5、rver.javaimport .InetSocketAddress;import mon.DefaultIoFilterChainBuilder;import org.apache.mina.filter.codec.ProtocolCodecFilter;import org.apache.mina.filter.codec.textline.TextLineCodecFactory;import org.apache.mina.transport.socket.SocketAcceptor;import org.apache.mina.transport.socket.nio.NioSo
6、cketAcceptor; * 简单Mina Server示例public class MainServer public static void main(String args) throws Exception /创建一个非阻塞的Server端Socket,用NIO SocketAcceptor acceptor = new NioSocketAcceptor(); /创建接收数据的过滤器 DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); /设定这个过滤器将一行一行(/r/n)的读取数据 chain.addLas
7、t(myChin, new ProtocolCodecFilter(new TextLineCodecFactory(); /设定服务器端的消息处理器:一个SamplMinaServerHandler对象, acceptor.setHandler(new SamplMinaServerHandler(); / 服务器端绑定的端口 int bindPort=9988; /绑定端口,启动服务器 acceptor.bind(new InetSocketAddress(bindPort);Mina Server is Listing on:= + bindPort); 就这么简单!启动服务器,试一下!
8、不幸的是,输出的是如下的一行异常信息:Exception in thread main java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory at mon.SimpleIoProcessorPool.(SimpleIoProcessorPool.java:78) at mon.SimpleIoProcessorPool.90) at mon.AbstractPollingIoConnector.(AbstractPollingIoConnector.java:61) at org.apache.mina.transport.socket
9、.nio.NioSocketConnector.(NioSocketConnector.java:52) at com.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! 如果运
10、行成功,就进行下一步吧:第三步:测试服务器: 非要编写客户端代码才能测试吗?N!,启动服务器,我们使用命令行的Telnet测试: 现在你只要按一下回车,命令行的telnet就会做为一个client连上我们编写的服务器: 如果能像上图那样收发消息,(不要忘了,在命令行输入消息后要qiao回车,消息才会发送到服务器),就证明你的服务器编写成功了! 为什么输入消息后要qiao回车?你忘了我们程序中这一句了吧:/设定这个过滤器将一行一行(/r/n)的读取数据 总是用telnet不行吧,用Mina编写客户机,跟服务器是一样的简单!go on! 就不废话了,还是两个类,一个启动主类,一个消息处理器:启动主
11、类:MainClient.javaimport mon.ConnectFuture;import org.apache.mina.transport.socket.nio.NioSocketConnector; * 简单Mina Client示例 */ public class MainClient / Create TCP/IP connector. NioSocketConnector connector = new NioSocketConnector(); / 创建接收数据的过滤器 DefaultIoFilterChainBuilder chain = connector.getFil
12、terChain(); connector.setHandler(new SamplMinaClientHandler(); / Set connect timeout. connector.setConnectTimeout(30); /连结到服务器: ConnectFuture cf = connector.connect(new InetSocketAddress(localhost, 9988); / Wait for the connection attempt to be finished. cf.awaitUninterruptibly(); cf.getSession().ge
13、tCloseFuture().awaitUninterruptibly(); connector.dispose();消息处理器类:SamplMinaClientHandler.javapackage com.javake.mina.sampleclient; * Mina Client 接收消息的处理器public class SamplMinaClientHandler extends IoHandlerAdapter /当一个客端端连结进入时 Override public void sessionOpened(IoSession session) throws Exception se
14、ssion.write(我来啦. /当一个客户端关闭时 public void sessionClosed(IoSession session) System.out.println( /当客户端发送的消息到达时: public void messageReceived(IoSession session, Object message) throws Exception /我们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String: String s=(String)message; / Write the received data back to remote peer服务
15、器发来的收到消息: /测试将消息回送给客户端 session.write(s); 编写完成,启动服务器,再启动客户机,让你的机器狂奔吧! 所谓总结,是我们这两个程序中用到了Mina包中的几个API,我们分析其用途而己,其实这个总结应该你自己查看Mina的文档来完成: 还是简单的说下我们用到的几个关键API:NioSocketAcceptor: 这是创建非阻塞服务器端的类,类似与java中的ServerSocket,非阻塞I/O,是java5里提供的一组新的API,意思是我们的服务器不用像以前那样调用accept()方法,阻塞等待了。NioSocketConnector:功能似于jdk中的Soc
16、ket类,当然,也是非阻塞的读取数据!DefaultIoFilterChainBuilder:对接收到的数据进行过滤的创建器,用以设定通信时的协议,在本例中,程序规则是一行数据就是一条消息,通过: 来设定IoHandlerAdapter:这是一个抽像类,专门用来让我们重写以处理程序接收到的消息的,并处理通信中的连结,断开,消息到达等事件。客户机和服务器端创建后,都有一个setHandler方法,就是要传入我们重写了这个类的对象。 其中各个方法在通信中会根据情况自动调用,类似与Swing事件中的调用机制。IoHandlerAdapter实现类中最重要的一个方法是:/当客户端发送的消息到达时: 这
17、个方法传进来两个参数,第一个,代表了与对方机器的Tcp/IP连结,第二个,代表了接收到的数据,为什么定义为Object型?为了你灵活使用啊,怎个灵活法?看我们后面的Demo! 开发一个Mina应用,简单的说,就是创建连结,设定过滤规则,编写自己的消息处理器这三步!比我们直接用Socket/ServerSocket思路清晰得多了吧。 还不够清楚?那我就画个Mina结构图给你看,看你看得懂不? 这只是Mina小试,如果你以为Mina只有这点用处,你就太没有探索精神了!总结就这么些,去看Mina doc,比这详细得多! 还要我帮你再探索下,什么安全通信,日志记录,图片传送,UDP消息?OK,再教一招
18、使用Mina直接传送对象: 不要以为直接传送对象是RMI的专利,在Mina中变得更容易,我就长话短说,不堆代码了,当然,关键的代码还是会给出: 第一步:编写序列化对象类,你当然要写一个被传送对象的类,在服务器端和客户机端公用。这不是废话,要记住的关键是这个类必须这样:public class Userinfo implements java.io.Serializable . . . 第二步:设定过滤器,你现在应己理解,Mina中对流数的数据解析规则是依靠我们设定的Filter实现的,上例上我们传的是以一行为单位的字符串,这里我们要传对象,就不能用那个Filter了(至于都有哪些Filter,
19、去看文档吧!),这里,我们要设定是的ObjectSerializationCodecFactory 这个Filter,看名字你应知道是什么意思了吧,在服务器端:/创建一个非阻塞的Server端Socket,用NIO /设定这个过滤器将以对象为单位读取数据 ProtocolCodecFilter filter= new ProtocolCodecFilter(new ObjectSerializationCodecFactory();objectFilter,filter);. . . 当然,也少不了客户端要设定:/设定服务器端的消息处理器: . . . 第三步:收发对象:在自己实现IoHand
20、lerAdapter的类中,编写代码就是。这是最简单的一步了,看代码自己理解吧: /我们己设定了服务器解析消息的规则一个Userinfo对象为单位传输: Userinfo us=(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