websocket简介
websocket时h5时期提供的在单个TCP链接上进行全双工的通讯协议,使客户端和服务器端能够实时通信
基于netty 的websocket server 端
- 服务启动
public class ServerMain {
public static void main(String[] args) throws Exception{
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup wokerGroup = new NioEventLoopGroup();
try{
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(bossGroup,wokerGroup).channel(NioServerSocketChannel.class)
.handler(new LoggingHandler(LogLevel.INFO))
.option(ChannelOption.SO_KEEPALIVE,true)
.option(ChannelOption.SO_BACKLOG,1024*1024*10)
.childHandler(new WebSocketChannelInitializer());
ChannelFuture channelFuture = serverBootstrap.bind(new InetSocketAddress(8899)).sync();
channelFuture.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
wokerGroup.shutdownGracefully();
}
}
}
server端用发和平时一样,1.先创建一个bossGroup 用来处理连接 2创建一个wokerGroup用来处理后续事件,3.创建ServerBootstrap 设置熟悉,添加ChannelInitializer 4.启动监听8899端口
- ChannelInitializer 类:
public class WebSocketChannelInitializer extends ChannelInitializer<SocketChannel> {
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
//websocket协议本身是基于http协议的,所以这边也要使用http解编码器
pipeline.addLast(new HttpServerCodec());
//以块的方式来写的处理器
pipeline.addLast(new ChunkedWriteHandler());
//netty是基于分段请求的,HttpObjectAggregator的作用是将请求分段再聚合,参数是聚合字节的最大长度
pipeline.addLast(new HttpObjectAggregator(1024*1024*1024));
//ws://server:port/context_path
//ws://localhost:9999/ws
//参数指的是contex_path
pipeline.addLast(new WebSocketServerProtocolHandler("/ws",null,true,65535));
//websocket定义了传递数据的6中frame类型
pipeline.addLast(new WebSocketHandle());
}
}
- handle 首先添加HttpServerCodec 这是http协议解码器,因为websocket在握手的时候是使用http协议来实行协商的,然后后面是添加其他的一些处理器,2.注意的是WebSocketServerProtoco