Java 多个游戏会话

Java 多个游戏会话,java,netty,Java,Netty,我开始使用Netty,但还没有想到如何设置我的协议 我试图实现的是在一台服务器上处理多个游戏会话 ChannelGroup类对我的场景非常有帮助,但我想知道,例如,当列表上同时发出多个操作时,如何在服务器不抛出ConcurrentModificationException的情况下设置游戏会话列表 public class GameSession { int id; ChannelGroup channels; } public class MyServerHandler ext

我开始使用Netty,但还没有想到如何设置我的协议

我试图实现的是在一台服务器上处理多个游戏会话

ChannelGroup
类对我的场景非常有帮助,但我想知道,例如,当列表上同时发出多个操作时,如何在服务器不抛出
ConcurrentModificationException的情况下设置游戏会话列表

public class GameSession {
    int id;
    ChannelGroup channels;
}

public class MyServerHandler extends ChannelHandlerAdapter{
    private List<GameSession> sessions;

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if(msg.equals(CREATE_ROOM))
        {
            sessions.add(new GameSession());
        }
        else if(msg.equals(JOIN_ROOM))
        {
            // look for specific room...
            // loop here can collide with the above block and throw ConcurrentModificationException  
        }
    }
}
公共类游戏会话{
int-id;
信道组信道;
}
公共类MyServerHandler扩展了ChannelHandlerAdapter{
非公开名单会议;
@凌驾
public void channelRead(ChannelHandlerContext ctx,Object msg)引发异常{
如果(消息等于(创建房间))
{
添加(新GameSession());
}
else if(消息等于(加入房间))
{
//寻找特定的房间。。。
//这里的循环可能与上面的块冲突并抛出ConcurrentModificationException
}
}
}

我想得对吗?如何实现这种行为?

您可以将GameSession对象保存在从频道到GameSession的映射中

public class MyServerHandler extends ChannelHandlerAdapter{
    private Map<Channel, GameSession> sessions;

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        if(msg.equals(CREATE_ROOM))
        {
            sessions.put(ctx.channel(), new GameSession());
        }
        else if(msg.equals(JOIN_ROOM))
        {
            GameSession session = sessions.get(ctx.channel());
            // Could check if the key exists, or if the session is null, etc.
        }
    }
}
公共类MyServerHandler扩展了ChannelHandlerAdapter{
私人地图会议;
@凌驾
public void channelRead(ChannelHandlerContext ctx,Object msg)引发异常{
如果(消息等于(创建房间))
{
sessions.put(ctx.channel(),newGameSession());
}
else if(消息等于(加入房间))
{
GameSession session=sessions.get(ctx.channel());
//可以检查密钥是否存在,或者会话是否为空,等等。
}
}
}

ChannelGroup是线程安全的,但列表对象不是。尝试使用Collections.synchronizedList()。对于每个游戏会话,您将有多个频道???@Hector yes。每个会话都有自己的ChannelGroup