Mina学习笔记(一) 简单服务端实例

Mina是基于java nio实现的一套方便开发高性能远程通信程序的框架。

官方学习文档:https://mina.apache.org/mina-project/userguide/user-guide-toc.html


下面是实例一:简单服务端实例 

程序功能:将客户端发送过来的消息打印出来, 并将当前时间发送回客户端


首先新建项目,并加入Mina依赖  (本人创建的maven项目,如果不是maven项目,就去Mina官网下载相应的jar包)

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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>mina</groupId>
  <artifactId>mina-test</artifactId>
  <packaging>jar</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>mina-test</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <scope>test</scope>
    </dependency>
	<dependency>
		<groupId>org.apache.mina</groupId>
		<artifactId>mina-core</artifactId>
		<version>2.0.7</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-api</artifactId>
		<version>1.7.6</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.6</version>
	</dependency>
  </dependencies>
</project>


接下来是服务端主程序

package com.zf.mina.test01;

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.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MinaTimeServer {
	
	public static void main(String[] args) throws IOException {
		
		//使用IoAcceptor来接收客户端的请求
		IoAcceptor acceptor = new NioSocketAcceptor() ;
		//加入内置的LoggingFilter,用户打印出一个请求过程中的信息
		acceptor.getFilterChain().addLast("logger", new LoggingFilter()) ;
		//使用Mina提供的ProtocolCodecFilter来对消息进行编码和解码,使用Mina提供的TextLineCodecFactory对消息进行分行处理
		acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
		//设置消息处理器,当接收到消息时,可以进行相应的业务操作
		acceptor.setHandler(new TimeServerHandler()) ;
		//配置Buffer大小
		acceptor.getSessionConfig().setReadBufferSize(2048); 
		//如果Session在指定时间内没有事情做(读/写),那么就会触发Handler的sessionIdle方法
		acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10) ;
		//绑定好要监听的端口
		acceptor.bind(new InetSocketAddress(8080)) ;
		
		
	}

}


消息处理器

package com.zf.mina.test01;

import java.util.Date;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;

/**
 * Server端的消息处理器
 * @author Administrator
 *
 */
public class TimeServerHandler extends IoHandlerAdapter{

	/**
	 * 当通信出现异常时会触发该方法
	 */
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		cause.printStackTrace() ;
	}
	
	/**
	 * 当接收到客户端发来的消息时,此方法会被触发
	 */
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		String msg = message.toString() ; //获取客户端发来的消息
		if(msg.trim().equalsIgnoreCase("quit")){
			session.close(false) ;
			System.out.println("Session closed");
			return ;
		}
		System.out.println("收到客户端消息:" + msg);
		Date date = new Date() ;
		session.write(date.toLocaleString()	) ; //将消息发送给客户端
		System.out.println("Message wittern...");
	}
	
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		System.out.println("IDLE " + session.getIdleCount(status) );  
	}
	
}


此时服务端程序就编写完成了。 现在可以启动MinaTimeServer类了 。

然后打开命令行工具,输入如下命令:

telnet localhost 8080 

然后就可以输入内容了。 随便输入什么内容。 会看到会将客户端输入的内容输出, 并且在客户端会打印出当前系统时间



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章