前面介绍了基于Netty的Http服务,本文我们来通过Netty来实现群聊案例。

群聊案例

1.案例需求

  1. 编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)
  2. 实现多人群聊
  3. 服务器端:可以监测用户上线,离线,并实现消息转发功能
  4. 客户端:通过channel 可以无阻塞发送消息给其它所有用户,同时可以接受其它用户发送的消息(有服务器转发得到)
    目的:进一步理解Netty非阻塞网络编程机制

2.服务端代码

2.1 服务端处理器

  在服务端处理器中我们要处理客户端的上下线及消息的分发

package com.dpb.netty.goupchat;import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;import java.text.SimpleDateFormat;
import java.util.Date;/*** @program: netty4demo* @description: 群聊服务处理器*      1.客户端连接  提示其他客户端上线*      2.客户端发送消息,需要将详细转发给其他客户端* @author: 波波烤鸭* @create: 2019-12-29 14:02*/
public class GroupChatServerHandler extends SimpleChannelInboundHandler<String> {// 管理所有客户端的Channel 是一个单例对象private static final ChannelGroup grouup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");/*** 客户端连接触发的方法* @param ctx* @throws Exception*/@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {// 获取当前连接对象的 Channel对象Channel channel = ctx.channel();// 通知其他客户端 当前客户端连接上线了grouup.writeAndFlush("[客户端上线了]" + channel.remoteAddress() + " 上线了 " + sdf.format(new Date()) + "\n");// 将当前channel添加到 channelGroup中grouup.add(channel);}/*** 客户端断开连接触发的方法* @param ctx* @throws Exception*/@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {// 通知其他客户端 我离线了ctx.writeAndFlush("[客户端下线了]" + ctx.channel().remoteAddress() + " : " + sdf.format(new Date())+ "\n");}/*** 读取客户端请求消息的方法* @param context* @param s* @throws Exception*/@Overrideprotected void channelRead0(ChannelHandlerContext context, String s) throws Exception {// 获取当前的 handlerChannel channel = context.channel();// 遍历channelGroupgrouup.forEach(ch ->{if(ch == channel){// 是自己ch.writeAndFlush( "我说:" + s);}else{// 不是自己ch.writeAndFlush(channel.remoteAddress() + "说:" + s);}});}
}

2.2 服务端

  服务端我们要启动我们的服务,绑定端口等。

package com.dpb.netty.goupchat;import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;/*** @program: netty4demo* @description: 群聊系统服务端* @author: 波波烤鸭* @create: 2019-12-29 13:50*/
public class GroupChatServer {// 服务的端口号private  int port;public GroupChatServer(int port){this.port = port;}/*** 服务运行的方法*/public void run() throws  Exception{// 创建BossGroup和WorkGroupEventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workGroup = new NioEventLoopGroup();// 创建 ServerBootstrap 服务启动对象ServerBootstrap bootstrap = new ServerBootstrap();try{// 给bootstrap设置相关的参数bootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel sc) throws Exception {// 获取pipeline对象ChannelPipeline pipeline = sc.pipeline();// 设置对应的handlerpipeline.addLast("docoder",new StringDecoder());pipeline.addLast("encoder",new StringEncoder());pipeline.addLast(new GroupChatServerHandler());}});System.out.println("服务端启动了.......");// 绑定端口ChannelFuture future = bootstrap.bind(port).sync();future.channel().closeFuture().sync();}finally {bossGroup.shutdownGracefully();workGroup.shutdownGracefully();}}public static void main(String[] args) throws Exception{GroupChatServer server = new GroupChatServer(8888);server.run();}
}

3. 客户端代码

3.1 客户端处理器

  获取服务器转发的消息

package com.dpb.netty.goupchat;import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;/*** @program: netty4demo* @description: 客户端处理器* @author: 波波烤鸭* @create: 2019-12-29 14:19*/
public class GroupChatClientHandler extends SimpleChannelInboundHandler<String> {/*** 读取消息* @param channelHandlerContext* @param s* @throws Exception*/@Overrideprotected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {System.out.println(s.trim());}
}

3.2 客户端代码

  连接服务器,发送消息

package com.dpb.netty.goupchat;import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;import java.util.Scanner;/*** @program: netty4demo* @description:* @author: 波波烤鸭* @create: 2019-12-29 14:14*/
public class GroupChatClient {public String host;public int port ;public GroupChatClient(String host,int port){this.host = host;this.port = port;}public void run() throws  Exception{EventLoopGroup clientGroup = new NioEventLoopGroup(1);Bootstrap bootstrap = new Bootstrap();try{bootstrap.group(clientGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel sc) throws Exception {sc.pipeline().addLast("decoder",new StringDecoder());sc.pipeline().addLast("encoder",new StringEncoder());sc.pipeline().addLast(new GroupChatClientHandler());}});ChannelFuture future = bootstrap.connect(host, port).sync();Channel channel = future.channel();// 发送消息Scanner scanner = new Scanner(System.in);while(scanner.hasNextLine()){String msg = scanner.nextLine();channel.writeAndFlush(msg + "\n");}}finally {clientGroup.shutdownGracefully();}}public static void main(String[] args) throws  Exception {GroupChatClient client = new GroupChatClient("localhost",8888);client.run();}
}

4.测试

  启动服务器,然后启动多个客户端查看效果

查看效果,功能实现~

