一、WebSocket请求内容定义
约定WebSocket请求内容,如下是我们约定的内容:
{"reqType":1000,"handleType":1,"token":"" ,"param":{"id":1218, "type":2, "param":"0.1"}}
{"reqType":1001,"handleType":1,"token":"" ,"param":{"id":1218, "type":2}}
其中reqType是唯一标示每个请求,可以理解为ID,可以定义一个枚举:
public enum ModuleEnum {
CONTRACT_USER_GENERAL("用户合约概要信息", 1000),
CONTRACT_USER_POSITION("用户持仓", 1001);
@Getter@Setter
private String name;
@Getter@Setter
private int code;
ModuleEnum(String name, int code) {
this.name = name;
this.code = code;
}
}
handleType用来标示是查询、订阅还是取消订阅,也可以定义一个枚举:
public enum WsHandleTypeEnum {
Query(1,"查询+订阅"),
Subscribe(2,"订阅"),
UnSubscribe(3,"取消订阅"),
OnlyQuery(4,"查询不订阅");
@Getter@Setter
private Integer code;
@Getter@Setter
private String desc;
WsHandleTypeEnum(Integer code, String desc) {
this.code = code;
this.desc = desc;
}
}
其他的参数根据你们的业务需要去定义即可。reqType和handleType我感觉一般都需要的。
二、WebSocket单独部署
为了提升WebSocket的性能,以及提高部署WebSocket应用的服务器的利用率,需要把WebSocket功能单独提为一个应用。
三、使用Netty
Spring整合Netty、WebSocket还是很方便的。
四、WebSocket加入心跳包防止自动断开连接
每隔X分钟客户端自动发送ping消息给服务端,服务端不需要处理,直接返回即可解决自动断开的问题。
private void doHandlerWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame msg) {
// 判断msg 是哪一种类型 分别做出不同的反应
if (msg instanceof CloseWebSocketFrame) {
LOGGER.error("ws>>【关闭】");
ReferenceCountUtil.retain(msg);
handshaker.close(ctx.channel(), (CloseWebSocketFrame) msg);
return;
}
if (msg instanceof PingWebSocketFrame) {
LOGGER.info("【ping】");
PongWebSocketFrame pong = new PongWebSocketFrame(msg.content().retain());
ctx.channel().writeAndFlush(pong);
return;
}
if (msg instanceof PongWebSocketFrame) {
// LOGGER.info("【pong】");
// PingWebSocketFrame ping = new PingWebSocketFrame(msg.content().retain());
// ctx.channel().writeAndFlush(ping);
return;
}
// 其他处理
}
五、在线测试的ws
一直在用这个,推荐下。