在平常使用的tomcat当中,tomcat一般配置采用BIO,如果采用了websocket技术的话则会占用tomcat线程,如果大量长连接保持在线的话,则会造成线程的大量浪费,所以引入netty进行nio的处理方式。
在项目的依赖中加入netty的依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>5.0.0.Alpha1</version>
</dependency>
加入依赖之后,配置netty的启动的服务NettyServer,代码如下
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Service;
/**
* TODO
*
* @author
* @Description TODO
* @version V1.0
* @Date 2018年7月17日 下午3:48:42
* @Copyright
*/
@Service
public class NettyServer {
@PostConstruct
public void initNetty() {
System.out.println("**********************spring启动后启动netty服务*********************");
new Thread() {
public void run() {
new NettyServer().run();
}
}.start();
}
public void run() {
System.out.println("===========================Netty端口启动========");
// Boss线程:由这个线程池提供的线程是boss种类的,用于创建、连接、绑定socket,
// (有点像门卫)然后把这些socket传给worker线程池。
// 在服务器端每个监听的socket都有一个boss线程来处理。在客户端,只有一个boss线程来处理所有的socket。
EventLoopGroup bossGroup = new NioEventLoopGroup();
// Worker线程:Worker线程执行所有的异步I/O,即处理操作
EventLoopGroup workGroup = new NioEventLoopGroup();
try {
// ServerBootstrap 启动NIO服务的辅助启动类,负责初始话netty服务器,并且开始监听端口的socket请求
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workGroup);
// 设置非阻塞,用它来建立新accept的连接,用于构造serversocketchannel的工厂类
b.channel(NioServerSocketChannel.class);
// ChildChannelHandler 对出入的数据进行的业务操作,其继承ChannelInitializer
b.childHandler(new ChildChannelHandler());
System.out.println("服务端开启等待客户端连接 ... ...");
Channel ch = b.bind(7397).sync().channel();
ch.closeFuture().sync();
} catch (Exception e) {
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
}
因为项目中采取了spring的配置,所以这里@PostConstruct注解在spring加载完成之后进行netty服务的启动。
接下来是websocket的具体处理的方法
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;