网站建设公司ttmwl,首都航空公司官方网站,建设网站的准备工作分为,ppt模板免费下载 素材熊猫办公1设计思路#xff1a;启动一个服务端#xff0c;多个客户端第一个客户端启动时#xff0c;会告诉服务器上线了第二个客户端启动时#xff0c;告诉服务器上线#xff0c;并且通知第一个启动的客户端第三个客户端启动时#xff0c;告诉服务器上线#xff0c;并且通知第一个…1设计思路启动一个服务端多个客户端第一个客户端启动时会告诉服务器上线了第二个客户端启动时告诉服务器上线并且通知第一个启动的客户端第三个客户端启动时告诉服务器上线并且通知第一个和第二个启动的客户端其中一个客户端离开时通知其它客户单端和服务端2 代码服务端import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;/*** Author: liubujun* Date: 2023/2/15 10:31*/public class GroupChatServer {//监听端口private int port;public GroupChatServer(int port){this.port port;}//编写run方法处理客户端请求public void run() throws Exception{NioEventLoopGroup bossGroup new NioEventLoopGroup();NioEventLoopGroup workGroup new NioEventLoopGroup();try {ServerBootstrap b new ServerBootstrap();b.group(bossGroup,workGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true).childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) throws Exception {//获取到pipelineChannelPipeline pipeline ch.pipeline();//向pipeline加入解码器pipeline.addLast(decoder,new StringDecoder());//向pipeline加入编码器pipeline.addLast(encoder,new StringEncoder());//加入自己的业务处理handlepipeline.addLast(new GroupChatServerHandle());}});System.out.println(netty 服务器启动);ChannelFuture channelFuture b.bind(port).sync();//监听关闭channelFuture.channel().closeFuture().sync();}finally {bossGroup.shutdownGracefully();workGroup.shutdownGracefully();}}public static void main(String[] args) throws Exception {new GroupChatServer(7000).run();}
}服务端处理器import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.DefaultChannelProgressivePromise;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.util.concurrent.GlobalEventExecutor;
import jdk.nashorn.internal.runtime.GlobalConstants;import java.text.SimpleDateFormat;
import java.util.Date;/*** Author: liubujun* Date: 2023/2/15 14:49*/public class GroupChatServerHandle extends SimpleChannelInboundHandlerString {//定义一个channel组管理所有的channel//GlobalEventExecutor.INSTANCE 是全局事件的执行器是一个单例private static ChannelGroup channelGroup new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);SimpleDateFormat sf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);//handlerAdded表示连接建立一旦连接表示第一个被执行//将当前channel加入到channelGroupOverridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {Channel channel ctx.channel();//将该客户加入的聊天信息推送给其他在线的客户端/*** 该方法会将channelGroup中所有的channel遍历并发送消息*/channelGroup.writeAndFlush([客户端]channel.remoteAddress()加入聊天sf.format(new Date())\n);channelGroup.add(channel);}//断开连接将xx客户离开信息推送给其他在线的客户端Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {Channel channel ctx.channel();channelGroup.writeAndFlush([客户端]channel.remoteAddress()离开了);System.out.println(channelGroup sizechannelGroup.size());}//表示channel处于活动状态提示xxx上线Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {System.out.println(ctx.channel().remoteAddress()上线了~);}//表示channel处于非活动状态提示xxx离线Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {System.out.println(ctx.channel().remoteAddress()离线了~);}Overrideprotected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {//获取到当前的channelChannel channel ctx.channel();//这时我们遍历channelGroup,根据不同的情况回送不同的消息channelGroup.forEach(ch-{if (channel ! ch ){ //不是当前的channel转发消息ch.writeAndFlush([客户]channel.remoteAddress()发送了消息msg \n);}else {ch.writeAndFlush([自己]发送了消息msg\n);}});}Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {ctx.close();}
}客户端代码:import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;/*** Author: liubujun* Date: 2023/2/15 10:31*/public class GroupChatServer {//监听端口private int port;public GroupChatServer(int port){this.port port;}//编写run方法处理客户端请求public void run() throws Exception{NioEventLoopGroup bossGroup new NioEventLoopGroup();NioEventLoopGroup workGroup new NioEventLoopGroup();try {ServerBootstrap b new ServerBootstrap();b.group(bossGroup,workGroup).channel(NioServerSocketChannel.class).option(ChannelOption.SO_BACKLOG,128).childOption(ChannelOption.SO_KEEPALIVE,true).childHandler(new ChannelInitializerSocketChannel() {Overrideprotected void initChannel(SocketChannel ch) throws Exception {//获取到pipelineChannelPipeline pipeline ch.pipeline();//向pipeline加入解码器pipeline.addLast(decoder,new StringDecoder());//向pipeline加入编码器pipeline.addLast(encoder,new StringEncoder());//加入自己的业务处理handlepipeline.addLast(new GroupChatServerHandle());}});System.out.println(netty 服务器启动);ChannelFuture channelFuture b.bind(port).sync();//监听关闭channelFuture.channel().closeFuture().sync();}finally {bossGroup.shutdownGracefully();workGroup.shutdownGracefully();}}public static void main(String[] args) throws Exception {new GroupChatServer(7000).run();}
}客户端处理器import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;/*** Author: liubujun* Date: 2023/2/15 16:51*/public class GroupChatClientHandle extends SimpleChannelInboundHandlerString {Overrideprotected void channelRead0(ChannelHandlerContext channelHandlerContext, String msg) throws Exception {System.out.println(msg.trim());}
}
演示先启动服务端启动第一个客户端服务端和客服端控制台输出如下启动第二个客户端服务端、客服端1、客户端2控制台输出如下启动第三个客户端服务端控制台输出如下客户端1、客户端2、客户端3输出如下关闭其中一个客户端我这边关闭的是第二个服务端输出如下三个客户端打印台输出如下看到结果发现符合当初的设计。注意打开多个客户端需要在idea中配置