搜尋

首頁  >  問答  >  主體

java - netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中?

阿神阿神2780 天前1854

全部回覆(1)我來回復

  • 迷茫

    迷茫2017-04-18 10:38:26

    我們專案中大致是這麼做的:
    無論是自己寫資料結構或是使用Jedis,大概都是有一個類似Map的結構。

    • 建立一個Bean用來表示會話,此處暫且稱之為Session。

    • 在Session裡引用netty的Channel。

    • channelActive時將其放入redis。

    • 有必要的話,可以將channel.id().asLongText()channel.id().asShortText()作為Session的唯一標識

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //可以将channel.id().asLongText()或channel.id().asShortText()作为Session的ID
        Session session = Session.buildSession(ctx.channel());
        //Session存入Redis
        pushSession2Redis(session);
        logger.info("终端连接:{}", session);
    }

    Session.java

    import java.net.SocketAddress;
    import io.netty.channel.Channel;
    
    public class Session {
        //Session的唯一标识
        private String id;
        //和Session相关的channel,通过它向客户端回送数据
        private Channel channel = null;
        //上次通信时间
        private long lastCommunicateTimeStamp = 0l;
    
        //快速构建一个新的Session    
        public static Session buildSession(Channel channel) {
            Session session = new Session();
            session.setChannel(channel);
    
            //此处暂且使用netty生成的类似UUID的字符串,来标识一个session
            session.setId(channel.id().asLongText());
            session.setLastCommunicateTimeStamp(System.currentTimeMillis());
            return session;
        }
    
        // getter,setter
    }
    public class SessionManager{
    
        //将Session放入redis
        public void pushSession2Redis(Session  session){
            //这里就不用我说了吧
            //不知道你自己用的redis客户端是什么
            //调用客户端(比如Jedis)的API把session放到你自己的数据结构不就行了
        }
        
        //从redis获取指定session
        public Session findById(String sessionId){
            return null;
        }
    }

    回覆
    0
  • 取消回覆