You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
203 lines
4.7 KiB
203 lines
4.7 KiB
package com.zc.websocket.util;
|
|
|
|
import com.zc.websocket.bo.ChannelProperty;
|
|
import com.google.gson.JsonObject;
|
|
import com.zc.websocket.constant.AttributeKeyConst;
|
|
import com.zc.websocket.constant.RequestObject;
|
|
import com.zc.websocket.handler.WebsocketEvent;
|
|
import io.netty.channel.Channel;
|
|
import io.netty.channel.group.ChannelGroup;
|
|
import io.netty.channel.group.DefaultChannelGroup;
|
|
import io.netty.util.concurrent.GlobalEventExecutor;
|
|
|
|
import java.util.ServiceLoader;
|
|
import java.util.logging.Logger;
|
|
|
|
/**
|
|
* @author Athena-xiepufeng
|
|
*/
|
|
public class MsgUtil {
|
|
|
|
private static final Logger log = Logger.getLogger(MsgUtil.class.getName());
|
|
|
|
public static ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
|
|
|
|
private static WebsocketEvent websocketEvent;
|
|
|
|
/**
|
|
* 获取消息的类型
|
|
*
|
|
* @param jsonObject
|
|
* @return
|
|
*/
|
|
public static String getJsonrpcType(JsonObject jsonObject)
|
|
{
|
|
|
|
if (null == jsonObject)
|
|
{
|
|
return null;
|
|
}
|
|
|
|
if (jsonObject.has(RequestObject.METHOD))
|
|
{
|
|
return RequestObject.METHOD;
|
|
}
|
|
|
|
if (jsonObject.has(RequestObject.PARAMS))
|
|
{
|
|
return RequestObject.PARAMS;
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
/**
|
|
* 根据 tokenSN 获取其绑定的 channel
|
|
*
|
|
* @param tokenSN
|
|
* @return
|
|
*/
|
|
public static Channel getChannelByTokenSN(String tokenSN)
|
|
{
|
|
if (tokenSN == null || tokenSN.trim().isEmpty())
|
|
{
|
|
log.warning("参数错误: tokenSN 不存在");
|
|
return null;
|
|
}
|
|
|
|
|
|
Channel channelTarget = null;
|
|
|
|
for (Channel channel : channels)
|
|
{
|
|
ChannelProperty channelProperty = channel.attr(AttributeKeyConst.CHANNEL_PROPERTY_KEY).get();
|
|
if (channelProperty == null || !tokenSN.equalsIgnoreCase(channelProperty.getTokenSN()))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
channelTarget = channel;
|
|
break;
|
|
}
|
|
|
|
if (channelTarget == null)
|
|
{
|
|
log.warning("Channel 绑定的 tokenSN:" + tokenSN + " 不存在");
|
|
return null;
|
|
}
|
|
|
|
return channelTarget;
|
|
}
|
|
|
|
/**
|
|
* 判断 http tokenSN 是否存在
|
|
*
|
|
* @param tokenSN
|
|
* @return
|
|
*/
|
|
public static String decryptToken(String tokenSN)
|
|
{
|
|
if (tokenSN == null || tokenSN.isEmpty())
|
|
{
|
|
log.warning("参数错误。 tokenSN 不存在l。");
|
|
return null;
|
|
}
|
|
|
|
if (null != websocketEvent)
|
|
{
|
|
return websocketEvent.decryptToken(tokenSN);
|
|
}
|
|
|
|
// 判断 tokenSN 是否存在
|
|
ServiceLoader<WebsocketEvent> load = ServiceLoader.load(WebsocketEvent.class);
|
|
|
|
if (!load.iterator().hasNext())
|
|
{
|
|
log.warning("WebsocketEvent没有实现类");
|
|
return null;
|
|
}
|
|
|
|
for (WebsocketEvent item : load)
|
|
{
|
|
websocketEvent = item;
|
|
return item.decryptToken(tokenSN);
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 判断 http tokenSN 是否存在
|
|
*
|
|
* @param tokenSN
|
|
* @return
|
|
*/
|
|
public static boolean isTokenSNExist(String tokenSN)
|
|
{
|
|
if (tokenSN == null || tokenSN.isEmpty())
|
|
{
|
|
log.warning("参数错误。 tokenSN 不存在l。");
|
|
return false;
|
|
}
|
|
|
|
if (null != websocketEvent)
|
|
{
|
|
return websocketEvent.isTokenSNExist(tokenSN);
|
|
}
|
|
|
|
// 判断 tokenSN 是否存在
|
|
ServiceLoader<WebsocketEvent> load = ServiceLoader.load(WebsocketEvent.class);
|
|
|
|
if (!load.iterator().hasNext())
|
|
{
|
|
log.warning("WebsocketEvent 没有实现类");
|
|
return false;
|
|
}
|
|
|
|
for (WebsocketEvent item : load)
|
|
{
|
|
websocketEvent = item;
|
|
return item.isTokenSNExist(tokenSN);
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* 心跳事件
|
|
*
|
|
* @param tokenSN
|
|
*/
|
|
public static void heartbeatEvent(String tokenSN)
|
|
{
|
|
if (tokenSN == null || tokenSN.isEmpty())
|
|
{
|
|
log.warning("参数错误。 tokenSN 不存在l。");
|
|
return;
|
|
}
|
|
|
|
if (null != websocketEvent)
|
|
{
|
|
websocketEvent.heartbeatEvent(tokenSN);
|
|
return;
|
|
}
|
|
|
|
ServiceLoader<WebsocketEvent> load = ServiceLoader.load(WebsocketEvent.class);
|
|
|
|
if (!load.iterator().hasNext())
|
|
{
|
|
log.warning("WebsocketEvent 没有实现类");
|
|
return;
|
|
}
|
|
|
|
for (WebsocketEvent item : load)
|
|
{
|
|
websocketEvent = item;
|
|
item.heartbeatEvent(tokenSN);
|
|
return;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|