使用netty搭建websocket服务实现简单通讯
在初学netty的时候 由于netty里面大量的接口,所以很容易不知道继承哪个来实现我们需要的服务,这里记录一下websocket的实现方式。
开始写代码都是使用 主从Reactor多线程模型 所以直接创建
public static void main(String[] args) throws Exception{
NioEventLoopGroup bossGroup=null,workGroup=null;
try {
bossGroup = new NioEventLoopGroup();
workGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap().channel(NioServerSocketChannel.class)
.group(bossGroup, workGroup)
.childHandler(new WebSocketInitializer()); //初始化websocket类 我们稍后写
ChannelFuture channelFuture = serverBootstrap.bind(8088).sync(); //绑定8088端口
channelFuture.channel().closeFuture().sync();
}finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
}
}
``
基本模式创建完毕,我们就开始创建WebSocketInitializer类 由于都是基于tcp操作 一样是继承ChannelInitializer 这个类型 重新方法initChannel即可 上代码
ChannelPipeline pipeline = channel.pipeline();
//获取到管道后 给管道加入http解码器
pipeline.addLast(new HttpServerCodec());
//对数据流进行处理,对数据流写提供支持
pipeline.addLast(new ChunkedWriteHandler());
//对httpMessage 进行聚合处理,聚合成request和response
pipeline.addLast(new HttpObjectAggregator(1024*64)); //大小自己设置
/**
* 本handler 会帮助你处理一些繁重复杂的事情
* 会帮你处理握手动作:handshaking(close\ping\pong) ping+pong=心跳
* 对于websockert 来讲,都是以farams进行传输,不同的数据类型对应的frams也不同
*/
pipeline.addLast(new WebSocketServerProtocolHandler("/ws")); //这里是连接的路径 按需设置
//自定义的hannler
pipeline.addLast(new ChatHandler()); //整个管道部署完成之后 就要添加我们的业务需求类了
websocket初始化完毕后,就要创建hannler类要实现自己的业务需求
这里说一下,websocket是以frams传输的说以继承SimpleChannelInboundHandler的话 泛型需要写入TextWebSocketFrame。所以整个ChatHandler的创建如下
public class ChatHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
//用于记录和管理客户端的channel
private static ChannelGroup clients=new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
@Override
protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame fram) throws Exception {
//获取客户端所传输的消息
String message = fram.text();
System.out.println("客户端消息:"+message);
//实现的功能就是服务器返回客户端发来的消息
clients.writeAndFlush(new TextWebSocketFrame("[服务器]:"+ LocalTime.now()+"收到了消息:"+message));
}
//客户进入就将聊天通道添加进ChannelGroup中 方便管理
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
clients.add(ctx.channel());
}
//客户离开就将聊天通道从ChannelGroup中移除
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
clients.remove(ctx.channel());
}
}
最后使用html websocket查看 效果如下图:
整一个流程就是这样 需要完整代码的可以进入下载https://download.csdn.net/download/qq_20532695/14965452