mina框架学习

2022-07-22 16:04:29 浏览数 (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、服务端

代码语言:javascript复制
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、客户端

代码语言:javascript复制
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();
		
	}
	
}
代码语言:javascript复制
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.cn/125896.html原文链接:https://javaforall.cn

0 人点赞