您的位置:首页 > 其它

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

2017-11-20 19:44 459 查看

项目场景:

一个车联网项目,很多很多台车辆会定时像服务端发包,所以都是使用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,并更新数据库里的设备状态。

还有每次服务启动的时候将数据库里的所有设备状态初始化一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