mina框架学习

  一、mina简介    mina框架是对nio进行的一个封装,可用于java的网络编程,包括TCP/IP和UTP/IP编程,主要屏蔽了网络通信的一些细节,对socket进行封装,并且是用nio的一个实现框架,mina的主要类如下: 1、IoService接口用于描述客户端和服务端的接口,子类有IoConnector(客户端)和IoAcceptor(服务端)。1….

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

 

 一、mina简介   

 

  mina框架是对nio进行的一个封装,可用于java的网络编程,包括TCP/IP和UTP/IP编程,主要屏蔽了网络通信的一些细节,对socket进行封装,并且是用nio的一个实现框架,mina的主要类如下:

 

1、IoService接口

用于描述客户端和服务端的接口,子类有IoConnector(客户端)和IoAcceptor(服务端)。

1.1 IoConnector接口

该接口用于描述客户端,链接远程服务端,实现类是NioSocketConnector。

  1.  NioSocketConnector

该类具体实现了链接远程网络的方法。

1.2 IoAcceptor接口

该接口定义了作为服务端 要干的事情,具体实现类是NioSocketAcceptor。

  1.  NioSocketAcceptor

该类具体实现了监听远程发送过来的链接后的各种操作。

2、IoProceser

多线程环境来处理我们的链接请求流程。

3、IoFilter

提供数据的过滤工作,包括编码和解码、日志等信息的过滤。

4、Hanlder

处理具体的业务对象,默认的实现类有IoHanlderAcceptor,自定义的业务处理类,需要继承IoHanlderAcceptor类。

5、IoSession

描述客户端和服务端建立链接的会话,通过该会话,可接收和发送信息。

6、流程总结

客户端:IoConnector—>IoProcessor–>IoFilter—>Hanlder,

服务端:IoConnector—>IoProcessor–>IoFilter—>Hanlder。

 

二、简单的客户端和服务端实例

1、服务端

package mina.demo1;

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.service.IoHandlerAdapter;
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;

/**
* @author:zhangfd
* @version:1.0 
* @date:2017年12月9日 下午10:32:41
* @description:
*/
public class MinaServer {

	public static int port=3333;
	
	private static IoAcceptor server = null;
	
	public static void main(String[] args) throws IOException {
		
		//1、创建服务器
		server = new NioSocketAcceptor();
		
		//2、设置编码过滤器
		server.getFilterChain().addLast("codec", 
				new ProtocolCodecFilter(
				new TextLineCodecFactory(
				Charset.forName("utf-8"),
				LineDelimiter.WINDOWS.getValue(),
				LineDelimiter.WINDOWS.getValue())));
		
		//3、设置一次读取数据的大小
		server.getSessionConfig().setReadBufferSize(1024);
		//4、设置网络闲置时间
		server.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1000);
		//5、处理具体的业务信息
		server.setHandler(new MyIoHandlerAdapterServer());
		//6、绑定对本地端口的监听
		server.bind(new InetSocketAddress(port));
		
	}
	
}

总结:创建服务端步骤:

  1. 创建NioSocketAcceptor对象,

NioSocketAcceptor server = new NioSocketAcceptor();

2、设置编码、解码处理器链。

server.getFilterChain().addLast(处理器名, ProtocolCodecFilter对象)

(ProtocolCodecFilter对象的创建需要编码和解码器)

解码器类一般继承CumulativeProtocolDecoder

编码器类一般继承ProtocolEncoderAdapter

3、设置网络闲置时间

server.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 1000);

4、处理具体的业务信息

server.setHandler(new MyIoHandlerAdapterServer());

MyIoHandlerAdapterServer需要继承IoHandler类

5、绑定对本地端口的监听

server.bind(new InetSocketAddress(port));

2、客户端

package mina.demo2;

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

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.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
* @author:zhangfd
* @version:1.0 
* @date:2017年12月10日 下午2:06:44
* @description:
*/
public class MinaClinet {

	static int port=3333;
	static String ip="localhost";
	private static IoConnector client = null ;
	static IoSession ioSession = null;
	public static void main(String[] args) {
		//1、创建客户端对象
		client = new NioSocketConnector();
		//2、设置编码过滤器
		client.getFilterChain().addLast("coderc",
				new ProtocolCodecFilter(
				new TextLineCodecFactory(
				Charset.forName("utf-8"),
				LineDelimiter.WINDOWS.getValue(),
				LineDelimiter.WINDOWS.getValue())));
		//3、处理具体的业务
		client.setHandler(new MyIoHandlerAdapterClient());
		//4、设置链接超时时间
		client.setConnectTimeoutMillis(3000);
		//5、链接远程网络
		ConnectFuture  conncetFuture = client.connect(new InetSocketAddress(ip, port));
		//6、等到链接
		conncetFuture = conncetFuture.awaitUninterruptibly();
		//7、获取当前链接远程会话
		ioSession = conncetFuture.getSession();
		//8、客户端发出消息
		ioSession.write("客户端发出消息:你好,服务端");
		//9、等待关闭会话
		ioSession.getCloseFuture().awaitUninterruptibly();
		//10、关闭客户端
		client.dispose();
		
	}
	
}

