gpt4 book ai didi

java - 如何在netty中存储带有用户名和ChannelHandlerContext的用户列表

转载 作者:行者123 更新时间:2023-12-02 04:32:31 31 4
gpt4 key购买 nike

我尝试向 netty 中的特定用户发送消息。为此,我需要将用户名和 CahnnelHandlerContext 存储在 Arralist 中,以便我可以检查用户是否连接到服务器并获取特定用户的 ChannelhandlerContext。

您能告诉我最佳实践吗?

这里是我处理连接的服务器的一些代码:

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.ssl.SslHandler;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import java.util.ArrayList;
import messages.SecureMessageServerClientMessage;
import messages.SecureMessageServerUser;

/**
* Handles a server-side channel.
*/
public class SecureChatServerHandler extends SimpleChannelInboundHandler<SecureMessageServerClientMessage> {

protected ArrayList<SecureMessageServerUser> userList = new ArrayList();

@Override
public void channelActive(final ChannelHandlerContext ctx) {
// Once session is secured, send a greeting and register the channel to the global channel
// list so the channel received the messages from others.
ctx.pipeline().get(SslHandler.class).handshakeFuture().addListener(
new GenericFutureListener<Future<Channel>>() {
@Override
public void operationComplete(Future<Channel> future) throws Exception {
userList.add(new SecureMessageServerUser("", ctx));
}
});
}

@Override
public void channelRead0(ChannelHandlerContext ctx, SecureMessageServerClientMessage msg ) throws Exception {
switch(msg.getType()){
case 0:
ctx.writeAndFlush(new SecureMessageServerClientMessage(0, this.userList));
break;
case 1:
System.out.println("TestMessage Typ 1");
String empfaenger, sender, message;
sender=msg.getSender();
empfaenger = msg.getEmpfaenger();
message = msg.getMessage();
for (SecureMessageServerUser user : this.userList) {
System.out.println(user.getUserName());
// if (user.getUserName().equals(empfaenger)) {
// user.getCtx().writeAndFlush(new SecureMessageServerClientMessage(1, message, sender));
// }
}
Thread.sleep(1000);
break;
case 2://User aus Liste löschen und alle Resorucen freigeben

case 3: //Liste mit allen Benutzern an Clienten senden
ctx.writeAndFlush(new SecureMessageServerClientMessage(0, this.userList));
break;
default:
System.out.println("Unbekannter Nachrichtentyp");
}
}

@Override
public void channelUnregistered(final ChannelHandlerContext ctx) {

}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}

最佳答案

我认为使用用户名作为键和 ChannelHandlerContext 作为值将其存储在 ConcurrentMap 中是最好的。另请注意,这实际上与 Netty 没有任何关系,它更多地涉及使用什么数据结构来存储从键到值的映射。

关于java - 如何在netty中存储带有用户名和ChannelHandlerContext的用户列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31243690/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com