Netty框架服务端主动向客户端通信

来源:互联网 发布:求免费数据恢复软件 编辑:程序博客网 时间:2024/06/05 18:50

项目场景:

一个车联网项目,很多很多台车辆会定时像服务端发包,所以都是使用TCP长连接的方式。现在有一个需求是,服务端需要向客户端主动的发送升级命令,由于使用的事件驱动的Netty框架,我们怎么才能由服务端主动的向客服端通信呢?

解决方案:

package cn.ac.yangge.domain;import io.netty.channel.Channel;import java.util.HashMap;/** * Created by yangge on 2017/11/15 0015. */public class ChannelMap {    public static int channelNum=0;    private static HashMap<String,Channel> channelHashMap=null;    public static HashMap<String, Channel> getChannelHashMap() {        return channelHashMap;    }    public static Channel getChannelByName(String name){        if(channelHashMap==null||channelHashMap.isEmpty()){            return null;        }        return channelHashMap.get(name);    }    public static void addChannel(String name,Channel channel){        if(channelHashMap==null){            channelHashMap=new HashMap<>(100);        }        channelHashMap.put(name,channel);        channelNum++;    }    public static int removeChannelByName(String name){        if(channelHashMap.containsKey(name)){            channelHashMap.remove(name);            return 0;        }else{            return 1;        }    }}

首先创建一个Map用来存储各个连接的Channel。
当有连接建立时,调用addChannel()方法:

 ChannelMap.addChannel(name,ctx.channel());

当需要使用的时候使用getChannelByName()方法:

Channel channel=ChannelMap.getChannelByName(name);if(channel.isActive()){    channel.writeAndFlush(byteBuf);}else{    return 2;//不在线}

这里又有一个问题,什么时候将Channel清除出map呢?
我也懒得到处去写判断逻辑了,选择了一个比较暴力的方法:定时遍历
每隔5分钟就遍历一次所有的Channel调用channel.isActive();方法,当它为true时保留,当其为false时,remove掉Channel,并更新数据库里的设备状态。
还有每次服务启动的时候将数据库里的所有设备状态初始化一下。

阅读全文
0 0