Mina入门:mina版之HelloWorld

[z]

一,前言:

在完成上篇文章《Mina入门:Java NIO框架Mina、Netty、Grizzly简介与对比》之后,我们现在可以正式切入Mina入门学习了。

http://i.cnblogs.com/EditPosts.aspx?opt=1

二,搭建项目结构与解决项目依赖

本人使用Maven来管理项目的依赖。好了,废话也不多说,直接上pom.xml。这里主要是加入mina-core以及其依赖的SLF4J。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Xml代码  收藏代码
  1.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  2.     <modelVersion>4.0.0</modelVersion>  
  3.   
  4.     <groupId>com.androidwhy</groupId>  
  5.     <artifactId>mina-helloworld</artifactId>  
  6.     <version>0.0.1-SNAPSHOT</version>  
  7.     <packaging>jar</packaging>  
  8.   
  9.     <name>mina-helloworld</name>  
  10.     <url>http://www.androidwhy.com</url>  
  11.   
  12.     <properties>  
  13.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  14.     </properties>  
  15.   
  16.     <dependencies>  
  17.         <dependency>  
  18.             <groupId>org.apache.mina</groupId>  
  19.             <artifactId>mina-core</artifactId>  
  20.             <version>2.0.4</version>  
  21.         </dependency>  
  22.   
  23.         <dependency>  
  24.             <groupId>org.slf4j</groupId>  
  25.             <artifactId>jcl-over-slf4j</artifactId>  
  26.             <version>1.6.1</version>  
  27.         </dependency>  
  28.   
  29.         <dependency>  
  30.             <groupId>org.slf4j</groupId>  
  31.             <artifactId>slf4j-nop</artifactId>  
  32.             <version>1.6.1</version>  
  33.         </dependency>  
  34.   
  35.         <dependency>  
  36.             <groupId>junit</groupId>  
  37.             <artifactId>junit</artifactId>  
  38.             <version>3.8.1</version>  
  39.             <scope>test</scope>  
  40.         </dependency>  
  41.     </dependencies>  
  42. </project>  

 这里需要注意一点的就是Mina与SLF4J版本的匹配,官方也有文档提到了,注意一下就是。

 

三,编写服务器

我们的mina版的HelloWorld的业务逻辑很简单,就是接收客户端的请求,并回应给客户端一个字符"Hello,I am Server!"就可以了。

MinaTimeServer的主代码如下。

package com.androidwhy.mina.helloworld.server;

Java代码  收藏代码
  1. import java.io.IOException;  
  2. import java.net.InetSocketAddress;  
  3. import java.nio.charset.Charset;  
  4.   
  5. import org.apache.mina.core.service.IoAcceptor;  
  6. import org.apache.mina.core.session.IdleStatus;  
  7. import org.apache.mina.filter.codec.ProtocolCodecFilter;  
  8. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;  
  9. import org.apache.mina.filter.logging.LoggingFilter;  
  10. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;  
  11.   
  12.   
  13. public class MinaTimeServer {  
  14.   
  15. <span style="white-space: pre;">    </span>private static final int PORT = 8888;  
  16.   
  17.     public static void main(String[] args) throws IOException {  
  18.         // Create the acceptor  
  19.         IoAcceptor acceptor = new NioSocketAcceptor();  
  20.           
  21.         // Add two filters : a logger and a codec  
  22.         acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );  
  23.         acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));  
  24.      
  25.         // Attach the business logic to the server  
  26.         acceptor.setHandler( new HelloWorldServerHandler() );  
  27.   
  28.         // Configurate the buffer size and the iddle time  
  29.         acceptor.getSessionConfig().setReadBufferSize( 2048 );  
  30.         acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );  
  31.           
  32.         // And bind !  
  33.         acceptor.bind( new InetSocketAddress(PORT) );  
  34.     }  
  35. }  

 

Handler代码如下:

package com.androidwhy.mina.helloworld.server;

Java代码  收藏代码
  1. import org.apache.mina.core.service.IoHandlerAdapter;  
  2. import org.apache.mina.core.session.IdleStatus;  
  3. import org.apache.mina.core.session.IoSession;  
  4.   
  5. public class HelloWorldServerHandler extends IoHandlerAdapter  
  6. {  
  7.     /** 
  8.      * Trap exceptions. 
  9.      */  
  10.     @Override  
  11.     public void exceptionCaught( IoSession session, Throwable cause ) throws Exception  
  12.     {  
  13.         cause.printStackTrace();  
  14.     }  
  15.   
  16.     /** 
  17.      * If the message is 'quit', we exit by closing the session. Otherwise, 
  18.      * we return the message. 
  19.      */  
  20.     @Override  
  21.     public void messageReceived( IoSession session, Object message ) throws Exception  
  22.     {  
  23.         String str = message.toString();  
  24.           
  25.         if( str.trim().equalsIgnoreCase("quit") ) {  
  26.             // "Quit" ? let's get out ...  
  27.             session.close(true);  
  28.             return;  
  29.         }  
  30.           
  31.         System.out.println("Received message:"+str);  
  32.   
  33.         // Send the "Hello, I am Server!" back to the client  
  34.         String helloWorld = "Hello, I am Server!";  
  35.         session.write(helloWorld);  
  36.         System.out.println("Message written...");  
  37.     }  
  38.   
  39.     /** 
  40.      * On idle, we just write a message on the console 
  41.      */  
  42.     @Override  
  43.     public void sessionIdle( IoSession session, IdleStatus status ) throws Exception  
  44.     {  
  45.         System.out.println( "IDLE " + session.getIdleCount( status ));  
  46.     }  
  47. }  

  你会发现,使用Mina写一个Server就是如此之简单!上面的MinaTimeServer主是建立一个监听在8888端口(建议使用大于1024的端口号,因为1024以下的是系统保留的)服务,并设置了一个日志filter与一个编码的filter;HelloWorldServerHandler对handler的各位状态进行了处理,在这里最为主要的就是override了messageReceived方法,并在其中处理我们的业务逻辑。

 

四,运行程序

到目前为止,我们只是写了一个Server,那程序怎么跑呢?客户端就暂时采用Telnet吧!

 

五,总结

我只想说一句:任何开源框架的入门都是如此的Easy,Mina也一样。

posted on 2014-11-17 13:18  懒懒的呐喊  阅读(253)  评论(0编辑  收藏  举报