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结合一起使用。

 

 

 

 

 

 

 

 

 

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

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

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

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

(0)


相关推荐

  • hashmap和hashtable和hashset的区别_反映和反应的区别

    hashmap和hashtable和hashset的区别_反映和反应的区别HashMap与Hashtable的区别是面试中经常遇到的一个问题。这个问题看似简单,但如果深究进去,也能了解到不少知识。本文对两者从来源,特性,算法等多个方面进行对比总结。力争多角度,全方位的展示二者的不同,做到此问题的终结版。作者Hashtable的作者:HashMap的作者:HashMap的作者比Hashtable的作者多了著名顶顶的并发大神DougLea。他写了util…

  • 腾讯和字节待遇_字节和腾讯哪个值得去

    腾讯和字节待遇_字节和腾讯哪个值得去分享我对两家互联网大厂的了解和主观感受大家好,我是鱼皮,最近这段时间,应该是正值大三的小伙伴最忙碌的时候,不少同学都在准备秋季校园招聘。我当时是通过暑期实习转正进入的腾讯,再加上之前也在字节跳动实习过,所以今天就分享下我对这两家互联网公司的了解和工作感受,希望能帮助大家选择,也可以给还在校园的小伙伴一些坚持的动力吧。工作感受接下来我会从多个方面来分享。由于公司很大,不同部门存在差异,所以工作感受比较主观,不代表整个公司的情况。薪资互联网公司的薪资还是挺高的。像我当时在字节跳动实习时.

  • 计算机等级二级java试题(计算机考试选择题知识点)

    第一章数据结构与算法【考点1】算法的基本概念1、算法:是指一组有穷的指令集,是解题方案的准确而完整的描述。算法不等于程序,也不等于计算方法。2、算法的基本特征:1)确定性,算法中每一步骤都必须有明确定义,不允许有多义性;2)有穷性,算法必须能在有限的时间内做完,即能在执行有限个步骤后终止;3)可行性,算法原则上能够精确地执行;4)拥有足够的情报。3、算法的组成…

  • mmse评估量表_简易精神状态评价量表(mmse量表) 打印版.doc[通俗易懂]

    简易精神状态评价量表(mmse量表)15016简易精神状态评价量表(MMSE)项目积分定向力(10分)1.今年是哪一年现在是什么季节?现在是几月份?今天是几号?今天是星期几?11111000002.你住在那个省?你住在那个县(区)?你住在那个乡(街道)?咱们现在在那个医院?咱们现在在第几层楼?1111100000记忆力(3分)3.告诉你三种东西,我说完后,请你重复一遍并记住,待会还会问你(各1分,…

  • tabnine 激活码_通用破解码

    tabnine 激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • sklearn KFold()

    最近实践过程中遇到需要KFold()记录一下,以便日后查阅KFold()在sklearn中属于model_slection模块fromsklearn.model_selectionimportKFoldKFold(n_splits=’warn’,shuffle=False,random_state=None)参数:n_splits表示划分为几块(至少是2)shuffle…

发表回复

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

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