系列文章目录
前言
netty版本4.1.80.Final。
提示:以下是本篇文章正文内容,下面案例可供参考
一、介绍
主要分为服务端和客户端,服务端负责分发客户端消息并完成对其他客户端的转发。
二、使用步骤
1.服务端
GroupChatServer.java
package netty.group;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
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.nio.NioServerSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
/**
* Create by zjg on 2022/9/18
*/
public class GroupChatServer {
public static void main(String[] args) {
new GroupChatServer().run();
}
public static void run(){
NioEventLoopGroup bossGroup = null;
NioEventLoopGroup workGroup = null;
try {
bossGroup=new NioEventLoopGroup();
workGroup=new NioEventLoopGroup();
ServerBootstrap serverBootstrap=new ServerBootstrap();
serverBootstrap.group(bossGroup,workGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,128)
.childOption(ChannelOption.SO_KEEPALIVE,true)
.childHandler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel channel) throws Exception {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new GroupChatServerHandler());
}
});
ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();
System.out.println("群聊服务器启动完成");
channelFuture.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
bossGroup.shutdownGracefully();
workGroup.shutdownGracefully();
System.out.println("群聊服务器已关闭!");
}
}
}
GroupChatServerHandler
package netty.group;
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.DefaultEventExecutor;
/**
* Create by zjg on 2022/9/18
*/
public class GroupChatServerHandler extends SimpleChannelInboundHandler<String> {
private static ChannelGroup channelGroup=new DefaultChannelGroup(new DefaultEventExecutor());//GlobalEventExecutor.INSTANCE
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
Channel channel = channelHandlerContext.channel();
channelGroup.forEach((ch)->{
if(channel!=ch){
ch.writeAndFlush("["+channel.remoteAddress()+"发送消息]:"+s);
}
});
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
Channel channel = ctx.channel();
channelGroup.writeAndFlush(channel.remoteAddress()+"接入!");
channelGroup.add(channel);
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
Channel channel = ctx.channel();
channelGroup.writeAndFlush(channel.remoteAddress()+"接出!");
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
Channel channel = ctx.channel();
System.out.println("[服务器提示]:"+channel.remoteAddress()+"上线了!");
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Channel channel = ctx.channel();
System.out.println("[服务器提示]:"+channel.remoteAddress()+"下线了!");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
}
}
2.客户端
GroupChatClient.java
package netty.group;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.nio.NioEventLoopGroup;
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;
/**
* Create by zjg on 2022/9/18
*/
public class GroupChatClient {
public static void main(String[] args) {
new GroupChatClient("127.0.0.1",8080).run();
}
private final String host;
private final int port;
public GroupChatClient(String host, int port) {
this.host=host;
this.port=port;
}
public void run(){
NioEventLoopGroup group = null;
try {
group=new NioEventLoopGroup();
Bootstrap bootstrap=new Bootstrap();
bootstrap.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<NioSocketChannel>() {
@Override
protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception {
ChannelPipeline pipeline = nioSocketChannel.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new GroupChatClientHandler());
}
});
ChannelFuture channelFuture = bootstrap.connect(host,port).sync();
Channel channel = channelFuture.channel();
System.out.println("本机地址:"+channel.localAddress());
System.out.print("请输入:");
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()){
System.out.print("请输入:");
String s = scanner.nextLine();
channel.writeAndFlush(s);
}
channel.closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
group.shutdownGracefully();
}
}
}
GroupChatClientHandler.java
package netty.group;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
/**
* Create by zjg on 2022/9/18
*/
public class GroupChatClientHandler extends SimpleChannelInboundHandler<String> {
@Override
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
System.out.println();
System.out.println(s);
System.out.print("请输入:");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
ctx.close();
}
}