Netty案例介绍-群聊案例实现
前面介绍了基于Netty的Http服务,本文我们来通过Netty来实现群聊案例。
群聊案例
1.案例需求
- 编写一个 Netty 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)
- 实现多人群聊
- 服务器端:可以监测用户上线,离线,并实现消息转发功能
- 客户端:通过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案例介绍-群聊案例实现相关推荐
- netty之微信-群聊的发起与通知(十八)
群聊的发起与通知 这小节,我们来学习一下如何创建一个群聊,并通知到群聊中的各位成员 我们依然是先来看一下最终的效果是什么样的. 1. 最终效果 服务端 创建群聊的客户端 其他客户端 首先,依然是三位用 ...
- Netty:实现群聊系统+自定义名称+空闲检测+Protobuf
作为一个Java小白,持续学习是不可避免的,近期学习了Netty的相关知识,使用Netty实现了一个简单的群聊系统,使用Protobuf进行传输,支持空闲心跳检测,并且可以自定义群聊名称,所以写了此篇 ...
- netty之微信-群聊消息的收发及 Netty 性能优化(二十)
群聊消息的收发及 Netty 性能优化 通过前面小节的学习,相信大家看到本小节标题就已经知道该如何实现本小节的功能了吧,为了给大家学到更多的知识,在实现了群聊消息收发之后,本小节将带给大家更多的惊喜. ...
- php 跳转qq群代码_一个简单QQ群聊案例代码解析(PHP实现)
问题: 使用面向对象编程的方式实现以下业务逻辑: 1. 张三使用账号a,密码b登录了qq 2. 显示出张三最后的登录的时间 3. 张三查看了 1小时内的行政部门群的信息(这个群里有张三,李四,王五,其 ...
- 几百行代码,实现了微信群聊,神奇!
哈喽大家好,我是IT老哥,今天我们来用netty实现一个群聊系统 首先是服务端的代码 public class GroupChatServer {private int port;public Gro ...
- Java NIO 应用案例:实现一个简单的群聊系统
1 案例要求 编写一个 NIO 多人群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞): 服务器端功能: 监测用户上线,离线: 实现客户端消息的转发功能(将该客户端的消息转发给其它客户端): ...
- 群晖产品优势及案例介绍
群晖产品优势及案例介绍 1.产品线全,随企业成长,针对企业使用体验优化,没有切换成本 1)个人用户产品,存储空间自己决定 群晖针对个人用户,有多款产品可以选择,CPU从2核到4核,盘位从1个到6个,还 ...
- 基于netty的在线聊天室,支持群聊和私聊——【一】基本功能介绍和nginx配置
netty虽然可以实现聊天室的功能.但完整的做下来,还是要自己去封装很多东西,尤其是客户端和服务器通信的数据格式,服务端消息派发器的设计.这一点就比spring 的websocket over sto ...
- 聊天室案例,模仿QQ,微信群聊
使用说明 这个代码是模拟一个简单的QQ,微信群聊,首先运行服务端代码,在运行客户端,每运行一次客户端,都会创建一个用户在聊天室中模拟发言.(注:服务端要一直处于开启状态,不能关闭) 客户端代码 imp ...
- 什么是HADOOP、产生背景、在大数据、云计算中的位置和关系、国内外HADOOP应用案例介绍、就业方向、生态圈以及各组成部分的简介(学习资料中的文档材料)
1. HADOOP背景介绍 1. 1.1 什么是HADOOP 1. HADOOP是apache旗下的一套开源软件平台 2. HADOOP提供的功能:利用服务器集群,根据用户 ...
最新文章
- ​​​​​​​跳水板
- ssh长时间不操作便断开_不懂Excel文件恢复方法?只要跟着这样操作,便可以光速恢复文件...
- Java读取xml文件的四种方法
- TI Davinci DM6441嵌入式Linux移植攻略——UBL移植篇
- epoll 浅析以及 nio 中的 Selector
- 贴图问题,opengl,linux,windows,消除锯齿,摩尔纹,yuv 还是 rgb
- C#编写简易的学生成绩查询
- Could not calculate build plan:
- Downie 4搭配Permute 3,一个完整的视频下载处理流
- NLP 学习笔记9-停用词
- html自我介绍5页模板,关于个人自我介绍模板6篇
- 设计师必备的8大图库
- CSP考试 2016年04月第3题 路径解析 C++实现
- CVTE嵌入式应用开发长期实习生线上笔试+线上面试(一面)
- 淘宝直播商品识别大赛
- 对辊柱塞式成型机总体设计
- c语言求两个数的最小公倍数辗转相除法,C语言辗转相除法求2个数的最小公约数...
- 【golang】time: missing Location in call to Date
- PN532半加密、无漏洞卡解密
- js运算保留后面两位小数
热门文章
- 《maven的学习》 尚硅谷Maven视频(maven零基础入门)B站
- opendrive中的Road
- hbase 基本命令
- 【老生谈算法】matlab人脸识别算法(PCA)——人脸识别
- 格力空调通讯协议_格力空调485-格力风管机空调内外机单片机RS485通讯协议格式是怎样的-电气资讯 - 电工屋...
- 计算机原理视频教程星火,计算机组成原理及汇编语言(中央广播电视大学)
- 初识Zigbee协议栈及其安装
- bpsk在瑞利信道matlab,请教BPSK在瑞利信道下的误码率仿真
- 单片机原理及应用c51语言版林立,单片机原理及应用——基于Proteus和Keil C(第4版)...
- 渠道为王:销售渠道建设3部曲 读后感