package com.easysocket; import com.easysocket.config.EasySocketOptions; import com.easysocket.connection.connect.SuperConnection; import com.easysocket.connection.connect.TcpConnection; import com.easysocket.entity.SocketAddress; import com.easysocket.interfaces.config.IConnectionSwitchListener; import com.easysocket.interfaces.conn.IConnectionManager; import com.easysocket.utils.LogUtil; import java.util.HashMap; import java.util.Map; /** * Author:Alex * Date:2019/6/4 * Note:socket连接管理器 */ public class ConnectionHolder { private volatile Map mConnectionManagerMap = new HashMap<>(); private static class InstanceHolder { private static final ConnectionHolder INSTANCE = new ConnectionHolder(); } public static ConnectionHolder getInstance() { return InstanceHolder.INSTANCE; } private ConnectionHolder() { mConnectionManagerMap.clear(); } /** * 移除某个连接 * * @param socketAddress */ public void removeConnection(SocketAddress socketAddress) { removeConnection(createKey(socketAddress)); } public void removeConnection(String socketAddress) { mConnectionManagerMap.remove(socketAddress); } /** * 获取指定SocketAddress的连接,参数配置使用默认的 * * @param address * @return */ public IConnectionManager getConnection(SocketAddress address) { return getConnection(createKey(address)); } public IConnectionManager getConnection(String address) { IConnectionManager manager = mConnectionManagerMap.get(address); if (manager == null) { return getConnection(address, EasySocketOptions.getDefaultOptions()); } else { return getConnection(address, manager.getOptions()); } } /** * 获取指定SocketAddress的连接 * * @param address * @param socketOptions * @return */ public IConnectionManager getConnection(SocketAddress address, EasySocketOptions socketOptions) { return getConnection(createKey(address),socketOptions); } public IConnectionManager getConnection(String address, EasySocketOptions socketOptions) { IConnectionManager manager = mConnectionManagerMap.get(address); if (manager != null) { // 有缓存 manager.setOptions(socketOptions); return manager; } else { return createNewManagerAndCache(address, socketOptions); } } /** * 创建新的连接并缓存 * * @param address * @param socketOptions * @return */ private IConnectionManager createNewManagerAndCache(SocketAddress address, EasySocketOptions socketOptions) { SuperConnection manager = new TcpConnection(address); // 创建连接管理器 manager.setOptions(socketOptions); // 设置参数 // 连接主机的切换监听 manager.setOnConnectionSwitchListener(new IConnectionSwitchListener() { @Override public void onSwitchConnectionInfo(IConnectionManager manager, SocketAddress oldAddress, SocketAddress newAddress) { // 切换了另外一个主机的连接,删除旧的连接和添加新的连接 synchronized (mConnectionManagerMap) { // 首先断开连接,销毁相关线程和资源 LogUtil.d("---> 首先断开连接,销毁相关线程和资源"); mConnectionManagerMap.get(createKey(oldAddress)).disconnect(false); mConnectionManagerMap.remove(createKey(oldAddress)); mConnectionManagerMap.put(createKey(newAddress), manager); } } }); synchronized (mConnectionManagerMap) { mConnectionManagerMap.put(createKey(address), manager); } return manager; } private IConnectionManager createNewManagerAndCache(String address, EasySocketOptions socketOptions) { return createNewManagerAndCache(createSocketAddress(address), socketOptions); } /** * @param socketAddress * @return */ private String createKey(SocketAddress socketAddress) { return socketAddress.getIp() + ":" + socketAddress.getPort(); } private SocketAddress createSocketAddress(String address) { String[] s = address.split(":"); return new SocketAddress(s[0], Integer.parseInt(s[1])); } }