Netty案例介绍-群聊案例实现相关推荐

  1. netty之微信-群聊的发起与通知(十八)

    群聊的发起与通知 这小节,我们来学习一下如何创建一个群聊,并通知到群聊中的各位成员 我们依然是先来看一下最终的效果是什么样的. 1. 最终效果 服务端 创建群聊的客户端 其他客户端 首先,依然是三位用 ...

  2. Netty:实现群聊系统+自定义名称+空闲检测+Protobuf

    作为一个Java小白,持续学习是不可避免的,近期学习了Netty的相关知识,使用Netty实现了一个简单的群聊系统,使用Protobuf进行传输,支持空闲心跳检测,并且可以自定义群聊名称,所以写了此篇 ...

  3. netty之微信-群聊消息的收发及 Netty 性能优化(二十)

    群聊消息的收发及 Netty 性能优化 通过前面小节的学习,相信大家看到本小节标题就已经知道该如何实现本小节的功能了吧,为了给大家学到更多的知识,在实现了群聊消息收发之后,本小节将带给大家更多的惊喜. ...

  4. php 跳转qq群代码_一个简单QQ群聊案例代码解析(PHP实现)

    问题: 使用面向对象编程的方式实现以下业务逻辑: 1. 张三使用账号a,密码b登录了qq 2. 显示出张三最后的登录的时间 3. 张三查看了 1小时内的行政部门群的信息(这个群里有张三,李四,王五,其 ...

  5. 几百行代码,实现了微信群聊,神奇!

    哈喽大家好,我是IT老哥,今天我们来用netty实现一个群聊系统 首先是服务端的代码 public class GroupChatServer {private int port;public Gro ...

  6. Java NIO 应用案例:实现一个简单的群聊系统

    1 案例要求 编写一个 NIO 多人群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞): 服务器端功能: 监测用户上线,离线: 实现客户端消息的转发功能(将该客户端的消息转发给其它客户端): ...

  7. 群晖产品优势及案例介绍

    群晖产品优势及案例介绍 1.产品线全,随企业成长,针对企业使用体验优化,没有切换成本 1)个人用户产品,存储空间自己决定 群晖针对个人用户,有多款产品可以选择,CPU从2核到4核,盘位从1个到6个,还 ...

  8. 基于netty的在线聊天室,支持群聊和私聊——【一】基本功能介绍和nginx配置

    netty虽然可以实现聊天室的功能.但完整的做下来,还是要自己去封装很多东西,尤其是客户端和服务器通信的数据格式,服务端消息派发器的设计.这一点就比spring 的websocket over sto ...

  9. 聊天室案例,模仿QQ,微信群聊

    使用说明 这个代码是模拟一个简单的QQ,微信群聊,首先运行服务端代码,在运行客户端,每运行一次客户端,都会创建一个用户在聊天室中模拟发言.(注:服务端要一直处于开启状态,不能关闭) 客户端代码 imp ...

  10. 什么是HADOOP、产生背景、在大数据、云计算中的位置和关系、国内外HADOOP应用案例介绍、就业方向、生态圈以及各组成部分的简介(学习资料中的文档材料)

    1. HADOOP背景介绍 1. 1.1 什么是HADOOP 1.        HADOOP是apache旗下的一套开源软件平台 2.        HADOOP提供的功能:利用服务器集群,根据用户 ...

最新文章

  1. ​​​​​​​跳水板
  2. ssh长时间不操作便断开_不懂Excel文件恢复方法?只要跟着这样操作,便可以光速恢复文件...
  3. Java读取xml文件的四种方法
  4. TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇
  5. epoll 浅析以及 nio 中的 Selector
  6. 贴图问题,opengl,linux,windows,消除锯齿,摩尔纹,yuv 还是 rgb
  7. C#编写简易的学生成绩查询
  8. Could not calculate build plan:
  9. Downie 4搭配Permute 3,一个完整的视频下载处理流
  10. NLP 学习笔记9-停用词
  11. html自我介绍5页模板,关于个人自我介绍模板6篇
  12. 设计师必备的8大图库
  13. CSP考试 2016年04月第3题 路径解析 C++实现
  14. CVTE嵌入式应用开发长期实习生线上笔试+线上面试(一面)
  15. 淘宝直播商品识别大赛
  16. 对辊柱塞式成型机总体设计
  17. c语言求两个数的最小公倍数辗转相除法,C语言辗转相除法求2个数的最小公约数...
  18. 【golang】time: missing Location in call to Date
  19. PN532半加密、无漏洞卡解密
  20. js运算保留后面两位小数

热门文章

  1. 《maven的学习》 尚硅谷Maven视频(maven零基础入门)B站
  2. opendrive中的Road
  3. hbase 基本命令
  4. 【老生谈算法】matlab人脸识别算法(PCA)——人脸识别
  5. 格力空调通讯协议_格力空调485-格力风管机空调内外机单片机RS485通讯协议格式是怎样的-电气资讯 - 电工屋...
  6. 计算机原理视频教程星火,计算机组成原理及汇编语言(中央广播电视大学)
  7. 初识Zigbee协议栈及其安装
  8. bpsk在瑞利信道matlab,请教BPSK在瑞利信道下的误码率仿真
  9. 单片机原理及应用c51语言版林立,单片机原理及应用——基于Proteus和Keil C(第4版)...
  10. 渠道为王:销售渠道建设3部曲 读后感