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

怎么把netty的链接通道存储到redis中这样后续可以通过key取出channel给客户端发消息

回答

放内存里面了,之前是要做集群想存redis所有机器都能取出来用后来发现不是这么回事

我们项目中大致是这么做的:
无论是自己写数据结构还是使用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;

}

}

你确定你这个能序列化保存到redis里面?

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

  • 或许这里要注意一下?

我也遇到这个问题了?请问一下你解决了吗?

我按照@诸葛流云的方式试了,但是向redis中保存的时候,还是报不能序列化的异常,暂时没找到合适的方案
2018年3月22日09:18:19

您好 请问现在有解决方案了么

以上是 【java】netty4,服务端向客户端主动发消息怎么把channel存储到redis缓存中? 的全部内容, 来源链接: utcz.com/a/72775.html

回到顶部