ChatServer:
package com.bool.test;
import com.bool.initializer.ChatInitializer;
import com.sun.corba.se.internal.CosNaming.BootstrapServer;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public class ChatServer {
public static int port = 8088;
public void init(){
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
try{
ChannelFuture sync = serverBootstrap.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 128)
.option(ChannelOption.SO_KEEPALIVE, true)
.childHandler(new ChatInitializer())
.bind(port).sync();
System.out.println("服务器已经启动...");
sync.channel().closeFuture().sync();
}catch (Exception e){
e.printStackTrace();
} finally {
bossGroup.shutdownGracefully();
workerGroup.shutdownGracefully();
}
}
public static void main(String[] args){
new ChatServer().init();
}
}
ChatInitializer:
package com.bool.initializer;
import com.bool.handler.ChatServerHandler;
import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
/**
* 自定义 Channel初始化器
*/
public class ChatInitializer extends ChannelInitializer {
@Override
protected void initChannel(Channel ch) throws Exception {
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new ChatServerHandler());
}
}
ChatServerHandler:
package com.bool.handler;
import com.alibaba.fastjson.JSONObject;
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 ChatServerHandler extends SimpleChannelInboundHandler<String> {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private static ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
/**
* 当数据到达
* @param ctx
* @param msg
* @throws Exception
*/
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
String address = ctx.channel().remoteAddress().toString();
String m = simpleDateFormat.format(new Date())+" ["+address+"] 说:"+msg;
System.out.println(m);
channelGroup.forEach(c ->{
c.writeAndFlush(m);
});
}
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
super.handlerAdded(ctx);
Channel channel = ctx.channel();
String s = simpleDateFormat.format(new Date())+" ["+channel.remoteAddress().toString()+"] 进入了.";
System.out.println(s);
channelGroup.forEach(c ->{
c.writeAndFlush(s);
});
channelGroup.add(ctx.channel());
}
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
super.handlerRemoved(ctx);
Channel channel = ctx.channel();
channelGroup.remove(channel);
String m = simpleDateFormat.format(new Date())+" ["+channel.remoteAddress().toString()+"] 退出了.";
channelGroup.forEach(c ->{
c.writeAndFlush(m);
});
System.out.println(m);
}
}
ChatClient:
package com.bool.test;
import com.bool.initializer.ChatClientInitializer;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.util.Scanner;
public class ChatClient {
public void init(){
NioEventLoopGroup eventExecutors = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
try {
ChannelFuture sync = bootstrap.group(eventExecutors)
.channel(NioSocketChannel.class)
.handler(new ChatClientInitializer())
.connect("127.0.0.1", 8088)
.sync();
Channel channel = sync.channel();
System.out.println("---"+channel.remoteAddress()+"---");
Scanner scanner = new Scanner(System.in);
while(scanner.hasNextLine()){
String s = scanner.nextLine();
channel.writeAndFlush(s+"\r\n");
}
}catch (Exception e){
e.printStackTrace();
} finally {
eventExecutors.shutdownGracefully();
}
}
public static void main(String[] args){
new ChatClient().init();
}
}
ChatClientInitializer:
package com.bool.initializer;
import com.bool.handler.ChatClientHandler;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
public class ChatClientInitializer extends ChannelInitializer<SocketChannel> {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new StringDecoder())
.addLast(new StringEncoder())
.addLast(new ChatClientHandler());
}
}
ChatClientHandler:
package com.bool.handler;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
public class ChatClientHandler extends SimpleChannelInboundHandler<String> {
/**
* 当消息到达
* @param ctx
* @param msg
* @throws Exception
*/
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
System.out.println(msg);
}
}