再战websocket(上)微信小程序+Java后台

前往YXZ的博客了解更多

与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;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.http.server.ServletServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.HandshakeInterceptor;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
public class WebSocketInterceptor implements HandshakeInterceptor {
    private static final Logger LOGGER = LoggerFactory.getLogger(WebSocketInterceptor.class);
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        LOGGER.info("建立链接。");
        if (request instanceof ServletServerHttpRequest){
            ServletServerHttpRequest servletServerHttpRequest = (ServletServerHttpRequest)request;
            HttpServletRequest httpServletRequest = servletServerHttpRequest.getServletRequest();
        }
        return true;
    }
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {

    }
}

WebSocketPushHandler.java

package 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;

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    }

    @Override
    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());
        }

    }

    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        if (session.isOpen()){
            session.close();
        }
        LOGGER.info("退出系统");
    }

    @Override
    public boolean supportsPartialMessages() {
        return false;
    }
}

WebSocketDataHandler.java

package iguard.websocket.config;

import java.util.List;

public interface WebSocketDataHandler<R,P> {
    R getSendMsg(P p);
    List<R> getSendListMsg(P p);
}

WebSocketConfig.java

package 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.*;
@Configuration
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {

    @Override
    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.java

package 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);

    @Override
    public ReturnMsg getSendMsg(MonitorList monitorList) { //返回单个对象方法
        return  null;
    }

    @Override
    public List<ReturnMsg> getSendListMsg(MonitorList monitorList) {// 返回list对象方法
       return null;
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值