一、辅助类
package com.wallimn.iteye.netty.heart;
import java.net.InetSocketAddress;
import io.netty.util.AttributeKey;
/**
* 记录一些常量。真正的应用要从配置文件中读取。
*
*
*
时间:2019年9月14日 下午11:41:26,作者:wallimn
*/
public class Config {
private Config(){};
public static final AttributeKey SERVER_ADDR_ATTR=AttributeKey.newInstance("SERVER_ADDR_ATTR");
//原来打算将客户端的ID记录在Channel的属性中,后来发现对于UDP不适用。
//public static final AttributeKey CLIENT_ID=AttributeKey.newInstance("CLIENT_ID");
public static final int IDLE_TIME=5;//允许的发呆时间
public static final int SERVER_PORT=8585;
public static final String SERVER_IP="localhost";
public static final long CLIENT_VALID_THRESHOLD=5000;//客户端地址有效的时间阀值。单位为毫秒。
}
package com.wallimn.iteye.netty.heart;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentMap;
/**
* 用来模拟持有数据
*
*
*
时间:2019年9月14日 下午7:58:40,作者:wallimn
*/
public class DataHolder {
private DataHolder(){}
/**
* 记录客户端的消息
*/
public static ConcurrentLinkedQueue clientMessageQueue = new ConcurrentLinkedQueue();
/**
* 记录由心跳获取的客户端地址,用于服务器主动给客户端发消息
*/
public static ConcurrentMap clientInformationMap = new ConcurrentHashMap();
}
package com.wallimn.iteye.netty.heart;
import java.net.InetSocketAddress;
import java.util.Date;
import lombok.Data;
/**
* 客户端信息
*
*
*
时间:2019年9月14日 下午8:55:36,作者:wallimn
*/
@Data
public class ClientInformation {
/**
* 客户端唯一标识
*/
private String id;
/**
* 收到时间
*/
private Date recordTime;
/**
* 客户端地址,
*/
private InetSocketAddress address;
}
package com.wallimn.iteye.netty.heart;
import lombok.Data;
/**
* 客户端发来的消息
*
*
*
时间:2019年9月14日 下午8:55:36,作者:wallimn
*/
@Data
public class ClientMessage {
/**
* 消息
*/
private String message;
/**
* 客户端信息
*/
private ClientInformation client;
}
二、客户端代码
package com.wallimn.iteye.netty.heart;
import java.net.InetSocketAddress;
import java.util.UUID;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.Char