我们将客户端对服务端发送的数据封装成MyRequest对象,服务端的回应封装成MyResponse对象,我们用Protostuff来序列化,底层通信实现采用Netty,实现心跳机制,当客户端一段时间没有向服务端发出请求就主动发一个PING过去,告诉服务端自己还活着,服务端接收后就回个PONG;服务端一段时间没收到请求就断开与客户端的长连接。
关于Protostuff的使用看这篇Protostuff序列化框架的使用及Objenesis的使用
我们将MyRequest,MyResponse,PING,PONG封装成Message,客户端服务端之间传输的数据类。
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
// 在我的项目里该类的无参构造器是必须的,
// 因为在反序列化时我用的是Java的反射机制来实例化
@NoArgsConstructor
@AllArgsConstructor
public class Message {
private byte type;
private RpcRequest request;
private RpcResponse response;
public Message(byte type) {
this.type = type;
}
public static Message buildRequest(RpcRequest request) {
return new Message(Message.REQUEST, request, null);
}
public static Message buildResponse(RpcResponse response) {
return new Message(Message.RESPONSE, null, response);
}
public static final byte PING = 1;
public static final byte PONG = 1 << 1;
public static final byte REQUEST = 1 << 2;
public static final byte RESPONSE = 1 << 3;
public static final Message PING_MSG = new Message(Message.PING);
public static final Message PONG_MSG = new Message(Message.PONG);
}
统一后我们只需在相应的编码器,解码器里对数据类型进行判断,再做相应的处理即可。
客户端的Netty代码:
this.bootstrap.group(group).channel(NioSocketChannel.class)