ChannelGroupHolder.java 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package com.yunzhi.inte.rtsp;
  2. import io.netty.channel.Channel;
  3. import io.netty.channel.ChannelId;
  4. import io.netty.channel.group.ChannelGroup;
  5. import io.netty.channel.group.DefaultChannelGroup;
  6. import io.netty.util.concurrent.ImmediateEventExecutor;
  7. import lombok.extern.slf4j.Slf4j;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * 保存群组
  12. */
  13. @Slf4j
  14. public class ChannelGroupHolder {
  15. private static Map<String, ChannelGroup> channelGroups = new HashMap<>();
  16. private static Map<String, String> channelTagMapping = new HashMap<>();
  17. public static Map<String, ChannelGroup> getChannelGroups() {
  18. return channelGroups;
  19. }
  20. /**
  21. * 添加channel到群组
  22. */
  23. public static synchronized void add(String tag, Channel channel) {
  24. ChannelGroup group = channelGroups.get(tag);
  25. if (group == null) {
  26. group = new DefaultChannelGroup(ImmediateEventExecutor.INSTANCE);
  27. log.info("创建新群组:{}", tag);
  28. channelGroups.put(tag, group);
  29. }
  30. group.add(channel);
  31. ChannelId channelId = channel.id();
  32. channelTagMapping.put(channelId.toString(), tag);
  33. log.info("群组{}加入新channel:{}", tag, channelId);
  34. }
  35. /**
  36. * 根据IP获取群组
  37. */
  38. public static ChannelGroup get(String tag) {
  39. return channelGroups.get(tag);
  40. }
  41. /**
  42. * 移除指定channel,如果群组变为空,返回对应IP
  43. */
  44. public static String remove(Channel channel) {
  45. String channelId = channel.id().toString();
  46. String tag = channelTagMapping.get(channelId);
  47. channelTagMapping.remove(channelId);
  48. if (tag != null && !channelTagMapping.containsValue(tag)) {
  49. log.info("移除channel:{},所在群组:{}", channelId, tag);
  50. return tag;
  51. }
  52. return null;
  53. }
  54. /**
  55. * 关闭所有群组
  56. */
  57. public static void close() {
  58. for (ChannelGroup group : channelGroups.values()) {
  59. group.close();
  60. }
  61. }
  62. }