`

Netty实时聊天实践

阅读更多

原文请参考微信公众账号(包含图文):https://mp.weixin.qq.com/s/o2AGrNd8rZHp9DbDppjI2Q 

Netty数据传输

Netty数据传输流程:客户端发送数据(出站)时,将消息流存放到缓冲区(ByteBuf),然后将ByteBuf数据传递给ChannelPipeline中的第一个ChannelOutBoundHandler,然后再传递给第二个ChannelOutBoundHandler,如果ChannelPipeline绑定有多个ChannelOutBoundHandler,则需要一层层传递下去,其中可以在ChannelOutBoundHandler中进行编码(Encoder)操作,接着会将ByteBuf数据从ChannelOutBoundHandler传递给ChannelInBoundHandler,如果ChannelPipeline绑定有多个ChannelInBoundHandler,则需一层层传递下去,可在ChannelInBoundHandler中进行解码(Decoder)操作,然后服务端收到消息(入站)后,将消息进行解码Decoder操作;两个BoundHandler之间的数据传递是通过ChannelHandlerContext来实现;

Netty实现聊天功能

ChatServerHandler

  1. publicclassChatServerHandlerextendsSimpleChannelInboundHandler<String>{

  2.  

  3.    privatefinalChannelGroup group;

  4.  

  5.    publicChatServerHandler(ChannelGroup group){

  6.        this.group = group;

  7.    }

  8.  

  9.    /**

  10.     * 将新加入的连接放入group中

  11.     * @param ctx

  12.     * @throws Exception

  13.     */

  14.    @Override

  15.    publicvoid handlerAdded(ChannelHandlerContext ctx)throwsException{

  16.        group.add(ctx.channel());

  17.    }

  18.  

  19.    /**

  20.     * 删除group中下线的连接

  21.     * @param ctx

  22.     * @throws Exception

  23.     */

  24.    @Override

  25.    publicvoid handlerRemoved(ChannelHandlerContext ctx)throwsException{

  26.        group.remove(ctx.channel());

  27.    }

  28.  

  29.  

  30.    @Override

  31.    protectedvoid channelRead0(ChannelHandlerContext ctx,String msg)throwsException{

  32.        if(StringUtils.isEmpty(msg)){

  33.            return;

  34.        }

  35.        Channel incoming = ctx.channel();

  36.        for(Channel channel : group){

  37.            if(channel != incoming){

  38.                channel.writeAndFlush(msg +"\n");

  39.            }else{

  40.                channel.writeAndFlush(msg +"\n");

  41.            }

  42.        }

  43.    }

  44. }

服务端引导类ChatServer

  1. publicclassChatServer{

  2.  

  3.    //创建 DefaultChannelGroup 用来 保存所有连接的的 WebSocket channel

  4.    privatefinalChannelGroup channelGroup =newDefaultChannelGroup(GlobalEventExecutor.INSTANCE);

  5.  

  6.    publicvoid start(int port){

  7.        EventLoopGroup bossGroup =newNioEventLoopGroup();

  8.        EventLoopGroup workerGroup =newNioEventLoopGroup();

  9.  

  10.        try{

  11.            ServerBootstrap bootstrap =newServerBootstrap();

  12.            bootstrap.group(bossGroup, workerGroup)

  13.                    .channel(NioServerSocketChannel.class)

  14.                    .childHandler(newChannelInitializer<SocketChannel>(){

  15.                        @Override

  16.                        protectedvoid initChannel(SocketChannel ch)throwsException{

  17.                            ChannelPipeline pipeline = ch.pipeline();

  18.                            pipeline.addLast("framer",newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));

  19.                            pipeline.addLast("decoder",newStringDecoder());

  20.                            pipeline.addLast("encoder",newStringEncoder());

  21.                            pipeline.addLast(newChatServerHandler(channelGroup));

  22.                        }

  23.                    })

  24.                    .option(ChannelOption.SO_BACKLOG,128)

  25.                    .childOption(ChannelOption.SO_KEEPALIVE,true);

  26.            ChannelFuture future = bootstrap.bind(port).sync();

  27.            future.channel().closeFuture().sync();

  28.        }catch(Exception e){

  29.            e.printStackTrace();

  30.        }finally{

  31.            bossGroup.shutdownGracefully();

  32.            workerGroup.shutdownGracefully();

  33.        }

  34.    }

  35.  

  36.    publicstaticvoid main(String[] args){

  37.       newChatServer().start(8080);

  38.    }

  39.  

  40. }

客户端ChatClientHandler

  1. publicclassChatClientHandlerextendsSimpleChannelInboundHandler<String>{

  2.    /** 控制台不打印没有的信息 */

  3.    @Override

  4.    protectedvoid channelRead0(ChannelHandlerContext ctx,String msg)throwsException{

  5.        if(!msg.contains("HTTP/1.1")&&!msg.contains("Host:")&&!msg.contains("Proxy-Connection: keep-alive")&&!msg.contains("User-Agent:")){

  6.            System.out.println(msg);

  7.        }

  8.    }

  9. }

客户端引导类ChatClientA

  1. publicclassChatClientA{

  2.  

  3.    publicstaticvoid main(String[] args){

  4.        newChatClientA().start();

  5.    }

  6.  

  7.  

  8.    publicvoid start(){

  9.        EventLoopGroup group =newNioEventLoopGroup();

  10.        try{

  11.            Bootstrap bootstrap =newBootstrap();

  12.            bootstrap.group(group)

  13.                    .channel(NioSocketChannel.class)

  14.                    .handler(newChannelInitializer<SocketChannel>(){

  15.                @Override

  16.                protectedvoid initChannel(SocketChannel ch)throwsException{

  17.                    ch.pipeline().addLast("framer",newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));

  18.                    ch.pipeline().addLast("decoder",newStringDecoder());

  19.                    ch.pipeline().addLast("encoder",newStringEncoder());

  20.                    ch.pipeline().addLast("handler",newChatClientHandler());

  21.  

  22.                }

  23.            });

  24.            ChannelFuture future = bootstrap.connect("localhost",8080).sync();

  25.            Channel channel = future.channel();

  26.            BufferedReader in =newBufferedReader(newInputStreamReader(System.in));

  27.            while(true){

  28.                channel.writeAndFlush("ChatClientA说:"+ in.readLine()+"\r\n");

  29.            }

  30.        }catch(Exception e){

  31.            e.printStackTrace();

  32.        }finally{

  33.            group.shutdownGracefully();

  34.        }

  35.  

  36.    }

  37.  

  38. }

客户端引导类ChatClientB

  1. publicclassChatClientB{

  2.  

  3.    publicstaticvoid main(String[] args){

  4.        newChatClientB().start();

  5.    }

  6.  

  7.    publicvoid start(){

  8.        EventLoopGroup group =newNioEventLoopGroup();

  9.        try{

  10.            Bootstrap bootstrap =newBootstrap();

  11.            bootstrap.group(group)

  12.                    .channel(NioSocketChannel.class)

  13.                    .handler(newChannelInitializer<SocketChannel>(){

  14.                @Override

  15.                protectedvoid initChannel(SocketChannel ch)throwsException{

  16.                    ch.pipeline().addLast("framer",newDelimiterBasedFrameDecoder(8192,Delimiters.lineDelimiter()));

  17.                    ch.pipeline().addLast("decoder",newStringDecoder());

  18.                    ch.pipeline().addLast("encoder",newStringEncoder());

  19.                    ch.pipeline().addLast("handler",newChatClientHandler());

  20.  

  21.                }

  22.            });

  23.            ChannelFuture future = bootstrap.connect("localhost",8080).sync();

  24.            Channel channel = future.channel();

  25.            BufferedReader in =newBufferedReader(newInputStreamReader(System.in));

  26.            while(true){

  27.                channel.writeAndFlush("ChatClient说:"+ in.readLine()+"\r\n");

  28.            }

  29.        }catch(Exception e){

  30.            e.printStackTrace();

  31.        }finally{

  32.            group.shutdownGracefully();

  33.        }

  34.  

  35.    }

  36.  

  37. }

ChatClientA与ChatClientB代码一模一样,因为需要实现聊天功能,所以需要启用至少2个客户端,故Copy一样的代码,分别启动ChatClientA与ChatClientB;

先启动ChatServer.main(),然后分别启动ChatClientA与ChatClientB的main()方法

分别在ChatClientA和ChatClientB的控制台输入聊天内容,聊天结果如下:

ClientA:

ClientB:

 

 
 

微信扫一扫
关注该公众号

分享到:
评论

相关推荐

    整合netty实时通讯

    通过学习和实践 Netty 实现的 WebSocket 服务,你可以构建出强大的实时通讯系统,适用于游戏、金融、物联网等多种场景。不过,实际生产环境中,还需要考虑负载均衡、容错恢复、安全性等更多因素,以确保服务的稳定性...

    基于netty的聊天代码

    在本文中,我们将深入探讨基于 Netty 的聊天应用开发,重点关注服务端与客户端的通信以及如何通过代码实践增强理解。 一、Netty 框架概述 Netty 是由 JBoss 提供的开源框架,它简化了网络编程,特别是 TCP 和 UDP ...

    Netty版WebSocket聊天

    总的来说,Netty版WebSocket聊天是一个学习和实践WebSocket与Netty结合的绝佳案例。通过这个项目,开发者不仅可以了解到WebSocket的基本用法,还能深入理解Netty框架的底层原理和使用技巧,从而提升在网络编程领域的...

    netty QQ聊天室代码案例

    1. "Netty聊天程序(实战一):从0开始实战100w级流量应用" 这一部分主要讲述了如何使用Netty框架构建一个能够处理大规模并发连接的聊天应用程序。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发高并发...

    netty实现多人聊天室,有gui界面

    总的来说,这个项目展示了Netty如何与GUI库结合,提供一个实时、高效的多人聊天解决方案。通过学习和分析这个项目,你可以深入理解Netty的网络编程模型,以及如何构建交互式GUI应用。这对于想要在Java领域从事网络...

    JAVA基于Netty实现的聊天室

    【Java基于Netty实现的聊天室】是一种使用Java编程...这个Java Netty聊天室项目是一个很好的学习和实践网络编程和Netty框架的起点,开发者可以通过它深入了解网络通信的原理,以及如何利用Netty构建高性能的网络应用。

    netty实现简单的聊天

    Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。在这个“netty实现简单的聊天”的项目中,...通过学习和实践,我们可以深入理解Netty在网络编程中的强大能力。

    Netty 聊天 例子

    Netty 是一个高性能、异步事件驱动的...实践中,还可以进一步优化,比如添加用户认证、聊天室功能、文件传输等,使聊天应用更加完善。在实际工作中,Netty 的强大性能和灵活性使其成为许多高性能网络应用的首选框架。

    毕设项目:基于netty+websocket+springboot的实时聊天系统.zip

    这是一个基于Netty、WebSocket和Spring Boot技术实现的实时...通过实践这个项目,开发者可以深入理解Spring Boot的自动化配置、Netty的网络编程模型以及WebSocket在实时通信中的应用,同时也能锻炼前后端协作的能力。

    前台用html5 websocket 后台用netty实现聊天系统

    在本文中,我们将探讨如何使用HTML5的WebSocket API在前端构建实时聊天应用,以及如何在后端利用...通过持续学习和实践,你可以进一步掌握WebSocket与Netty结合开发聊天系统的技巧,构建出更复杂、功能丰富的Web应用。

    Netty实现简单的聊天消息群发功能

    这对于构建分布式聊天系统或者实时通知系统非常有用。 首先,我们要理解Netty的核心概念,包括Bootstrap(启动引导类)、ServerBootstrap(服务器启动引导类)、Channel(通道)和EventLoop(事件循环)。Bootstrap...

    基于springboot + netty + vue的bililbili弹幕群聊系统.zip

    该项目是一个实现类似哔哩哔哩...总结,这个项目展示了如何整合多种技术来构建一个实时的、高并发的在线聊天系统,涉及到了前后端分离、实时通信、数据库设计、安全性等多个方面,是学习和实践现代Web开发的优秀案例。

    netty_chat:基于Netty的聊天系统

    【标题】:“netty_chat:基于Netty的聊天系统” ...综上所述,“netty_chat”项目是一个很好的学习资源,它演示了如何结合Netty和WebSocket技术创建实时聊天应用,有助于理解和实践这两种技术在实际开发中的应用。

    基于netty和protobuf的聊天系统,客户端+服务器

    在IT行业中,构建高效、可扩展的网络通信系统是至关重要的。这个项目“基于netty和protobuf的聊天系统,...同时,这个聊天系统也可以作为进一步开发分布式系统、实时通信应用的基础,具有很高的学习价值和实践意义。

    基于springcloud+Netty+MQ+mysql的分布式即时聊天系统.zip

    在即时聊天系统中,Netty以其高效的IO处理能力和灵活的架构,承担起消息传输的重任,确保消息的实时性和可靠性。 Message Queue(MQ)是解耦和提高系统响应速度的关键组件。在本项目中,可能是RabbitMQ或Kafka等MQ...

    netty聊天小列子

    这个“netty聊天小例子”提供了一个简单的服务端和客户端应用,可以帮助我们理解Netty如何在实际场景中工作。 首先,Netty 的核心特性包括其基于NIO(非阻塞I/O)的事件驱动架构。这种架构允许Netty在处理大量并发...

    Netty进阶之路-跟着案例学Netty

    总的来说,《Netty进阶之路-跟着案例学Netty》是一本深入浅出、实践性强的Netty教程,无论你是初学者还是有一定经验的开发者,都能从中受益匪浅,提升你的网络编程技能。通过阅读这本书,你将能够熟练地利用Netty...

    netty视频详解(90节大长篇)

    - **案例一:简单聊天室**:构建一个基于Netty的多人在线聊天室,实现消息的实时发送与接收。 - **案例二:文件传输服务器**:设计一个可以支持多用户同时上传下载文件的服务端程序。 - **案例三:物联网监控平台**...

    spring+netty+websocket高并发聊天

    总的来说,这个项目展示了如何将 `Spring` 的便捷性、`Netty` 的高性能以及 `WebSocket` 的实时通信能力结合起来,构建一个能够处理高并发聊天需求的应用。通过引入 `RocketMQ`,还可以进一步提升系统的可扩展性和...

Global site tag (gtag.js) - Google Analytics