用Netty作为服务端的WebSocket通信
1 WebSocket
1.1为什么要选择WebSocket?
http 是无状态协议,为标识用户,通常客户端要带上session。但是它无法解决服务端主动想客户端发送消息的需求。面对并发量高的场景,由于http信息携带的数据大,而对服务器造成较大的负担,所以面对这种场景,WebSocket就上线了。
1.2什么是WebSocket?
WebSocket是一种基于tcp的新的网络协议,它实现了服务器与浏览器之间的全双工,即浏览器和服务器可以互不影响的向对方发送信息和接受信息。如下就是WebSocket的通信过程
可以看到,它还是用到了http协议来建立连接,之后就是Websocket的部分了。
1.3WebSocket的弊端?
WebSocket本身是依赖tomcat,然而tomcat的并发量不大,连接数低,会导致出现断连的情况,因此对于WebSocket通信要求不高的,可以直接依赖tomcat。但是遇到高并发就难以支撑,这时候,netty该上场了。
2 Netty
2.1 什么是Netty?
Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty是基于Java NIO实现的异步通信框架,其主要特点是简单,要比原生的JavaNIO开发方便很多,同时Netty封装了大量好用的组件,方便开发。下面基于Netty实现websocket通信。
Netty的WebSocket通讯实现
public class WebSocketServer {
public void run() {
// 服务端启动辅助类,用于设置TCP相关参数
ServerBootstrap bootstrap = new ServerBootstrap();
// 获取Reactor线程池
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workGroup = new NioEventLoopGroup();
// 设置为主从线程模型
bootstrap.group(bossGroup, workGroup)
// 设置服务端NIO通信类型
.channel(NioServerSocketChannel.class)
// 设置ChannelPipeline,也就是业务职责链,由处理的Handler串联而成,由从线程池处理
.childHandler(new ChannelInitializer<Channel>() {
// 添加处理的Handler,通常包括消息编解码、业务处理,也可以是日志、权限、过滤等
@Override
protected void initChannel(Channel ch) throws Exception {
// 获取职责链
ChannelPipeline pipeline = ch.pipeline();
//
pipeline.addLast("http-codec", new HttpServerCodec());
p