我实现了一个带有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;会更好吗?直接?