netty 群推(Netty实现简单群聊)
netty 群推(Netty实现简单群聊)
2024-11-07 03:14:58  作者:端暧尘手  网址:https://m.xinb2b.cn/tech/lwa421899.html

github地址:https://github/saseke/eos-netty


Server端

EosServer.java

package com.songmengyuan.eos.server;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;import java.text.SimpleDateFormat;public class EosServer {private int port;private SimpleDateFormat sdf;public EosServer(int port) {this.port = port;}public void start() throws Exception {// boss设置1个EventLoopEventLoopGroup boss = new NioEventLoopGroup(1);EventLoopGroup workers = new NioEventLoopGroup();// 设置启动引导try {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(boss, workers).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG, 128).childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast("decoder", new StringDecoder());pipeline.addLast("encoder", new StringEncoder());pipeline.addLast("serviceHandler", new EosServerServiceHandler());}});// 绑定端口ChannelFuture channelFuture = serverBootstrap.bind(port).sync();System.out.println("服务器启动");channelFuture.channel().closeFuture().sync();}finally {boss.shutdownGracefully();workers.shutdownGracefully();}}}

EosServerServiceHandler.java

package com.songmengyuan.eos.server;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;public class EosServerServiceHandler extends SimpleChannelInboundHandler<String> {// 用channelGroup来维护所有注册的channelprivate static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd-hh:mm:ss");@Overridepublic void handlerAdded(ChannelHandlerContext ctx) {Channel channel = ctx.channel();String msg = sdf.format(new Date()) " 用户 : " channel.remoteAddress() " 上线\n";System.out.println(msg);// 发送给其他用户channelGroup.writeAndFlush(msg);// 将当前的channel加入channelGroup中channelGroup.add(channel);}// 自动会把当前的channel从group中移除@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) {Channel channel = ctx.channel();String msg = sdf.format(new Date()) " 用户: " channel.remoteAddress() " 下线\n";channelGroup.writeAndFlush(msg);}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) {Channel channel = ctx.channel();String message = "用户: " channel.remoteAddress() " 发送了: " msg;System.out.println(message);// 发送给除自己之外的其他用户channelGroup.forEach(c -> {if (c == channel) { // 如果当前channel是自己的话String s = sdf.format(new Date()) "[自己] :" msg;c.writeAndFlush(s);}else {c.writeAndFlush(message);}});}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();}}

EosServerBootstrap.java

package com.songmengyuan.eos.server;public class EosServerBootstrap {public static void main(String[] args) throws Exception {EosServer server = new EosServer(9000);server.start();}}

Client端

EosClient.java

package com.songmengyuan.eos.client;import io.netty.bootstrap.Bootstrap;import io.netty.channel.ChannelFuture;import io.netty.channel.ChannelInitializer;import io.netty.channel.ChannelPipeline;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;public class EosClient { private final String host; private final int port; public EosClient(String host, int port) { this.host = host; this.port = port; } public void start() throws InterruptedException { EventLoopGroup group = new NioEventLoopGroup(); Bootstrap bootstrap = new Bootstrap(); try { bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() { @Override protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast("decoder", new StringDecoder()); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("clientService", new EosClientServiceHandler()); } }); ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); System.out.println("登陆成功"); // 将用户输入的信息写入channel中 Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String msg = scanner.nextLine(); channelFuture.channel().writeAndFlush(msg); } } finally { group.shutdownGracefully(); } }}

EosClientServiceHandler.java

package com.songmengyuan.eos.client;import io.netty.channel.ChannelHandlerContext;import io.netty.channel.SimpleChannelInboundHandler;public class EosClientServiceHandler extends SimpleChannelInboundHandler<String> { @Override protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception { System.out.println(msg); }}

EosClientBootstrap.java

package com.songmengyuan.eos.client;public class EosClientBootstrap { public static void main(String[] args) throws InterruptedException { EosClient client = new EosClient("127.0.0.1",9000); client.start(); }}

  • 男女在一起的时候是怎样相处的 男女在一起相处
  • 2024-11-07男女在一起的时候是怎样相处的 男女在一起相处有读者问我:“男女在一起相处,逃不过哪几种关系”我并不知道读者为何有此一问,面对我的反问,读者告诉我,说自己遇见了难题,最近有半年了吧!读者的老公认识了一个异性朋友,每天两个人都走的很近,俨然有种无话。
  • 室内好养的绿植耐寒耐热(能过冬的室内耐寒绿植)
  • 2024-11-07能过冬的室内耐寒绿植1、地柏树地柏树,耐寒性很强,树形矮小且四季常青,可室内养殖;柠檬香蜂草,又名吸毒草,耐寒性极佳,可净化尼古丁等十多种有害气体;冷水花,叶片白绿相间,具有一定的耐寒性,适合冬季室内养殖;大叶绿萝,生命。
  • 夜阑语录(夜阑心语独处也美好)
  • 2024-11-07夜阑心语独处也美好生活中有些乐子只能一个人细品,它们通常都太细碎,人多嘈杂时会湮灭其中,只有独处时才能细心地慢慢感受午后开了音箱,让它吼出激越昂扬的歌,我则忙着洗衣拖地整理家务,这是我身心最放松的时候开了门,开了窗,一。
  • 新西兰在南半球(南半球花园国家新西兰)
  • 2024-11-07南半球花园国家新西兰#新西兰#是位于南半球的岛国,距离最近的大陆澳洲大陆2000多公里,面积27万平方公里,人口近511万国土由南岛、北岛组成为何新西兰南北两座岛屿经济差距那么大呢?主要气候和地形决定的北岛主要以丘陵低地。
  • 网络测速小程序哪个好点(免费开源的在线测速工具)
  • 2024-11-07免费开源的在线测速工具一款免费无广告的测速工具,界面真的很简单,由中科大开发的,推荐各位收藏使用关于中科大测速网今天推荐的免费工具全称「中国科学技术大学测速网站」,是中科大自己研发的在线测速小工具,界面简单、功能非常纯粹,。
  • dnf最新版本史诗之路还有么(体验服最新改动)
  • 2024-11-07体验服最新改动dnf里面的白兔子想必大家都知道吧,白兔子的最终宠物技能可以让全部队友增加百分之二十的伤害,并且白兔子的特性是可以和春节套的宠物技能效果进行叠加,最终达到全队百分之三十的伤害加成​不过这一特性在昨天的。
  • 球鞋的全明星配色(秋天的第一双球鞋)
  • 2024-11-07秋天的第一双球鞋秋天的第一杯奶茶,如期而至而我只想要那秋天的第一双球鞋8月到来就意味着9月开学,不少粉丝朋友在后台询问,开学想穿新鞋,有什么建议?今天『DDBuy』回归推荐,直到开学,总有一双入你的眼!!第一双:Ni。
  • 10大烂片票房排行榜(从15亿票房奇迹到)
  • 2024-11-07从15亿票房奇迹到爆炸贝归来!然而无人问津这个曾经创造过《变形金刚》系列奇迹的男人新片的票房,5天累计连1000万都没到Sir也是个不信邪的人拍过《绝地战警》《勇闯夺命岛》的人能差到哪里去?于是只身勇闯电影院!看看这部。
  • 油电混动和插电混动的区别(油电混动和插电混动车辆的一些区别)
  • 2024-11-07油电混动和插电混动车辆的一些区别对于许多车主来说,可能经常会分不清油电混动和插电混动车辆的一些区别,甚至经常把二者混为一谈,不过今天大家不用担心了,小编用一篇文章帮您解决这个问题,让你深入了解一下这两种车辆运行模式的特点,这样您就再。
  • 感慨又长一岁的自己(衷心的祝福自己又老了一岁)
  • 2024-11-07衷心的祝福自己又老了一岁————[蛋糕][蛋糕][蛋糕]诶呀又老了一岁❗️回首走过的路,感慨万千,岁月,如流水般从身边匆匆滑过,不觉间,已经走过四十五载[蛋糕][蛋糕]生命的里程碑上已经刻上第四十道年轮[蛋糕]今天对自己说声。
  • 6道高智商智力题(全做对就是天才)
  • 2024-11-07全做对就是天才【7道智商题,全做对就是天才!最后1题一般人都答不出来!】一、根据规律,算出来?代表什么二、仔细一点,这算式最后出来等于多少?三、不过黑点,把所有的圈都连接起来,不能重复不能斜线,怎么连?四、这个问号。