使用netty搭建websocket服务实现简单通讯

使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值