作者:LookUp77 | 来源:互联网 | 2023-09-17 12:50
一,前言:在完成上篇文章《Mina入门:JavaNIO框架Mina、Netty、Grizzly简介与对比》之后,我们现在可以正式切入Mina入门学习了。二,搭建项目结构与解决项
一,前言:
在完成上篇文章《Mina入门:Java NIO框架Mina、Netty、Grizzly简介与对比》之后,我们现在可以正式切入Mina入门学习了。
二,搭建项目结构与解决项目依赖
本人使用Maven来管理项目的依赖。好了,废话也不多说,直接上pom.xml。这里主要是加入mina-core以及其依赖的SLF4J。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- class="attribute">xsi:schemaLocation= class="attribute-value">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" class="tag">>
- <modelVersion class="tag">>4.0.0modelVersion class="tag">>
-
- <groupId class="tag">>com.androidwhy class="tag-name">groupId class="tag">>
- <artifactId class="tag">>mina-helloworld class="tag-name">artifactId class="tag">>
- <version class="tag">>0.0.1-SNAPSHOT class="tag-name">version class="tag">>
- <packaging class="tag">>jar class="tag-name">packaging class="tag">>
-
- <name class="tag">>mina-helloworld class="tag-name">name class="tag">>
- <url class="tag">>http://www.androidwhy.com class="tag">url class="tag">>
-
- <properties class="tag">>
- class="tag">< class="tag-name">project.build.sourceEncoding class="tag">>UTF-8project.build.sourceEncoding class="tag">>
- properties class="tag">>
-
- <dependencies class="tag">>
- class="tag"><dependency>
- class="tag"><groupId class="tag">>org.apache.mina class="tag-name">groupId class="tag">>
- class="tag"><artifactId>mina-core class="tag">artifactId>
- class="tag"><version class="tag">>2.0.4version class="tag">>
- class="tag">dependency>
-
- class="tag"><dependency>
- class="tag"><groupId class="tag">>org.slf4jgroupId class="tag">>
- class="tag"><artifactId>jcl-over-slf4j class="tag">artifactId>
- class="tag"><version class="tag">>1.6.1version class="tag">>
- class="tag">dependency>
-
- class="tag"><dependency>
- class="tag"><groupId class="tag">>org.slf4jgroupId class="tag">>
- class="tag"><artifactId>slf4j-nop class="tag">artifactId>
- class="tag"><version class="tag">>1.6.1version class="tag">>
- class="tag">dependency>
-
- class="tag"><dependency>
- class="tag"><groupId class="tag">>junitgroupId class="tag">>
- class="tag"><artifactId>junit class="tag">artifactId>
- class="tag"><version class="tag">>3.8.1version class="tag">>
- class="tag"><scope class="tag">>testscope class="tag">>
- class="tag">dependency>
- dependencies class="tag">>
- class="tag-name">project class="tag">>
这里需要注意一点的就是Mina与SLF4J版本的匹配,官方也有文档提到了,注意一下就是。
三,编写服务器
我们的mina版的HelloWorld的业务逻辑很简单,就是接收客户端的请求,并回应给客户端一个字符"Hello,I am
Server!"就可以了。
MinaTimeServer的主代码如下。
package com.androidwhy.mina.helloworld.server;
- class="keyword">import java.io.IOException;
- class="keyword">import java.net.InetSocketAddress;
- class="keyword">import java.nio.charset.Charset;
-
- class="keyword">import org.apache.mina.core.service.IoAcceptor;
- class="keyword">import org.apache.mina.core.session.IdleStatus;
- class="keyword">import org.apache.mina.filter.codec.ProtocolCodecFilter;
- class="keyword">import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
- class="keyword">import org.apache.mina.filter.logging.LoggingFilter;
- class="keyword">import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
-
-
- public class="keyword">class MinaTimeServer {
-
- "white-space: pre;"> class="keyword">private class="keyword">static class="keyword">final class="keyword">int PORT = class="number">8888;
-
- class="keyword">public class="keyword">static class="keyword">void main(String[] args) throws IOException {
-
- IoAcceptor acceptor = class="keyword">new NioSocketAcceptor();
-
-
- acceptor.getFilterChain().addLast( class="string">"logger", class="keyword">new LoggingFilter() );
- acceptor.getFilterChain().addLast( class="string">"codec", class="keyword">new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( class="string">"UTF-8" ))));
-
-
- acceptor.setHandler( class="keyword">new HelloWorldServerHandler() );
-
-
- acceptor.getSessionConfig().setReadBufferSize( class="number">2048 );
- acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, class="number">10 );
-
-
- acceptor.bind( class="keyword">new InetSocketAddress(PORT) );
- }
- }
Handler代码如下:
package com.androidwhy.mina.helloworld.server;
- class="keyword">import org.apache.mina.core.service.IoHandlerAdapter;
- class="keyword">import org.apache.mina.core.session.IdleStatus;
- class="keyword">import org.apache.mina.core.session.IoSession;
-
- public class="keyword">class HelloWorldServerHandler extends IoHandlerAdapter
- {
- class="comment">/**
- class="comment"> * Trap exceptions.
- class="comment"> */
- class="annotation">@Override
- class="keyword">public class="keyword">void exceptionCaught( IoSession session, Throwable cause ) class="keyword">throws Exception
- {
- cause.printStackTrace();
- }
-
- class="comment">/**
- class="comment"> * If the message is ‘quit‘, we exit by closing the session. Otherwise,
- class="comment"> * we return the message.
- class="comment"> */
- class="annotation">@Override
- class="keyword">public class="keyword">void messageReceived( IoSession session, Object message ) class="keyword">throws Exception
- {
- String str = message.toString();
-
- if( str.trim().equalsIgnoreCase( class="string">"quit") ) {
- class="comment">// "Quit" ? let‘s get out ...
- session.close( class="keyword">true);
- class="keyword">return;
- }
-
- System.out.println( class="string">"Received message:"+str);
-
-
- String helloWorld = class="string">"Hello, I am Server!";
- session.write(helloWorld);
- System.out.println( class="string">"Message written...");
- }
-
- class="comment">/**
- class="comment"> * On idle, we just write a message on the console
- class="comment"> */
- class="annotation">@Override
- class="keyword">public class="keyword">void sessionIdle( IoSession session, IdleStatus status ) class="keyword">throws Exception
- {
- System.out.println( class="string">"IDLE " + session.getIdleCount( status ));
- }
- }
你会发现,使用Mina写一个Server就是如此之简单!上面的MinaTimeServer主是建立一个监听在8888端口(建议使用大于1024的端口号,因为1024以下的是系统保留的)服务,并设置了一个日志filter与一个编码的filter;HelloWorldServerHandler对handler的各位状态进行了处理,在这里最为主要的就是override了messageReceived方法,并在其中处理我们的业务逻辑。
四,运行程序
到目前为止,我们只是写了一个Server,那程序怎么跑呢?客户端就暂时采用Telnet吧!
五,总结
我只想说一句:任何开源框架的入门都是如此的Easy,Mina也一样。
Mina入门:mina版之HelloWorld,布布扣,bubuko.com