NIO流行框架 Mina IOFilter接口

1.IOFilter:


对应用程序和网络这块的传输,就是二进制数据和对象之间的相互转化,有相应的解码和编码器。这也是我们过滤器一种,我们队过滤器还可以做日志。消息确认等功能。
 
2.IOFilter类图:


是在应用层和我们业务层之家过滤层
 
3.完成自定义过滤器:


就是在往handler处理之前 需要调用相应的过滤器进行过滤.
Client:业务handler之前会调用我们的过滤器

Server:同样在我们直接到数据的时候,和发送数据的时候也调用了我们的过滤器,然后才交给我们的handler。


我们来实现一个自定义的过滤器


package com.ccop;

import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteRequest;
/**
 * 自定义过滤器
 * @author lm
 *
 */
public class MyServerfilter extends IoFilterAdapter{

	@Override
	public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
		// TODO Auto-generated method stub
		super.messageReceived(nextFilter, session, message);
		System.out.println("MyfilterServer->messageReceived");
		nextFilter.messageReceived(session, message);
	}

	@Override
	public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
		// TODO Auto-generated method stub
		super.messageSent(nextFilter, session, writeRequest);
		System.out.println("MyfilterServer->messageSent");
		nextFilter.messageReceived(session, writeRequest);
		
	}

	
}

package com.ccop;

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

public class Server {


	private static int port=7080;
	static IoAcceptor accpet = null;
	
	public static void main(String[] args) throws IOException{
		accpet = new NioSocketAcceptor();
		//设置编码过滤器
		accpet.getFilterChain().addLast("codec",new ProtocolCodecFilter(
						new TextLineCodecFactory(
						Charset.forName("UTF-8"),    //编码集
						LineDelimiter.WINDOWS.getValue(), //编码器
						LineDelimiter.WINDOWS.getValue())));
		accpet.getSessionConfig().setReadBufferSize(1024);//缓存区
		accpet.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);//10毫秒进入空闲状态
		accpet.getFilterChain().addFirst("filter", new MyServerfilter());
		
		accpet.setHandler(new ServerHandler()); //具体业务层
		accpet.bind(new InetSocketAddress(port));
		System.out.println("Server-->"+port);
	}
	
}

package com.ccop;

import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.core.write.WriteRequest;

public class MyClientFilter extends IoFilterAdapter{

	@Override
	public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
		// TODO Auto-generated method stub
		super.messageReceived(nextFilter, session, message);
		System.out.println("MyClientFilter->messageReceived");
		nextFilter.messageReceived(session, message);
	}

	@Override
	public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
		// TODO Auto-generated method stub
		super.messageSent(nextFilter, session, writeRequest);
		System.out.println("MyClientFilter->messageSent");
		nextFilter.messageReceived(session, writeRequest);
		
	}
}

package com.ccop;

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;

public class client {

	private static String host = "127.0.0.1";
	private static int port=7080;
	
	public static void main(String[] args){
		
		IoSession ioSession=null;
		
		IoConnector connector = new NioSocketConnector();
		connector.setConnectTimeout(3000);
		connector.getFilterChain().addLast(
				"coderc", 
				new ProtocolCodecFilter(
				new TextLineCodecFactory(Charset.forName("UTF-8"),
				LineDelimiter.WINDOWS.getValue(),
				LineDelimiter.WINDOWS.getValue())));
		connector.getFilterChain().addFirst("filter", new MyClientFilter());
		
		connector.setHandler(new clientHandler());
		
		ConnectFuture futrue= connector.connect(new InetSocketAddress(host,port));
		futrue.awaitUninterruptibly(); //等待我的连接
		ioSession=futrue.getSession();
		ioSession.write("你好 !");
		ioSession.getCloseFuture().awaitUninterruptibly();//等待关闭连接
		
		connector.dispose();
		
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值