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

标签 java netty nio

我尝试向 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/

相关文章:

java - 我将如何覆盖独立项目中另一个插件提供的任务? Gradle

java - Netty:处理许多不同的数据包类型

java - 从 Netty SocketServer 获取日期

java - netty 4 泄漏 : ByteBuf was GC'd before being released correctly

java - 如何将 File.setReadable 映射到 NIO Path 操作

java - 将 SeekableByteChannel 转换为 FileChannel

java - 使用 java.nio 移动文件时出现问题

java - 尝试计算文件中单词数列表时出现运行时错误

java - 可重入ReadWriteLock限制

java - 在java中拆分字符串并打印内容