一般用netty来发送和接收数据都会继承SimpleChannelInboundHandler和ChannelInboundHandlerAdapter这两个抽象类,那么这两个到底有什么区别呢?
其实用这两个抽象类是有讲究的,在客户端的业务Handler继承的是SimpleChannelInboundHandler,而在服务器端继承的是ChannelInboundHandlerAdapter。
最主要的区别就是SimpleChannelInboundHandler在接收到数据后会自动release掉数据占用的Bytebuffer资源(自动调用Bytebuffer.release())。而为何服务器端不能用呢,因为我们想让服务器把客户端请求的数据发送回去,而服务器端有可能在channelRead方法返回前还没有写完数据,因此不能让它自动release。
Java中的设计模式 - 适配器模式(接口适配器)
应用场景:不想实现接口中的所有方法
#
1 - 创建接口
public interface Port {
// 远程SSH端口22
public void SSH();
// 网络端口80
public void NET();
}
2 - 伪实现接口
/**
* 定义抽象类实现端口接口,但是什么事情都不做
*/
public abstract class Wrapper implements Port{
@Override
public void SSH(){};
@Override
public void NET(){}
}
3 - 覆写伪接口实现一种功能
/**
* 提供聊天服务
* 需要网络和文件传输功能
*/
public class Chat extends Wrapper{
@Override
public void NET(){ System.out.println("Hello world!"); };
@Override
public void FTP(){ System.out.println("File upload succeddful!"); };
}
4 - 覆写伪接口实现另外一种功能
/**
* 网站服务器
* 需要Tomcat容器,Mysql数据库,网络服务,远程服务
*/
public class Server extends Wrapper{
@Override
public void SSH(){ System.out.println("Connect success!"); };
}
5 - 运行服务
/**
* 运行器
* 运行聊天服务和服务器
*/
public class Start {
private static Port chatPort = new Chat();
public static void main(String[] args) {
// 聊天服务
chatPort.FTP();
chatPort.NET();
}
}
5 - 运行结果
File upload succeddful!
Hello world!
Mysql is running!
Connect success!
Tomcat 9 is running!
Hello WWW!