将ChannelId保存在netty 5.0中的实用方法是什么?

时间:2016-02-18 07:18:41

标签: java sockets netty serversocket socketchannel

我实现了一个带有netty 5.0的套接字服务器,用于客户端连接。 我需要始终与每个被叫方保持套接字连接,并发送消息以通知被叫方。 目前我有一个名为" ChannelMapper "的自定义类。它存储" MAC地址"和" ChannelId(as String)"作为DB中的关系记录。 (因为呼叫者只发送" MAC地址"被叫作为服务器的标识进行连接)

public ChannelMapper(String chid, String macAddr) {
    this.chid = chid;
    this.macAddr = macAddr;
}

每次被叫方连接到服务器时,它都会发送自己的MAC地址,然后服务器会存储一个自定义的" ChannelMapper "识别记录。我有一个" ChannelGroup "用于保持所有连接的套接字通道 而且我还有另一张地图来保持真实的" ChannelId "因为netty没有API来创建" ChannelId "对象的字符串形式为" ChannelId " ( channelId.asLongText()

public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
public static Map<String, ChannelId> mapChannels = new HashMap<>();

每次连接客户端时,它都会运行方法&#34; channelActive &#34;并将频道信息分别存储在数据库和地图中以备将来使用。

@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
    Channel channel = ctx.channel();
    ChannelId channelId = channel.id();
    String chid = channelId.asLongText();
    channels.add(channel);
    mapChannels.put(chid, channelId);
}

因此,如果服务器想通过套接字向客户端发送消息,我需要查询数据库以获得相应的&#34; ChannelId &#34;以String形式。然后得到实际的&#34; ChannelId &#34;对象存储在Map中,因为获取&#34; ChannelId &#34;的唯一方法是正在调用API&#34; 频道查找(ChannelId id)&#34;在&#34; ChannelGroup &#34;

ChannelMapper mapper = ChannelMapper.findByMac(macAddr);
if (mapper != null) {
    String chid = mapper.getChid();
    ChannelId channelId = mapChannels.get(chid);
    Channel channel = channels.find(channelId);
}

我想询问是否有更好的方法来存储和检索实际的&#34; 频道&#34;宾语?如果我将Map<String, ChannelId>更改为Map<String, Channel>以存储&#34; 频道&#34;会更好吗?直接?

0 个答案:

没有答案