闭关修行中......
我們專案中大致是這麼做的:無論是自己寫資料結構或是使用Jedis,大概都是有一個類似Map的結構。
建立一個Bean用來表示會話,此處暫且稱之為Session。
在Session裡引用netty的Channel。
在channelActive時將其放入redis。
channelActive
有必要的話,可以將channel.id().asLongText()或channel.id().asShortText()作為Session的唯一標識
channel.id().asLongText()
channel.id().asShortText()
@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; } }
我們專案中大致是這麼做的:
無論是自己寫資料結構或是使用Jedis,大概都是有一個類似Map的結構。
建立一個Bean用來表示會話,此處暫且稱之為Session。
在Session裡引用netty的Channel。
在
channelActive
時將其放入redis。有必要的話,可以將
channel.id().asLongText()
或channel.id().asShortText()
作為Session的唯一標識