Apache MINA框架「建议收藏」

ApacheMINA(MultipurposeInfrastructureforNetworkApplications)是Apache组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的MINA版本支持基于JavaNIO技术的TCP/UDP应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA所支持的功能也在进一步的扩展

大家好,又见面了,我是你们的朋友全栈君。

          Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。目前正在使用 MINA 的软件包括有:Apache Directory Project、AsyncWeb、AMQP(Advanced Message Queuing Protocol)、RED5 Server(Macromedia Flash Media RTMP)、ObjectRADIUS、Openfire 等等。

       MINA的几个重要接口:

IoServiece :这个接口在一个线程上负责套接字的建立,拥有自己的 Selector,监听是否有连接被建立。
IoProcessor :这个接口在另一个线程上负责检查是否有数据在通道上读写,也就是说它也拥有自己的 Selector,这是与我们使用 JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个 Selector,也就是不区分 IoService与 IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在 IoService 上的过滤器,并在过滤器链之后调用 IoHandler。  
IoAccepter :相当于网络应用程序中的服务器端,它继承自IoServiece,并进行了扩展。
IoConnector :相当于客户端,它继承自IoServiece,并进行了扩展。
IoSession :当前客户端到服务器端的一个连接实例。
IoHandler :这个接口负责编写业务逻辑,也就是接收、发送数据的地方。这也是实际开发过程中需要用户自己编写的部分代码。
IoFilter :过滤器用于悬接通讯层接口与业务层接口,这个接口定义一组拦截器,这些拦截器可以包括日志输出、黑名单过滤、数据的编码(write 方向)与解码(read 方向)等功能,其中数据的 encode与 decode是最为重要的、也是你在使用 Mina时最主要关注的地方。

        MINA的基础架构图:

Apache MINA框架「建议收藏」

下面是使用Mina实现TCP的一个小例子:

TCPServer.java

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;

/**
 * @description:Mina 实现TcpServer
 * @date:(2015-11-22 下午3:46:23)
 * @author
 * @version v1.0
 * @since v1.0
 * 
 *        Modified history
 * 
 *        Modified date: Modifier user: description:
 * 
 * */
public class TcpServer{

	public static void main(String[] args) throws IOException {
		
		IoAcceptor acceptor=new NioSocketAcceptor();
		//设置缓冲区大小
		acceptor.getSessionConfig().setReadBufferSize(2048);
		//设置通道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())));
		//设置业务处理逻辑
		acceptor.setHandler(new MyIOHandler());
		acceptor.bind(new InetSocketAddress(9123));
	
	}

}

MyIOHandler.java

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

/**
 * @description:主要是一些业务逻辑,如发送,接收消息
 * @date:(2015-11-24 上午9:37:02)
 * @author Administrator
 * @version v1.0
 * @since v1.0
 *
 * Modified history
 *
 *    Modified date:  
 *    Modifier user:     
 *    description: 
 *
 * */
public class MyIOHandler extends IoHandlerAdapter{
	
	/**
	 * 当有异常发生时触发
	 * */
	@Override
	public void exceptionCaught(IoSession session, Throwable cause)
			throws Exception {
		
		super.exceptionCaught(session, cause);
		session.close(true);
	}
	
	/**
	 * 有新连接是触发
	 * */
	@Override
	public void sessionOpened(IoSession iosession) throws Exception {
		
		 System.out.println("session open for " + iosession.getRemoteAddress());
	}
	
	/**
	 * 连接被关闭是触发
	 * */
	@Override
	public void sessionClosed(IoSession iosession) throws Exception {
		
		 System.out.println("session closed from " + iosession.getRemoteAddress());
	}
	
	/**
	 * 收到来自客户端的消息
	 */
	@Override
	public void messageReceived(IoSession iosession, Object message)
			throws Exception {
		
		String str=message.toString();
		System.out.println("The message received is [" + str + "]");
		if(str.endsWith("quit")){
			iosession.close(true);
		}
		
	}

}

启动服务,在dos窗口中telnet 127.0.0.1 9123

输入:Helllo,MINA.

控制台将输出:

session open for /127.0.0.1:55344
The message received is [hello MINA]

Mina实现TCP客户端:

MyCient.java

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoConnector;
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.NioSocketConnector;

/**
 * @description:MINA 实现TCP 客户端
 * @date:(2015-11-24 下午10:06:43)
 * @author Administrator
 * @version v1.0
 * @since v1.0
 *
 * Modified history
 *
 *    Modified date:  
 *    Modifier user:     
 *    description: 
 *
 * */
