`

Mina 框架源码解析-构建简单通信程序

 
阅读更多

Mina 框架源码解析-启动一个服务端程序

本文描述是使用mina框架构建一个简单通信程序,实现效果是客户端会定时向服务端发送一个数据包,服务端进行接收,并返回一个数据包,可以理解为一个心跳机制。

 

1,先写一个心跳包Bean类

package cn.std.services.server.heartbeat;

import java.io.Serializable;

/***
 * HeartBeat Package,this package will be sent to the HeartBeat Server,
 * and the HeartBeat Server will analyse the package
 * @author root
 * @Date 2012-8-8下午2:20:00
 */
public class HeartBeat implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 7967977427115512657L;

	/** from */
	private String from;
	/** to */
	private String to;
	/** isAlive */
	private boolean isAlive;
	/** level */
	private int level;
	

	public HeartBeat(){}
	public HeartBeat(String from, String to, boolean isAlive, int level) {
		this.from = from;
		this.to = to;
		this.isAlive = isAlive;
		this.level = level;
	}
	public String getFrom() {
		return from;
	}
	public void setFrom(String from) {
		this.from = from;
	}
	public String getTo() {
		return to;
	}
	public void setTo(String to) {
		this.to = to;
	}
	public boolean isAlive() {
		return isAlive;
	}
	public void setAlive(boolean isAlive) {
		this.isAlive = isAlive;
	}
	public int getLevel() {
		return level;
	}
	public void setLevel(int level) {
		this.level = level;
	}
	
}

 

2,服务端类

package cn.std.services.server.heartbeat;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

import cn.std.services.server.ServerManager;

import com.mine.BigMap;
import com.mine.logging.LogUtil;

public class HeartBeatServer extends Thread {
	private static LogUtil logger = LogUtil.getLogger(HeartBeatServer.class
			.getName());

	private int PORT = 0;

	public HeartBeatServer(int port) {
		this.PORT = port;
	}

	@Override
	public void run() {
		run(PORT);
	}

	private boolean run(int port) {
		boolean flag = false;
		IoAcceptor acceptor = null;
		try {
			// 创建一个非阻塞的server端的Socket
			acceptor = new NioSocketAcceptor();
			// 设置过滤器
			DefaultIoFilterChainBuilder filterChain = acceptor.getFilterChain();
			filterChain.addLast(
					"HeartBeatServer",
					new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
			// 设置读取数据的缓冲区大小
			acceptor.getSessionConfig().setReadBufferSize(2048);
			// 读写通道100秒内无操作进入空闲状态
			acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 100);
			// 绑定逻辑处理器
			acceptor.setHandler(new HeartBeatServerHandler());
			// 绑定端口
			acceptor.bind(new InetSocketAddress(port));
			flag = true;
			logger.info("HeartBeatServer-{} is Started!!!!",PORT,BigMap.port_used.size());
			BigMap.port_used.put(PORT, acceptor);
		} catch (Exception e) {
			logger.warning("服务端启动异常...." + e.getMessage());
			e.printStackTrace();
		}
		return flag;
	}
	public static void main(String[] args) {
		int port = 6002;
		new HeartBeatServer(port).start();
	}
}

 

3,服务端Handle类

package cn.std.services.server.heartbeat;

import java.net.InetAddress;

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

import com.mine.logging.LogUtil;
import com.mine.logging.LogUtil2;

public class HeartBeatServerHandler extends IoHandlerAdapter {
	public static LogUtil logger = LogUtil.getLogger(HeartBeatServerHandler.class.getName());
	@Override
	public void sessionCreated(IoSession session) throws Exception {
		logger.debug("服务端与客户端创建连接...");
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		logger.debug("服务端与客户端连接打开...");
	}

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		if(message instanceof HeartBeat){
			HeartBeat hb = (HeartBeat)message;
			String from = hb.getFrom();
			boolean isAlive = hb.isAlive();
			int level = hb.getLevel();
			String to = hb.getTo();
			System.out.println(from+"\t"+isAlive+"\t"+Integer.toHexString(level)+"\t"+to);
			//level == 0,关闭client
			if(level==0){
				session.close(true);
			}else{
				//analyse()
				hb.setTo(hb.getFrom());
				hb.setFrom(InetAddress.getLocalHost().toString());
				hb.setLevel(0x1011);
				hb.setAlive(true);
				session.write(hb);
			//	session.close(true);
			}
		}else{
			System.out.println("date error ...");
		}
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		session.close(true);
		logger.debug("服务端发送信息成功...");
	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status)
			throws Exception {
		logger.debug("服务端进入空闲状态...");
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		logger.warning("服务端发送异常..."+cause.getMessage());	}
}

 

4,客户端类

package cn.std.services.client.heartbeat;

import java.net.InetAddress;
import java.net.InetSocketAddress;

import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import cn.std.services.server.ServerManager;
import cn.std.services.server.heartbeat.HeartBeat;

import com.mine.logging.LogUtil;

public class HeartBeatClient implements Runnable {
	private static LogUtil logger = LogUtil.getLogger(HeartBeatClient.class
			.getName());

	/** Master Host 默认 localhost */
	private  String HOST ;
	/** Master Port 默认 6002 */
	private  int PORT ;
	/** 心跳频率 默认10s */
	private  int HeartBeatMills;

	private boolean isRun = true;
	public HeartBeatClient() {
               HOST = "127.0.0.1";
               PORT = 6002;
               HeartBeatMills = 100000;
               // HOST = ServerManager.props.getProperty("MasterHost","127.0.0.1");
	       // PORT = Integer.parseInt(ServerManager.props.getProperty("HeartBeatServerPort","6002"));
	       // HeartBeatMills = Integer.parseInt(ServerManager.props.getProperty("HeartBeatMills", "10000"));
	}

	public static void main(String[] args) {
	//	List<String> ls = Lists.load(ServerManager.props.getProperty("MasterHost"));
	//	System.out.println(ls.size());
		for (int i = 0; i < 1; i++) {
			new Thread(new HeartBeatClient()).start();
		}
	
	}

	@Override
	public void run() {
		while(isRun){
			sent();
			try {
				Thread.currentThread();
				Thread.sleep(HeartBeatMills);
				logger.info("system will call sent method...");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public void stop(){
		isRun = false;
	}
	public void sent() {
		// 创建一个非阻塞的客户端程序
		IoConnector connector = new NioSocketConnector();
		// 设置链接超时时间
		connector.setConnectTimeoutMillis(30000);
		// 添加过滤器
		connector.getFilterChain().addLast("HeartBeatClient",
				new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
		// 添加业务逻辑处理器类
		connector.setHandler(new HeartBeatClientHandler());
		IoSession session = null;
		try {
			ConnectFuture future = connector.connect(new InetSocketAddress(
					HOST, PORT));// 创建连接
			future.awaitUninterruptibly();// 等待连接创建完成
			session = future.getSession();// 获得session
			for (int i = 0; i < 1; i++) {
				HeartBeat hb = new HeartBeat(InetAddress.getLocalHost()
						.toString(), HOST, true, 0x0101);
				session.write(hb);
			}
			 //session.close(true);
		} catch (Exception e) {
			logger.warning("客户端链接异常..." + e.getMessage());
		}

		session.getCloseFuture().awaitUninterruptibly();// 等待连接断开
		connector.dispose();
	}

	public String getHOST() {
		return HOST;
	}

	public void setHOST(String hOST) {
		HOST = hOST;
	}

	public int getPORT() {
		return PORT;
	}

	public void setPORT(int pORT) {
		PORT = pORT;
	}

	public int getHeartBeatMills() {
		return HeartBeatMills;
	}

	public void setHeartBeatMills(int heartBeatMills) {
		HeartBeatMills = heartBeatMills;
	}

}

 5,客户端Handle类

package cn.std.services.client.heartbeat;

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

import cn.std.services.server.heartbeat.HeartBeat;

import com.mine.logging.LogUtil;


public class HeartBeatClientHandler extends IoHandlerAdapter {
	private static LogUtil logger = LogUtil.getLogger(HeartBeatClientHandler.class.getName());

	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {
		if(message instanceof HeartBeat){
			HeartBeat hb = (HeartBeat)message;
			String from = hb.getFrom();
			boolean isAlive = hb.isAlive();
			int level = hb.getLevel();
			String to = hb.getTo();
			System.out.println(from+"\t"+isAlive+"\t"+Integer.toHexString(level)+"\t"+to);
			
		}else{
			System.out.println("date error ...");
		}
	}

	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		logger.warning("客户端发生异常..."+cause.getLocalizedMessage());
	}
}

先运行HeartBeartServer,然后再运行HeartBeatClient,就可看到效果,注意加入LogUtil,可自己编译LogUtil,也可在下面下载LogUtil的jar包

分享到:
评论

相关推荐

    mina-core-2.0.0-RC1

    总结起来,mina-core-2.0.0-RC1是Apache MINA框架的一个强大且成熟的版本,它提供了一套高效的网络通信工具,帮助开发者构建高性能的应用程序。无论是用于开发服务器端软件,还是客户端应用,MINA都能以其强大的功能...

    Mina2.0框架源码剖析.pdf

    Mina2.0框架源码剖析 Mina2.0是一个基于Java的网络应用框架,提供了一个简洁、灵活的API,帮助开发者快速构建高性能的网络应用程序。下面是Mina2.0框架源码剖析的相关知识点: 一、Mina2.0框架概述 Mina2.0是一个...

    Mina 2.0快速入门与源码解析

    ### Mina 2.0快速入门与源码解析 #### Mina 2.0 快速入门 Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得...

    ftpserver mina框架,适合学习

    6. **源码阅读**:通过阅读Apache Mina FTPServer的源码,可以深入理解FTP协议的实现细节,以及Mina框架如何处理网络通信。 7. **实战项目**:创建一个简单的FTP服务器并进行测试,实践是检验理论的最好方式。你...

    Mina源码解析

    Apache Mina是一个开源的网络通信框架,主要用于构建高性能、高可用性的网络应用程序。它提供了高度模块化的设计,允许开发者以简单的方式处理各种网络协议,如TCP/IP、UDP/IP以及SSL/TLS等。在深入解析Mina源码的...

    mina-2.0.0-M6.zip

    Apache MINA是一个开源框架,主要用于构建高性能、高可用性的网络应用程序。这个“mina-2.0.0-M6.zip”压缩包包含的是Apache MINA框架的2.0.0 Milestone 6版本,这是一个预发布版本,用于在正式版本发布前进行测试和...

    apache-mina-2.1.3所有jar和源文件.7z

    1. **Mina Core**:这是MINA框架的基础,提供了基本的网络通信功能,如Socket和Datagram通信,以及异步事件处理。 2. **Mina Filters**:一组预定义的过滤器,如Buffer Size Encoder/Decoder,...

    基于Java的实例源码-高性能Java网络框架 MINA.zip

    MINA是一个为Java开发者设计的网络通信框架,它提供了一种简单而高效的方式来构建网络应用程序,支持TCP和UDP协议。MINA的核心特性包括: 1. **异步事件驱动模型**:MINA采用非阻塞I/O(NIO)模型,通过事件处理器...

    Mina 1.1.7 示例源码(apache.mina.example)

    在Mina 1.1.7版本中,提供的示例源码是学习和理解Mina框架工作原理及其实现各种网络协议的重要资源。这个压缩包"apache.mina.example"包含了一系列的示例项目,可以帮助开发者快速上手并深入理解Mina。 1. **Mina...

    Mina2源码分析

    通过对Mina2框架源码的初步分析,我们可以看出Mina2设计的精妙之处在于其模块化的设计思路以及对各种网络事件的高效处理。从IoService接口到具体的IoAcceptor、IoConnector、IoProcessor等组件的实现,Mina2不仅提供...

    MINA框架使用jar包(Android)

    Mina源码解析.zip和mina-example.zip可能包含了MINA的源代码分析和示例项目,对于深入学习MINA的内部工作机制和实际应用开发非常有价值。最后,apache-mina-2.0.7应该是MINA框架的主要库文件,包含了所有必需的类和...

    mina HTTP协议实例

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,它提供了高度可扩展的、高性能的网络应用程序开发工具。本文将深入探讨如何使用MINA实现HTTP协议,以及相关的源码分析和实用...

    mina框架开发全部相关jar包

    Mina框架包括服务端和客户端的抽象层,通过Filter Chain(过滤器链)机制来处理网络通信中的数据读写和事件处理。 2. **Jar包的作用**: 压缩包中的`mina相关jar包.zip`很可能包含了Mina框架的核心库和其他依赖的...

    springboot 整合mina 源码,nio通讯基础教程,mina框架基础教程.rar

    在本教程中,我们将深入探讨如何整合Spring Boot与Mina框架,同时介绍Java NIO(非阻塞I/O)的基础知识。Spring Boot以其简洁、快速的起步方式深受开发者喜爱,而Mina则是一个强大的网络通信框架,常用于构建高性能...

    MINA2项目所用JAR包

    MINA2(Java Multicast Network Application Architecture 2)是一个高性能、跨平台的网络应用程序框架,主要设计用于构建网络服务,尤其是TCP和UDP协议的应用。它提供了丰富的API和强大的功能,帮助开发者快速创建...

    MINA源码分析,内涵类的讲解

    MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。MINA的目标是让开发者能够专注于应用层的逻辑,而...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    综上,这个示例代码应该包含了如何使用MINA2构建一个基于UDP的Echo服务器,以及如何在MINA2框架下实现双向通信的详细步骤。通过学习和分析这段代码,开发者可以更好地理解和应用MINA2框架,特别是在UDP通信场景中。

    mina-2.0.4 source code

    《mina-2.0.4源码解析:深入理解Java NIO通信框架》 Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高度可扩展的、高性能的Java网络应用程序框架,主要用于构建服务器端应用。MINA...

    mina mmorpg服务端源码

    《mina mmorpg服务端源码解析》 在游戏开发领域,尤其是大型多人在线角色扮演游戏(MMORPG)的设计与实现中,服务端源码扮演着至关重要的角色。"mina mmorpg服务端源码"是一个专注于游戏服务器端开发的项目,其核心...

Global site tag (gtag.js) - Google Analytics