Mina学习笔记(一)

 最近项目要用到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,连接会自动关闭。

--十二点了,赶紧睡觉!!!

 

 

你可能感兴趣的:(Mina)