public class MyCient {
	
	public static void main(String[] args) {
		
		IoConnector connector=new NioSocketConnector();
		connector.setConnectTimeoutMillis(30000);
		connector.getFilterChain().addLast("codec", 
				new ProtocolCodecFilter(
						new TextLineCodecFactory(Charset.forName("UTF-8"),
						LineDelimiter.WINDOWS.getValue(),
						LineDelimiter.WINDOWS.getValue())));
		connector.setHandler(new ClientHandler("你好!\r\n 大家好!"));
		connector.connect(new InetSocketAddress("127.0.0.1", 9123));
		
	}

}

ClientHandler.java

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

/**
 * @description
 * @date:(2015-11-24 下午10:14:04)
 * @author Administrator
 * @version v1.0
 * @since v1.0
 *
 * Modified history
 *
 *    Modified date:  
 *    Modifier user:     
 *    description: 
 *
 * */
public class ClientHandler extends IoHandlerAdapter{
	
	private String values;
	
	public ClientHandler(String values){
		this.values=values;
	}
	
	@Override
	public void sessionOpened(IoSession session) throws Exception {
		session.write(values);
	}

}

运行TCPServer,java,MyClient.java

server端控制台输出:

session open for /127.0.0.1:56992
The message received is [你好!]
The message received is [ 大家好!]

参考文档:

http://www.ibm.com/developerworks/cn/opensource/os-cn-apmina/

http://www.cnblogs.com/xuekyo/archive/2013/03/06/2945826.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/127745.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • R 笔记 prophet[通俗易懂]

    R 笔记 prophet[通俗易懂]0理论部分论文笔记:ForecastingatScale(Prophet)_UQI-LIUWJ的博客-CSDN博客Prophet是一种基于加法模型预测时间序列数据的程序,其中非线性趋势、季节性以及假日效应相匹配。它最适用于具有强烈季节性和有几个季节历史数据的时间序列。Prophet对缺失数据和趋势变化具有鲁棒性,并且通常可以很好地处理异常值。…

  • ASDFASDF

    ASDFASDFASDFASDF

  • 阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题@林[通俗易懂]

    阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题@林[通俗易懂]阿里云轻量应用型服务器防火墙端口开放了还是无法访问问题登录阿里云找到防火墙远程连接服务器,开启防火墙对应端口这里我用的是FinalShell,当然这个远程连接的软件可以不同,只要能远程连接上服务器就行;(1)查看防火墙状态(dead状态,防火墙未开启;active状态,即防火墙开启)systemctlstatusfirewalld(2)防火墙未开启,开启防火墙(防火墙开启后记得再查看防火墙状态)systemctlstartfirewalld(3)查看开放端口列表f

  • zencart包包模板

    zencart包包模板很适合包包,鞋子的一款模板,该zencart模板为成品网站该网站的zencart版本为zencart1.3.9h该安装的常用插件有:1、ultimateseourls2、CSS/JSLoader3、JQzoom放大镜4、RSSFeed5、FastandEasyCheckout6、ImageHandler37、EasyPop

  • 学生选课管理系统的数据库设计_选课系统数据库设计

    学生选课管理系统的数据库设计_选课系统数据库设计学生选课管理系统的设计为选课及成绩管理提供了一个良好的工具,此系统基本实现了设计的要求,即登录系统(通过用户名和密码),管理(录入、查询、修改和删除)学生、课程基本资料,管理(录入、查询、修改和删除)学生所选课程成绩,统计每个学生的总分、平均分以及排名,修改用户密码等功能。在此基础上,我还对系统进行了改进,特别是加强了查询的功能,使我们能更直观、有效地查询到我们想要的数据。

    2022年10月15日
  • 显示搜索dota2协调服务器,老司机教你处理搜索dota2游戏协调服务器中【操作流程】…[通俗易懂]

    显示搜索dota2协调服务器,老司机教你处理搜索dota2游戏协调服务器中【操作流程】…[通俗易懂]win7系统有很多人都喜欢使用,我们操作的过程中常常会碰到win7系统搜索dota2游戏协调服务器中的问题。如果遇到win7系统搜索dota2游戏协调服务器中的问题该怎么办呢?很多电脑水平薄弱的网友不知道win7系统搜索dota2游戏协调服务器中究竟该怎么解决?其实不难根据下面的操作步骤就可以解决问题1:DOTA2服务器蹦了之后,进入DOTA2,发现最顶端先是提示:“搜索DOTA2协调服务器中…”…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号