package mina.demo2;

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

/**
* @author:zhangfd
* @version:1.0 
* @date:2017年12月9日 下午10:54:56
* @description:
*/
public class MyIoHandlerAdapterClient extends IoHandlerAdapter{

	@Override
	public void sessionCreated(IoSession session) throws Exception {
		System.out.println("sessionCreated");
	}

	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("sessionOpened");

	}

	@Override
	public void sessionClosed(IoSession session) throws Exception {
		// TODO Auto-generated method stub
		super.sessionClosed(session);
	}

	@Override
	public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
		System.out.println("sessionIdle");

	}

	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		
		//接收来自服务端的消息
		String msg = (String) message;
		System.out.println("接收到来自服务端的消息为:"+msg);
		
		//接收完后给客户端提供反馈消息
		/*String s = "Thank you ,we had received your message";
		session.write(s);*/
	}

	@Override
	public void messageSent(IoSession session, Object message) throws Exception {
		String msg = (String) message;
		System.out.println("发送出去的信息为:"+msg);
	}

	
	
}

步骤:

1、创建NioSocketConnector对象

//创建客户端对象

NioSocketConnector  client = new NioSocketConnector();

2、//设置编码过滤器

client.getFilterChain().addLast(处理器名, ProtocolCodecFilter对象)

(ProtocolCodecFilter对象的创建需要编码和解码器)

解码器类一般继承CumulativeProtocolDecoder

编码器类一般继承ProtocolEncoderAdapter

3、//处理具体的业务

client.setHandler(new MyIoHandlerAdapterClient());

4、//设置链接超时时间

client.setConnectTimeoutMillis(3000);

5、//链接远程网络

ConnectFuture  conncetFuture = client.connect(new InetSocketAddress(ip, port));

6、//等到链接

conncetFuture = conncetFuture.awaitUninterruptibly();

7、//获取当前链接远程会话

IoSession ioSession = conncetFuture.getSession();

8、//客户端发出消息

ioSession.write(“客户端发出消息:你好,服务端“);

9、//等待关闭会话

ioSession.getCloseFuture().awaitUninterruptibly();

10、//关闭客户端

client.dispose();

 

三、实际项目上的使用

在真实的项目中,经常拿mina与spring结合一起使用。

 

 

 

 

 

 

 

 

 

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/125896.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Win7与debian6搭建双系统(手动修复启动项)[通俗易懂]

    Win7与debian6搭建双系统(手动修复启动项)[通俗易懂]因为实验需要,要在一台机器上搭建win7和debian6的双系统。下面记录一下系统搭建过程。1.安装Windows764位版。一切按照默认选项进行安装,系统安装在第一个分区。2.进入windows7系统,使用分区工具在磁盘的尾部分出两个FAT32分区(这里为D和E),其中D盘为linux安装分区,E盘将作为swap分区。3.用光盘或者U盘安装debian6.0.5,在选

    2022年10月18日
  • 数字信号处理课程实验报告(数字信号处理需要什么基础)

    问题重述 DSP课程实验计算机模拟产生多频率信号:编写通用的FFT子程序 设置参数,对信号进行频谱分析 对信号分别以满足和不满足奈奎斯特采样定理的采样率进行采样,观察其频谱变化 设计低通、高通、带通和带阻滤波器,对多频率信号进行滤波处理 撰写实验报告,内容包括实验步骤、流程图、源程序、设置参数、输出结果(图)、结果分析(结合原理)例如:模拟信号:用一个FFT处理…

    2022年4月15日
  • Pycharm Pro 2021.12.13激活【2021.10最新】「建议收藏」

    (Pycharm Pro 2021.12.13激活)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~00…

    2022年3月30日
  • 【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解「建议收藏」

    【STM32】HAL库 STM32CubeMX教程四—UART串口通信详解「建议收藏」前言:今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用所用工具:1、芯片:STM32F407ZET62、STM32CubeMx软件3、IDE:M…

    2022年7月20日
  • sublime Text3配置及快捷键、插件推荐总结

    sublime Text3配置及快捷键、插件推荐总结

    2021年11月29日
  • mysql查询语句select-(null,not null,is null和is not null)

    mysql查询语句select-(null,not null,is null和is not null)1一些概念  1.1null与notnull  null和notnull是mysql的字段属性,或称为数据类型的属性,不属于任何类型。null值也不等同于空值,空值是不占用存储空间的,null占用存储空间,如对myisam表占用1bit额外存储空间。  1.2isnull与isnotnull  isnull和isnotnull是mysq

    2022年6月1日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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