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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • NestedScrollView+Viewpager+Recycleview的滑动冲突

    NestedScrollView+Viewpager+Recycleview的滑动冲突最新业务需求变化 一个页面多个 Recycleview Viewpager viewpager 实现左右滑动 且可以手动滑动 页面逻辑简单 就是数据比较大 最初的时候实现有滑动冲突 后边使用 NestedScroll 可以实现滑动 但是 Viewpager 不能实现手动滑动 Recycleview 的 item 事件冲突 这个只在华为 7 0 手机上出现 华为 8 0 及三星手机上未发现问题 网上也是各种找 后边看

    2025年7月3日
    2
  • 木马编程参考[通俗易懂]

    木马编程参考[通俗易懂]参考链接:木马入门渗透之木马基础篇

    2022年6月16日
    42
  • OSError: cannot write mode RGBA as JPEG

    OSError: cannot write mode RGBA as JPEG原代码captcha.save(‘code.jpg’)原因:RGBA意思是红色,绿色,蓝色,Alpha的色彩空间,Alpha指透明度。而JPG不支持透明度,所以要么丢弃Alpha,要么保存为.png文件解决方法一captcha=captcha.convert(‘RGB’)captcha.save(‘code.jpg’)方法二captcha.save(‘code.png’)…

    2022年6月24日
    34
  • 程序员必须了解的知识点——你搞懂mysql索引机制了吗?

    程序员必须了解的知识点——你搞懂mysql索引机制了吗?

    2020年11月20日
    315
  • 大型活动大规模人群的识别和疏散:从公交2.0到公交3.0

    大型活动大规模人群的识别和疏散:从公交2.0到公交3.01关于数据本文中所使用到的数据包括,交通卡、交通事故、出租车轨迹、公交车运行、地铁运行、空气质量、气象监测、新浪微博等12个数据集近TB量级的数据。2关于我们我们希望通过应用交通数据以解决大型活动(如演唱会、足球比赛、跨年活动等)结束后大规模人群滞留导致的疏散困难、交通拥堵、事故隐患等一系列问题(如外滩踩踏事件)。在此基础上我们提出“公交3.0”的绿色出行概念,核心包括以下三点:…

    2022年7月16日
    13
  • Mysql中的关联查询(内连接,外连接,自连接)

    Mysql中的关联查询(内连接,外连接,自连接)在使用数据库查询语句时,单表的查询有时候不能满足项目的业务需求,在项目开发过程中,有很多需求都是要涉及到多表的连接查询,总结一下mysql中的多表关联查询一,内连接查询是指所有查询出的结果都是能够在连接的表中有对应记录的。以t_employee(员工表)和t_dept(部门表)为例:t_employee表中的记录如下:dept代表该员工所在的部门t_dept表中记录

    2022年5月24日
    28

发表回复

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

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