JAVA中的TTL

DatagramSocket与MulticastSocket之TTL

最近项目中需要使用UDP向目标系统发送TS指令,故果断采用了DatagramSocket
在一切调试正常之后部署到局方却发现,目标系统怎么都收不到发出去的指令
在经过一番折腾之后,使用wireshark抓包,对发出的TS指令进行了详细排查,发现使用DatagramSocket默认的TTL为1,而局方的网络又较为复杂,瞬间觉着不懂网络的程序员真的很可怕
通过查看javadoc发现,DatagramSocket并不支持TTL的设置(又或者是本人才疏学浅),最后换做了MulticastSocket
对于DatagramSocket及MulticastSocket的使用本文不做介绍,只阐述TTL的问题以备查阅。

    /**
     * <pre>
     * MulticastSocket代码片段
     * </pre>
     *
     * @author  ManerFan 2015年7月4日
     * @throws  IOException 
     */
    @PostConstruct
    public void init() throws IOException {
        try {
            /* 指定本地网卡 端口随系统分配 */
            socket = new MulticastSocket(new InetSocketAddress(localHost, 0));
        } catch (IOException e) {
            /* 如果绑不上指定网卡,就绑定默认网卡 */
            LOGGER.error("Cannot Bind {}.", localHost, e);
            socket = new MulticastSocket();
        }

        socket.setTimeToLive(64); /* 设置TTL */
        socket.setSendBufferSize(SEND_BUFFER_SIZE); /* 设置缓存 */
    }

wirshark

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java TTLCache 是一个可以自动过期的缓存工具类,可以用于保存一些临时数据,数据在指定的时间后自动从缓存删除,以避免占用过多的内存。 下面是一个简单的实现示例: ```java import java.util.Map; import java.util.HashMap; public class TTLCache<K, V> { private Map<K, CacheEntry<V>> cache = new HashMap<>(); public synchronized void put(K key, V value, long ttl) { long expiryTime = System.currentTimeMillis() + ttl; CacheEntry<V> entry = new CacheEntry<>(value, expiryTime); cache.put(key, entry); } public synchronized V get(K key) { CacheEntry<V> entry = cache.get(key); if (entry == null) { return null; } if (entry.expired()) { cache.remove(key); return null; } return entry.value; } private static class CacheEntry<V> { private V value; private long expiryTime; public CacheEntry(V value, long expiryTime) { this.value = value; this.expiryTime = expiryTime; } public boolean expired() { return System.currentTimeMillis() >= expiryTime; } } } ``` 这个类使用了一个 HashMap 来保存缓存数据,当数据过期时,会自动从 HashMap 删除。put 方法用来向缓存添加数据,ttl 参数表示数据的过期时间(以毫秒为单位)。get 方法用来获取缓存的数据,如果数据过期或者不存在,返回 null。为了保证线程安全,这个类使用了 synchronized 关键字。 这只是一个简单的实现示例,实际使用可能需要添加更多的功能,比如清空缓存、设置默认的过期时间等。 ### 回答2: Java TTLCache是一种具有过期时间的缓存实现。下面是一个简单的实现示例: 首先,我们需要一个存储键值对的容器来表示缓存。可以使用HashMap来保存键值对,并且在每个值上存储一个表示过期时间的时间戳。 ```java import java.util.HashMap; public class TTLCache<K, V> { private HashMap<K, CacheObject> cache; public TTLCache() { cache = new HashMap<>(); } public synchronized void put(K key, V value, long ttl) { long expirationTime = System.currentTimeMillis() + ttl; cache.put(key, new CacheObject(value, expirationTime)); } public synchronized V get(K key) { CacheObject obj = cache.get(key); if (obj != null && obj.expirationTime >= System.currentTimeMillis()) { return obj.value; } return null; } private class CacheObject { private V value; private long expirationTime; public CacheObject(V value, long expirationTime) { this.value = value; this.expirationTime = expirationTime; } } } ``` 在上面的示例,我们定义了一个TTLCache类,使用HashMap作为内部存储。构造函数初始化了缓存容器。 put方法用于向缓存放入一个键值对,并指定过期时间。它首先计算出过期时间戳,然后将键和包含值和过期时间的CacheObject对象存储到HashMap。 get方法用于从缓存获取一个值。它首先检查键是否存在于缓存,并且检查该值的过期时间是否大于当前时间。如果是,那么返回对应的值,否则返回null。 注意,这里的put和get方法都使用了synchronized关键字来确保线程安全。 这只是一个简单的TTLCache示例,你可以根据自己的需求进行扩展和改进。例如,可以实现自动清理过期键值对的功能,以及引入LRU缓存策略等。 ### 回答3: Java TTLCache是一个带有时间限制的缓存实现,它会在一段特定的时间内存储数据,并在超过该时间后自动删除数据。下面是一个简单的Java TTLCache的实现例子: ```java import java.util.HashMap; import java.util.Map; public class TTLCache<K, V> { private final long timeToLive; // 缓存数据的时间限制 private final Map<K, CacheObject<V>> cacheMap; // 用于存储缓存数据的Map // 定义缓存数据对象,保存数据和数据创建时间 private static class CacheObject<T> { private final T data; private final long createTime; public CacheObject(T data) { this.data = data; this.createTime = System.currentTimeMillis(); } } public TTLCache(long timeToLive) { this.timeToLive = timeToLive; this.cacheMap = new HashMap<>(); } public synchronized void put(K key, V value) { cacheMap.put(key, new CacheObject<>(value)); } public synchronized V get(K key) { CacheObject<V> cacheObject = cacheMap.get(key); if (cacheObject == null) { return null; } long currentTime = System.currentTimeMillis(); // 如果数据超过时间限制,则移除数据并返回null if (currentTime - cacheObject.createTime > timeToLive) { cacheMap.remove(key); return null; } return cacheObject.data; } public synchronized void remove(K key) { cacheMap.remove(key); } public synchronized void clear() { cacheMap.clear(); } public synchronized int size() { return cacheMap.size(); } } ``` 上述实现,我们使用了一个HashMap来存储缓存数据,并使用泛型来支持不同类型的数据。在CacheObject类,我们保存了数据的创建时间,然后在get方法判断数据是否超过了时间限制,如果超过则移除数据并返回null。最后我们提供了一些基本的方法,如添加数据的put方法,获取数据的get方法,移除指定数据的remove方法,清空所有数据的clear方法以及获取缓存大小的size方法。 使用这个TTLCache,我们可以简单地使用如下代码进行缓存操作: ```java TTLCache<String, Integer> cache = new TTLCache<>(1000); // 设置缓存时间为1秒 cache.put("key1", 10); cache.put("key2", 20); Integer value1 = cache.get("key1"); // 获取数据,返回10 Integer value2 = cache.get("key2"); // 获取数据,返回20 Thread.sleep(2000); // 等待2秒,超过缓存时间限制 Integer value3 = cache.get("key1"); // 获取数据,返回null,因为数据已经过期 ``` 通过使用Java TTLCache,我们可以实现一个简单的带有时间限制的缓存,并根据业务需求自定义缓存的时间限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值