SocketHandler.java 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package cn.com.zyjblogs.chat.netty;
  2. import io.netty.channel.Channel;
  3. import io.netty.channel.ChannelHandlerContext;
  4. import io.netty.channel.ChannelInboundHandlerAdapter;
  5. import io.netty.channel.group.ChannelGroup;
  6. import io.netty.channel.group.DefaultChannelGroup;
  7. import io.netty.util.concurrent.GlobalEventExecutor;
  8. import lombok.extern.slf4j.Slf4j;
  9. /**
  10. * Socket拦截器,用于处理客户端的行为
  11. *
  12. * @author Gjing
  13. **/
  14. @Slf4j
  15. public class SocketHandler extends ChannelInboundHandlerAdapter {
  16. public static final ChannelGroup clients = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
  17. /**
  18. * 读取到客户端发来的消息
  19. *
  20. * @param ctx ChannelHandlerContext
  21. * @param msg msg
  22. * @throws Exception e
  23. */
  24. @Override
  25. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  26. // 由于我们配置的是 字节数组 编解码器,所以这里取到的用户发来的数据是 byte数组
  27. byte[] data = (byte[]) msg;
  28. log.info("收到消息: " + new String(data));
  29. // 给其他人转发消息
  30. for (Channel client : clients) {
  31. if (!client.equals(ctx.channel())) {
  32. client.writeAndFlush(data);
  33. }
  34. }
  35. }
  36. @Override
  37. public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
  38. log.info("新的客户端链接:" + ctx.channel().id().asShortText());
  39. clients.add(ctx.channel());
  40. }
  41. @Override
  42. public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
  43. clients.remove(ctx.channel());
  44. }
  45. @Override
  46. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  47. cause.printStackTrace();
  48. ctx.channel().close();
  49. clients.remove(ctx.channel());
  50. }
  51. }