netty 群推(Netty实现简单群聊)
netty 群推(Netty实现简单群聊)
2024-11-24 06:40:41  作者:端暧尘手  网址:https://m.xinb2b.cn/life/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-24今天是正月初四接神,其实主要接的就是中国民间传说中有五路财神,即:A,东路财神比干看过《封神榜》的小伙伴们应该都清楚,比干才华出众,公正无私,最后却是被昏庸的纣王惨遭挖心而亡,所以比干是没有“心”的,正因为比干“无。
  • 怎么放大眼睛眼妆自然(女生眼睛若有这)
  • 2024-11-24女生眼睛若有这女生眼睛若有这“3特点”,天生自带“眼妆”,素颜早晚逆袭校花在平时如果女生想要拥有一副精致的颜值的话,那么除了自己整体的形象之外,每个五官都应该有一个精致的展现眼睛是心灵的窗户,一双明亮透彻的眼睛可以。
  • 搞笑综艺《我们都爱笑》(当年的爆笑综艺)
  • 2024-11-24当年的爆笑综艺相信对于大部分00后来说,《我们都爱笑》这档综艺节目对大家都不算陌生,《我们都爱笑》中的成员,陪伴着大部分00后的童年,很多人都会盼望着周六的晚上,会早早地写完作业,吃完饭守在电视机前,因为我们都爱笑。
  • 巫蛊术尸电影(巫术蛊术道法相互碰撞)
  • 2024-11-24巫术蛊术道法相互碰撞《龙虎山张天师》解密神秘道家文化,这3大看点不容错过近日,由樊少皇主演的网络大电影《龙虎山张天师》在腾讯视频、爱奇艺、优酷开始热播,这是一部奇幻类题材的影片,独特的剧本题材让很多观众对这部影片充满了期。
  • 逆天奇案林夏薇背的包(逆天奇案林夏薇)
  • 2024-11-24逆天奇案林夏薇《逆天奇案》林夏薇:美丽又飒爽,温柔又干练香港TVB出品的警匪大剧《逆天奇案》正在热播中,明快的节奏,高能的探案,养眼的颜值,熟悉的味道,一下子就把人带回了香港警匪剧的黄金时期,让人看得欲罢不能作为一。
  • 辅助用什么铭文(了解一下)
  • 2024-11-24了解一下五级铭文:红色宿命、蓝色调和、绿色献祭;在游戏中,辅助英雄是以控制为主,一般是用于给队友增加buff,保护己方输出和辅助团队,合理搭配铭文可以让辅助英雄有更好的发挥空间;这套铭文提供的属性和坦克的差不。
  • 驾驶证自学直考规定(再也不用讨好驾校老师了)
  • 2024-11-24再也不用讨好驾校老师了近日大家十分关注的驾考新规火热出炉了,据说是把考驾照这事的门槛和成本都降低了,之前那种日晒风吹还得排几个小时队的驾考方式让多少打算买车的人望而却步此次公布的《关于推进机动车驾驶人培训考试制度改革意见》。
  • 下半年即将上映电影推荐(11部电影扎堆25号上映)
  • 2024-11-2411部电影扎堆25号上映今年的11月可真是不同寻常啊~以为双十一剁完手之后干瘪的钱包终于不用再打开了吗?默默一翻电影排片,光是11月25日当天就有11部新片上映,作为影迷的你能忍?正经哥本着心疼钱包,拒绝烂片的原则,对25日。
  • 星际争霸2zvt(星际争霸2ZERG群星汇集)
  • 2024-11-24星际争霸2ZERG群星汇集中秋节前后,由《星际争霸2》粉丝发起并组织的《星际争霸2》ZERG全明星赛落下帷幕,神族选手Cyan一路披荆斩棘,在最后的决赛中以4比0的比赛战胜REX,以11胜1负的优异成绩夺得最终的冠军本次比赛吸。
  • 鸠摩罗什从哪来(凉州鸠摩罗什)
  • 2024-11-24凉州鸠摩罗什四世纪初,自儒家学者张轨到凉州任“刺史”之后,郭荷、郭瑀、刘昞等大学者也陆续聚集到凉州,使它文化浓度越来越高,成为研习和传播中华文化的中心现代史学家陈寅恪曾这样称赞凉州,虽然地处偏远,这里却能在频频战。
  • 开电视就睡着是为什么(有些人开着电视能睡着)
  • 2024-11-24有些人开着电视能睡着对于我们中的许多人来说,几乎没有什么比播放我们已经看过几十次,几百次的电视节目或电影、把音量调低,听听古怪对话的嗡嗡声更能让我们入睡的了但是,由于所有“蓝光”和“昼夜节律”都会影响您,您可能想知道在电。