1、实现原理是基于websocket的连接握手协议是以GET /开头的,利用netty对handler的热插拔实现同一端口tcp和websocket双协议共存。
实现代码如下
server启动类
package com.example.demo.im;
import com.example.demo.http.NettyWebSocketHandler;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler;
import java.net.InetSocketAddress;
public class NettyServer {
public static void main(String[] args) {
//boss 线程组用于处理连接工作
EventLoopGroup boss = new NioEventLoopGroup();
// work 线程组用于数据处理
EventLoopGroup work = new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, work)
// 指定Channel
.channel(NioServerSocketChannel.class)
//使用指定的端口设置套接字地址
.localAddress(new InetSocketAddress(10008))
//服务端可连接队列数,对应TCP/IP协议l