1.IOFilter
对应用程序和网络的传输,就是二进制数据和对象之间的转换,有相应的解码和编码器。这也是过滤器的一种,还可以做日志、消息确认等功能。
2.IOFilter类图
是在应用层和业务层之间的过滤层
3.完成自定义的过滤器
就是在往Handler处理之前,需要调用相应的过滤器进行过滤。
Client:业务Handler之前会调用过滤器。
server:同样在接收到数据和发送数据的时候会调用过滤器,然后再交给我们的Handler.
public class MyServerFilter extends IoFilterAdapter{
@Override
public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
System.out.println("MyServerFilter->messageReceived");
nextFilter.messageReceived(session, message);
}
@Override
public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
System.out.println("MyServerFilter->messageSent");
nextFilter.messageSent(session, writeRequest);
}
}
public class MyClientFilter extends IoFilterAdapter{
@Override
public void messageReceived(NextFilter nextFilter, IoSession session, Object message) throws Exception {
System.out.println("MyClientFilter->messageReceived");
nextFilter.messageReceived(session, message);
}
@Override
public void messageSent(NextFilter nextFilter, IoSession session, WriteRequest writeRequest) throws Exception {
System.out.println("MyClientFilter->messageSent");
nextFilter.messageSent(session, writeRequest);
}
}
public class MinaServer {
static int port = 7080;
static IoAcceptor accept = null;
public static void main(String[] args) {
try{
accept = new NioSocketAcceptor();
//设置编码过滤器
accept.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(),
LineDelimiter.WINDOWS.getValue())));
accept.getFilterChain().addFirst("filter", new MyServerFilter());
//设置缓冲区的大小
accept.getSessionConfig().setReadBufferSize(1024);
//设置空闲时间
accept.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
//设置Handler,真正处理的类
accept.setHandler(new MyHandler());
//绑定端口号
accept.bind(new InetSocketAddress(port));
//监听
System.out.println("Server->"+port);
}catch(Exception e){
e.printStackTrace();
}
}
}
public class MinaClient {
private static IoSession session = null;
private static String host = "127.0.0.1";//ip地址
private static int port = 7080;//端口号
public static void main(String[] args) {
IoConnector connector = new NioSocketConnector();
//设置超时时间
connector.setConnectTimeout(3000);
//设置过滤器
connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(
new TextLineCodecFactory(
Charset.forName("UTF-8"),
LineDelimiter.WINDOWS.getValue(), //编码器
LineDelimiter.WINDOWS.getValue())));//解码器
connector.getFilterChain().addFirst("filter", new MyClientFilter());
//设置处理类
connector.setHandler(new MyClientHandler());
//绑定地址
ConnectFuture future = connector.connect(new InetSocketAddress(host, port));
future.awaitUninterruptibly();//等待我们的连接
session = future.getSession();
session.write("你好,服务端");
session.getCloseFuture().awaitUninterruptibly();//等待关闭连接
connector.dispose();
}
}
运行: