使用Netty来实现一个聊天室是很容易的,当有客户端连接服务端的时候,在服务端的channelActive方法里面即可感应到。使用ChannelGroup.writeAndFlush方法即可向所有客户端发送一条“上线了”的信息,ChannelGroup是Netty封装的ConcurrentHashMap,里面保存所有的客户端:
@Override
public void channelActive(ChannelHandlerContext ctx) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Channel channel = ctx.channel();
SocketAddress address = channel.remoteAddress();
//将该客户加入聊天的信息推送给其它在线的客户端
String content = "[ 客户端 " + address + " ] 上线了 " + sdf.format(new Date());
byte[] bytes = content.getBytes(CharsetUtil.UTF_8);
MessageProtocol messageProtocol = MessageProtocol.builder().length(bytes.length).content(bytes).build();
CHANNEL_GROUP.writeAndFlush(messageProtocol);
//将当前channel加入到channelGroup
CHANNEL_GROUP.add(channel);
if (log.isInfoEnabled()) {
log.info(address + " 上线了");
}
}