• Mina入门:mina版之HelloWorld[z]


    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也一样。

  • 相关阅读:
    二分查找:思路很简单,细节是魔鬼
    今天遇到了 X-Y PROBLEM
    《工匠精神》读书笔记
    养成好的职业习惯
    php xdebug 调试
    Dockerfile的常见命令
    docker制作镜像
    脱坑笔记
    Java中代理
    2、遇到多个构造器参数的时候要考虑使用构建器
  • 原文地址:https://www.cnblogs.com/jjj250/p/4103377.html
Copyright © 2020-2023  润新知