This commit is contained in:
wentch
2015-12-29 10:32:07 +08:00
parent 1b390df633
commit 867a0a2e98
5 changed files with 93 additions and 19 deletions

View File

@@ -67,6 +67,10 @@ public abstract class WebSocket {
Serializable _groupid; //不可能为空 Serializable _groupid; //不可能为空
SocketAddress _remoteAddress;//不可能为空
String _remoteAddr;//不可能为空
private final long createtime = System.currentTimeMillis(); private final long createtime = System.currentTimeMillis();
private final Map<String, Object> attributes = new ConcurrentHashMap<>(); private final Map<String, Object> attributes = new ConcurrentHashMap<>();
@@ -261,10 +265,26 @@ public abstract class WebSocket {
return _engine.node.sendMessage(groupid, recent, data, last); return _engine.node.sendMessage(groupid, recent, data, last);
} }
/**
* 获取在线用户的节点地址列表
*
* @param groupid
* @return
*/
protected final Collection<InetSocketAddress> getOnlineNodes(Serializable groupid) { protected final Collection<InetSocketAddress> getOnlineNodes(Serializable groupid) {
return _engine.node.getOnlineNodes(groupid); return _engine.node.getOnlineNodes(groupid);
} }
/**
* 获取在线用户的详细连接信息
*
* @param groupid
* @return
*/
protected final Map<InetSocketAddress, List<String>> getOnlineRemoteAddress(Serializable groupid) {
return _engine.node.getOnlineRemoteAddress(groupid);
}
/** /**
* 获取当前WebSocket下的属性 * 获取当前WebSocket下的属性
* <p> * <p>
@@ -316,6 +336,24 @@ public abstract class WebSocket {
return _sessionid; return _sessionid;
} }
/**
* 获取客户端直接地址, 当WebSocket连接是由代理服务器转发的则该值固定为代理服务器的IP地址
*
* @return
*/
public final SocketAddress getRemoteAddress() {
return _remoteAddress;
}
/**
* 获取客户端真实地址
*
* @return
*/
public final String getRemoteAddr() {
return _remoteAddr;
}
//------------------------------------------------------------------- //-------------------------------------------------------------------
/** /**
* 获取当前WebSocket所属的WebSocketGroup 不会为null * 获取当前WebSocket所属的WebSocketGroup 不会为null

View File

@@ -54,6 +54,7 @@ public abstract class WebSocketNode {
}); });
}); });
} }
protected abstract List<String> getOnlineRemoteAddresses(@DynTargetAddress InetSocketAddress targetAddress, Serializable groupid);
protected abstract int sendMessage(@DynTargetAddress InetSocketAddress targetAddress, Serializable groupid, boolean recent, Serializable message, boolean last); protected abstract int sendMessage(@DynTargetAddress InetSocketAddress targetAddress, Serializable groupid, boolean recent, Serializable message, boolean last);
@@ -63,15 +64,33 @@ public abstract class WebSocketNode {
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
/** /**
* 获取在线的节点地址列表 * 获取在线用户的节点地址列表
* *
* @param groupid * @param groupid
* @return * @return
*/ */
public Collection<InetSocketAddress> getOnlineNodes(Serializable groupid) { public Collection<InetSocketAddress> getOnlineNodes(final Serializable groupid) {
return source.getCollection(groupid); return source.getCollection(groupid);
} }
/**
* 获取在线用户的详细连接信息
*
* @param groupid
* @return
*/
public Map<InetSocketAddress, List<String>> getOnlineRemoteAddress(final Serializable groupid) {
Collection<InetSocketAddress> nodes = getOnlineNodes(groupid);
if(nodes == null) return null;
final Map<InetSocketAddress, List<String>> map = new HashMap();
for(InetSocketAddress nodeAddress : nodes) {
List<String> list = getOnlineRemoteAddresses(nodeAddress, groupid);
if(list == null) list = new ArrayList();
map.put(nodeAddress, list);
}
return map;
}
public final void connect(Serializable groupid, String engineid) { public final void connect(Serializable groupid, String engineid) {
if (finest) logger.finest(localSncpAddress + " receive websocket connect event (" + groupid + " on " + engineid + ")."); if (finest) logger.finest(localSncpAddress + " receive websocket connect event (" + groupid + " on " + engineid + ").");
Set<String> engineids = localNodes.get(groupid); Set<String> engineids = localNodes.get(groupid);

View File

@@ -98,6 +98,8 @@ public abstract class WebSocketServlet extends HttpServlet {
} }
final WebSocket webSocket = this.createWebSocket(); final WebSocket webSocket = this.createWebSocket();
webSocket._engine = engine; webSocket._engine = engine;
webSocket._remoteAddress = request.getRemoteAddress();
webSocket._remoteAddr = request.getRemoteAddr();
Serializable sessionid = webSocket.onOpen(request); Serializable sessionid = webSocket.onOpen(request);
if (sessionid == null) { if (sessionid == null) {
if (debug) logger.finest("WebSocket connect abort, Not found sessionid. request=" + request); if (debug) logger.finest("WebSocket connect abort, Not found sessionid. request=" + request);

View File

@@ -431,7 +431,7 @@ public class CacheSourceService<K extends Serializable, V extends Object> implem
} }
@ConstructorProperties({"cacheType", "expireSeconds", "lastAccessed", "key", "value"}) @ConstructorProperties({"cacheType", "expireSeconds", "lastAccessed", "key", "value"})
protected CacheEntry(CacheEntryType cacheType, int expireSeconds, int lastAccessed, K key, T value) { public CacheEntry(CacheEntryType cacheType, int expireSeconds, int lastAccessed, K key, T value) {
this.cacheType = cacheType; this.cacheType = cacheType;
this.expireSeconds = expireSeconds; this.expireSeconds = expireSeconds;
this.lastAccessed = lastAccessed; this.lastAccessed = lastAccessed;

View File

@@ -30,6 +30,21 @@ public class WebSocketNodeService extends WebSocketNode implements Service {
super.destroy(conf); super.destroy(conf);
} }
@Override
public List<String> getOnlineRemoteAddresses(@DynTargetAddress InetSocketAddress targetAddress, Serializable groupid) {
if (localSncpAddress != null && !localSncpAddress.equals(targetAddress)) return null;
final Set<String> engineids = localNodes.get(groupid);
if (engineids == null || engineids.isEmpty()) return null;
final List<String> rs = new ArrayList<>();
for (String engineid : engineids) {
final WebSocketEngine engine = engines.get(engineid);
if (engine == null) continue;
final WebSocketGroup group = engine.getWebSocketGroup(groupid);
group.getWebSockets().forEach(x -> rs.add(x.getRemoteAddr()));
}
return rs;
}
@Override @Override
public int sendMessage(@DynTargetAddress InetSocketAddress addr, Serializable groupid, boolean recent, Serializable message, boolean last) { public int sendMessage(@DynTargetAddress InetSocketAddress addr, Serializable groupid, boolean recent, Serializable message, boolean last) {
final Set<String> engineids = localNodes.get(groupid); final Set<String> engineids = localNodes.get(groupid);