netty4 ip过滤器的使用(可做ip黑名单处理)

netty4的ip过滤跟netty3的区别比较大。netty3的使用方法这里不介绍了,看看在netty4中怎么做ip的过滤。

从netty的文档中我们可以看到这么几个类:

https://netty.io/4.1/api/io/netty/handler/ipfilter/package-summary.html

ip过滤相关的类在 io.netty.handler.ipfilter这个包中,本质也是netty的一个handler。

这里我们主要用到两个类:ipFilterRule 、RuleBasedIpFilter

前者是ip过滤的规则,后者是一个实现类。

当然这里就不多介绍这两个类了,这两个类很简单,一看就懂,我们这里直接看怎么使用吧。

1、首先我们创建一个实体类,用来配置ip段:

public class IpRange {

	// 开始ip
	private String ipStart;

	// 结束ip
	private String ipEnd;

    //构造方法
	public IpRange(String ipStart, String ipEnd) {

		this.ipStart = ipStart;
		this.ipEnd = ipEnd;
	}

	public String getIpStart() {

		return ipStart;
	}

	public String getIpEnd() {

		return ipEnd;
	}

}

2、创建一个实现类实现IpFilterRule接口,用来配置过滤规则,可以根据自己的规则改造,这里只是一个示例:

/**
 * 
 * Ip过滤器 
 * 
 * @author gogym
 * @version 2019年7月13日
 * @see IpFilterRuleHandler
 * @since
 */
public class IpFilterRuleHandler implements IpFilterRule {

	@Override
	public boolean matches(InetSocketAddress remoteAddress) {

		//ip转成long类型
		String ip = remoteAddress.getHostString();
		long ipLong = NetWorkUtil.ipToLong(ip);

	    //创建一个要过滤的ip段
        IpRange ipRange = new IpRange("172.31.1.81", "172.31.1.87");

		long ipStart = NetWorkUtil.ipToLong(ipRange.getIpStart());
		long ipEnd = NetWorkUtil.ipToLong(ipRange.getIpEnd());
			//比较ip区间
		if (ipLong >= ipStart && ipLong <= ipEnd) {
                //返回true则执行过滤器
				return true;
		}
		
        //返回false表示不执行过滤器
		return false;

	}

	@Override
	public IpFilterRuleType ruleType() {
		//返回拒绝则表示拒绝连接,反之返回接受则表示可以连接
		return IpFilterRuleType.REJECT;
	}

}

3、添加到netty配置中:

/**
 * netty处理器配置
 * 
 * @author kokJuis
 * @version 1.0
 * @date 2016-9-30
 */
public class ServerInitializer extends ChannelInitializer<SocketChannel> {

	@Override
	public void initChannel(SocketChannel ch) throws Exception {
		ChannelPipeline pipeline = ch.pipeline();
		// ip过滤
		pipeline.addLast(new RuleBasedIpFilter(new IpFilterRuleHandler()));
	}

到此,netty4的ip过滤就完成了。

Netty是一个基于NIO的客户端、服务器端编程框架,它提供了一组易于使用的API,可以帮助开发人员快速地开发出高性能、可伸缩的网络应用程序。Netty框架提供了很多编码器,其中最常用的就是ByteToMessageCodec和MessageToByteCodec,它们分别用于将字节流转换为消息对象和将消息对象转换为字节流。 ByteToMessageCodec和MessageToByteCodec的使用方式非常简单,只需要继承它们,并实现其中的抽象方法即可。以下是使用ByteToMessageCodec和MessageToByteCodec的示例代码: ```java public class MyMessageDecoder extends ByteToMessageCodec<MyMessage> { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 4) { return; } int length = in.readInt(); if (in.readableBytes() < length) { in.resetReaderIndex(); return; } byte[] data = new byte[length]; in.readBytes(data); MyMessage message = new MyMessage(length, data); out.add(message); } @Override protected void encode(ChannelHandlerContext ctx, MyMessage msg, ByteBuf out) throws Exception { out.writeInt(msg.getLength()); out.writeBytes(msg.getData()); } } public class MyMessageEncoder extends MessageToByteCodec<MyMessage> { @Override protected void encode(ChannelHandlerContext ctx, MyMessage msg, ByteBuf out) throws Exception { out.writeInt(msg.getLength()); out.writeBytes(msg.getData()); } @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 4) { return; } int length = in.readInt(); if (in.readableBytes() < length) { in.resetReaderIndex(); return; } byte[] data = new byte[length]; in.readBytes(data); MyMessage message = new MyMessage(length, data); out.add(message); } } ``` MyMessage是自定义的消息对象,包含了消息的长度和数据。MyMessageDecoder和MyMessageEncoder分别用于将字节流转换为MyMessage对象和将MyMessage对象转换为字节流。在decode方法中,首先从ByteBuf中读取消息的长度,然后再读取消息的数据,最后将它们封装成MyMessage对象,加入到解码结果列表中。在encode方法中,首先将消息的长度写入到ByteBuf中,然后再将消息的数据写入到ByteBuf中。 使用ByteToMessageCodec和MessageToByteCodec时,只需要将它们注册到ChannelPipeline中即可。以下是注册的示例代码: ```java ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new MyMessageDecoder()); pipeline.addLast(new MyMessageEncoder()); ``` 这样,在ChannelPipeline中的所有ChannelHandler都可以使用MyMessage对象,而无需关心它们与字节流的转换过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值