最近项目要用到Mina框架,就拿来学习一下:
1、通过相关资料了解到Mina大致分为三层
- IoService:用来做IO操作
- IoFilter:过滤器,做对象转换等
- IoHandler:具体业务逻辑实现
了解到层次结构及大致流程后,首先还是helloWorld搞起来,Mina能够实现服务器端和客户端,先来搞一个服务端(需求是:主要实现接收请求,然后将接收到的字符打印出来):
1、创建mina-sayhello项目,为了简单,直接采用maven project,maven不了解的同学,网上资料很多,先贴上pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hylandtec</groupId> <artifactId>mina-sayhello</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mina-sayhello</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.mina</groupId> <artifactId>mina-core</artifactId> <version>2.0.7</version> </dependency> </dependencies> </project>
2、创建IoService来接收IO处理,由于IoAcceptor继承了IoService,我们直接使用IoAcceptor:
package com.hylandtec.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
/**
* Mina 服务器端应用 IoService.
*
* @author boy
*/
public class MyServer {
//设置监听端口
private static final int SOCKET_PORT = 9999;
public static void main(String[] args) {
// 创建接收器
IoAcceptor acceptor = new NioSocketAcceptor();
// 设置缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 设置空闲时间为10秒(无操作10秒进入空闲)
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 添加过滤器,注意不同系统换行符(可采用默认)
acceptor.getFilterChain().addLast(
"codec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
try {
acceptor.bind(new InetSocketAddress(SOCKET_PORT));
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、第二步来实现我们的业务逻辑,业务逻辑相对简单
package com.hylandtec.server.handler;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* Mina测试服务端业务逻辑实现类.
* @author boy
*
*/
public class MyServerHandler extends IoHandlerAdapter{
/**
* 重写messageReceived方法,打印输出接收到的字符
*/
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String str = message.toString();
System.out.println(str);
//如果接收到的字符为quit,则关闭seeion并退出
if("quit".equals(str)) {
session.close(true);
return;
}
//super.messageReceived(session, message);
}
}
4、第三步,将handler实例添加到IoService中:
//添加业务逻辑处理
acceptor.setHandler(new MyServerHandler());
5、由于目前还没有创建客户端,所以先用telnet(TCP协议),刚才开的端口是9999,所以直接打开DOS窗口,输入:telnet localhost 9999
6、连接上之后,输入hello world 敲回车,这时候会看到控制台打印出hello world,如果敲入quit,连接会自动关闭。
--十二点了,赶紧睡觉!!!