连接客户端通道时将数据保存在 TCP 服务器中
Persisting data in TCP server while client channel is connected
我正在使用 Netty 构建 TCP 服务器。
有什么方法可以在其通道存在时保留已连接客户端的会话数据?
例如,当客户端连接到服务器时,我需要创建它的 class 实例并在他发送消息时以不同的方式重用。
类似于下面的代码:
// this is called when the client connect to the server
public void channelActive(final ChannelHandlerContext ctx) {
ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(
new GenericFutureListener<Future<Channel>>() {
public void operationComplete(Future<Channel> future) throws Exception {
// I need to create the class instance when the
// client connects to the server
ClientData clientData = new ClientData(ctx.channel());
channels.add(ctx.channel());
}
}
);
}
// this is called when the server receives a message from the connected client
public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
if("update".equals(msg)){
// then I need the retrieve the data created
// in the ChannelActive method.
clientData().update();
}
}
在浏览解决方案时,我发现了几个示例,其中开发人员使用缓存服务(如 memcache 或 redis)来存储和检索与连接的客户端相关的数据。
但我希望在不依赖外部进程的情况下解决这个问题。
有什么办法可以做到这一点?如有任何关于该主题的建议,我们将不胜感激。
谢谢
你应该使用 AttributeMap.attr(AttributeKey key),它被 ChannelHandlerContext
继承:
Storing stateful information
AttributeMap.attr(AttributeKey)
allow you to store and access stateful information that is related with a handler and its context. Please refer to ChannelHandler to learn various recommended ways to manage stateful information. [1]
[1][http://netty.io/4.0/api/io/netty/channel/ChannelHandlerContext.html]
我正在使用 Netty 构建 TCP 服务器。 有什么方法可以在其通道存在时保留已连接客户端的会话数据?
例如,当客户端连接到服务器时,我需要创建它的 class 实例并在他发送消息时以不同的方式重用。 类似于下面的代码:
// this is called when the client connect to the server
public void channelActive(final ChannelHandlerContext ctx) {
ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(
new GenericFutureListener<Future<Channel>>() {
public void operationComplete(Future<Channel> future) throws Exception {
// I need to create the class instance when the
// client connects to the server
ClientData clientData = new ClientData(ctx.channel());
channels.add(ctx.channel());
}
}
);
}
// this is called when the server receives a message from the connected client
public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
if("update".equals(msg)){
// then I need the retrieve the data created
// in the ChannelActive method.
clientData().update();
}
}
在浏览解决方案时,我发现了几个示例,其中开发人员使用缓存服务(如 memcache 或 redis)来存储和检索与连接的客户端相关的数据。
但我希望在不依赖外部进程的情况下解决这个问题。 有什么办法可以做到这一点?如有任何关于该主题的建议,我们将不胜感激。
谢谢
你应该使用 AttributeMap.attr(AttributeKey key),它被 ChannelHandlerContext
继承:
Storing stateful information
AttributeMap.attr(AttributeKey)
allow you to store and access stateful information that is related with a handler and its context. Please refer to ChannelHandler to learn various recommended ways to manage stateful information. [1]
[1][http://netty.io/4.0/api/io/netty/channel/ChannelHandlerContext.html]