我正在基于netty的多人游戏服务器上工作。传输给客户端的大多数消息都是特定于单个客户端的但有时我需要向所有客户端广播相同的消息。我不确定是否有充分的理由在我自己的地图上使用ChannelGroup。所以现在我有:public class GameSession { /* a map of all the players part of this game session */ private ConcurrentHashMap<String, PlayerHandler> players = new ConcurrentHashMap<String, PlayerHandler>(); private final ChannelGroup playersChannels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);PlayerHandler在哪里:public class PlayerHandler extends SimpleChannelInboundHandler<IncomingMessage>并包含有状态的成员变量。当新玩家加入时(经过某种逻辑后),他被添加到GameSession中:public void addPlayer(PlayerHandler p) { if (p.getGameSessionID().equals(this.gameId)) { players.put(p.getPlayerID(), p); //add this player to our game session playersChannels.add(p.getChannelFromCtx()); //get channel and add to ChannelGroup }}假设我想播放一条消息,因为玩家请求离开(或关闭连接)public void notifyPlayerLeft(String exPlayer) { //Broadcast message with the id of the player that left for (Map.Entry<String, PlayerHandler> entry : players.entrySet()) { PlayerHandler player = entry.getValue(); player.sendPlayerLeft(exPlayer); }}其中sendPlayerLeft()是一个简单的方法,其功能类似于:ctx.writeAndFlush(outgoingMsg)如果我使用ChannelGroup,则可以执行以下操作:playersChannels.writeAndFlush(outgoingMsg, matcher)但我不确定为什么这是一个更好的主意。 Netty指出它异步发生但由于PlayerHandler没有自己的线程,因此不会迭代对象就像我在NotifyPlayerLeft()中所做的一样,也会异步吗?请注意,整个场景将由一个通道/用户/线程触发。我希望我的问题很清楚。谢谢! 最佳答案 如您所见,,Netty的默认写入组还是一个简单的迭代。从这个意义上讲,您的方法在性能和并发性上应该没有差异。主要区别在于它将所有期货收集到地图中,此分组可以帮助您跟踪出现的任何问题。但是,如果已经实现了代码,为什么还要使用您的代码呢?
07-24 22:24