mina框架学习

 

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

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值