gpt4 book ai didi

java - 基于 ConcurrentHashMap 的 Netty ChannelGroup

转载 作者:行者123 更新时间:2023-11-30 07:04:26 27 4
gpt4 key购买 nike

我正在开发基于 netty 的多人游戏服务器。大多数传输到客户端的消息都是特定于单个客户端的但有时我需要向所有客户端广播相同的消息。

我不确定是否有充分的理由在我自己的 map 上使用 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() 中所做的那样也会是异步的吗?请注意,整个场景将由一个 channel /用户/线程触发。

我希望我的问题足够清楚。谢谢!

最佳答案

如你所见here , Netty默认写入一个组,又是一次简单的迭代。从这个意义上说,您的方法在性能和并发性方面应该没有差异。主要区别在于它将所有 futures 收集到一个 Map 中,这种分组可以帮助您跟踪提出的任何问题。但是,如果已经实现了,为什么还要使用您的代码呢?

关于java - 基于 ConcurrentHashMap 的 Netty ChannelGroup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27651590/

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