项目初版本已经告一段落,总结一下以作经验。
一、WebSocket
关于WebSocket也是首次接触的。WebSocket是作为服务端和客户端双向通信的,常用于多人聊天功能和监听数据库,即数据库有更新就推送数据至前端。本次项目就是运用WebSocket实现数据库有更新就推送数据至前端的功能,其中还有心跳重连机制。
关于WebSocket本次项目了解的也不深,主要是写了一个页面,其中包括@Onopen(开启连接的操作),@OnClose(连接关闭的操作),@OnMessage(发送消息的操作),@OnError(出错的操作)。
开启连接的时候,一般先会给客户端发送数据,如果是监听数据库的话,可以在开启连接的时候开启线程,通过比对数据库监听数据库,如果有后端操作数据库的话可以直接发送数据,不用监听数据库。
关闭连接的时候要记得remove连接。
onMessage的时候可以对接收的数据进行分类处理,一方面接收客户端(服务端)发送的消息,处理给前端发送最新数据;另一方面接收客户端发送的心跳,返回连接信息。剩下的都是自定义方法了。
webSocket代码:
@ServerEndpoint(value = "/websocket")
@Component
public class WebSocketServlet {
private DeviceLastDataService deviceLastDataService= (DeviceLastDataService)ApplicationContextUtils.getBeanByName("DeviceLastDataService");
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//用来存放每个客户端对应的MyWebSocket对象
private static CopyOnWriteArraySet<WebSocketServlet> webSocketSet = new CopyOnWriteArraySet<WebSocketServlet>();
private Session session = null;
/*
开启连接的操作
*/
@OnOpen
public void onOpen(Session session) throws IOException {
this.session = session;
webSocketSet.add(this);
System.out.println(webSocketSet);
try{
sendMessage();
}catch (IOException e){
e.printStackTrace();
}
}
/*
连接关闭的操作
*/
@OnClose
public void onClose(){
webSocketSet.remove(this);
}
/*
给服务器发送消息告知数据库的变化
*/
@OnMessage
public void onMessage(String message){
if(isTimestamp(message)){
System.out.println("发生变化的时间:"+message);
try{
sendNewMessage(message);
}catch (IOException e){
e.printStackTrace();
}
}else{
System.out.println("接收到客户端:"+session.getId()+"发送的消息"+message);
try{
session.getBasicRemote().sendText("heartbeat");//返回心跳信息
}catch (IOException e){
e.printStackTrace();
}
}
}
/*
出错的操作
*/
@OnError
public void onError(Throwable error){
System.out.println(error);
error.printStackTrace();
}
/*
自定义的方法,告诉前台数据库发生改变的数据
*/
public void sendMessage() throws IOException{
List<WarningResult> warningResults = deviceLastDataService.getWarnDeviceInfo();
JSONArray array=JSONArray.fromObject(warningResults);
String WarningData = array.toString();
session.getBasicRemote().sendText(WarningData);
}
/*
自定义的方法,告诉前台数据库最新发生改变的数据
*/
public void sendNewMessage(String currentTime) throws IOException{
List<WarningResult> warningResults = deviceLastDataService.getLastWarnDevice(currentTime);
JSONArray array=JSONArray.fromObject(warningResults);
String WarningData = array.toString();
//群发消息
for(WebSocketServlet item: webSocketSet){
item.session.getBasicRemote().sendText(WarningData);
}
}
public boolean isTimestamp(String str){
boolean convertSuccess = true;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
format.setLenient(false);
format.parse(str);
}catch (ParseException e){
convertSuccess = false;
}
return convertSuccess;
}
}
后端更新数据库的代码:
<