与websocket比较有缘,经历过小程序+java和Angular+java之后整理出次最终教程
微信小程序
使用wx自带的websocket即可,
在你需要连接websocket的js里面加入下面代码// 建立连接
wx.connectSocket({
url: "ws://127.0.0.1:8080/ws/test" //连接服务器地址
})
//连接成功
wx.onSocketOpen(function () {
console.log('websocket连接成功!');
// 发送消息给服务器
wx.sendSocketMessage({
data: JSON.stringify({
id:"id"
}),
});
})
//接收数据
wx.onSocketMessage(function (data) {
console.log(data);
})
//连接失败
wx.onSocketError(function () {
console.log('websocket连接失败!');
})
Java后台
WebSocketInterceptor.java
package iguard.websocket.config; |
WebSocketPushHandler.javapackage iguard.websocket.config;
import java.util.List;
import iguard.core.util.JSONHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.socket.*;
public class WebSocketPushHandler<R,P> implements WebSocketHandler{
private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketPushHandler.class);
private WebSocketDataHandler<R,P> dataHandler;
public WebSocketPushHandler(WebSocketDataHandler<R,P> pdataHandler,Class<P> pp){
this.dataHandler = pdataHandler;
this.setP(pp);
}
private Class<P> getP() {
return p;
}
private void setP(Class<P> p) {
this.p = p;
}
private Class<P> p;
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
}
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
if (message.getPayloadLength()==0){
return;
}
try {
if(session.isOpen()){
P p = JSONHelper.jsonToBean(message.getPayload().toString(), this.getP());
LOGGER.info(p.toString());
if(session.getUri().equals("/ws/test")){// 返回list数据
List<R> r = dataHandler.getSendListMsg(p);
LOGGER.info(r.toString());
session.sendMessage(new TextMessage(JSONHelper.beanToJson(r)));
}else { // 返回单个对象数据
R r = dataHandler.getSendMsg(p);
LOGGER.info(r.toString());
session.sendMessage(new TextMessage(JSONHelper.beanToJson(r)));
LOGGER.info(JSONHelper.beanToJson(r));
}
LOGGER.info("发送成功。");
}
}catch (Exception e){
LOGGER.error("{},{}",e.getMessage(),e.getStackTrace());
}
}
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
}
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
if (session.isOpen()){
session.close();
}
LOGGER.info("退出系统");
}
public boolean supportsPartialMessages() {
return false;
}
}
WebSocketDataHandler.javapackage iguard.websocket.config;
import java.util.List;
public interface WebSocketDataHandler<R,P> {
R getSendMsg(P p);
List<R> getSendListMsg(P p);
}
WebSocketConfig.javapackage iguard.websocket.config;
import iguard.websocket.monitor.MonitorDataHandler;
import iguard.websocket.monitor.MonitorList;
import iguard.websocket.sleep.SleepDataHandler;
import iguard.websocket.sleep.UserDevice;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.*;
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(WebSocketPushHandler("/sleep"),"/sleep").addInterceptors(new WebSocketInterceptor()).setAllowedOrigins("*");
registry.addHandler(WebSocketPushHandler("/test"),"/test").addInterceptors(new WebSocketInterceptor()).setAllowedOrigins("*");
}
public WebSocketHandler WebSocketPushHandler(String url){
switch (url){
case "/test" : return new WebSocketPushHandler<>(new MonitorDataHandler(),MonitorList.class);
case "/sleep" : return new WebSocketPushHandler<>(new SleepDataHandler(),UserDevice.class);
default: return new WebSocketPushHandler<>(new SleepDataHandler(),UserDevice.class);
}
}
}
MonitorDataHandler.javapackage iguard.websocket.monitor;
import iguard.websocket.config.WebSocketDataHandler;
import iguard.core.entity.ReturnMsg;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
public class MonitorDataHandler implements WebSocketDataHandler<ReturnMsg,MonitorList> {
private static final Logger LOGGER = LoggerFactory.getLogger(MonitorDataHandler.class);
public ReturnMsg getSendMsg(MonitorList monitorList) { //返回单个对象方法
return null;
}
public List<ReturnMsg> getSendListMsg(MonitorList monitorList) {// 返回list对象方法
return null;
}
}