package chatroom;
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;
/**
* @Author: Usher
* @Description:
* 回調處理類,繼承SimpleChannelInboundHandler處理出站入站數據,模板設計模式,讓主要的處理邏輯保持不變,讓變化的步驟通過接口實現來完成
*/
public class ChatServerHandler extends SimpleChannelInboundHandler <String>{
public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
/**
* 當有客戶端連接時,handlerAdded會執行,就把該客戶端的通道記錄下來,加入隊列
* @param ctx
* @throws Exception
*/
@Override
public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
Channel inComing = ctx.channel();//獲得客戶端通道
//通知其他客戶端有新人進入
for (Channel channel : channels){
if (channel != inComing)
channel.writeAndFlush("[歡迎: " + inComing.remoteAddress() + "] 進入聊天室!\n");
}
channels.add(inComing);//加入隊列
}
/**
* 斷開連接
* @param ctx
* @throws Exception
*/
@Override
public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
Channel outComing = ctx.channel();//獲得客戶端通道
//通知其他客戶端有人離開
for (Channel channel : channels){
if (channel != outComing)
channel.writeAndFlush("[再見: ]" + outComing.remoteAddress() + " 離開聊天室!\n");
}
channels.remove(outComing);
}
/**
* 每當從客戶端有消息寫入時
* @param channelHandlerContext
* @param s
* @throws Exception
*/
protected void channelRead0(ChannelHandlerContext channelHandlerContext, String s) throws Exception {
Channel inComing = channelHandlerContext.channel();
for (Channel channel : channels){
if (channel != inComing){
channel.writeAndFlush("[用戶" + inComing.remoteAddress() + " 說:]" + s + "\n");
}else {
channel.writeAndFlush("[我說:]" + s + "\n");
}
}
}
/**
* 當服務器監聽到客戶端活動時
* @param ctx
* @throws Exception
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
Channel inComing = ctx.channel();
System.out.println("[" + inComing.remoteAddress() + "]: 在線");
}
/**
* 離線
* @param ctx
* @throws Exception
*/
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
Channel inComing = ctx.channel();
System.out.println("[" + inComing.remoteAddress() + "]: 離線");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
Channel inComing = ctx.channel();
System.out.println(inComing.remoteAddress() + "通訊異常!");
ctx.close();
}
}
————————————————
版權聲明:本文為CSDN博主「Usher_Ou」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/usher_ou/java/article/details/80919350