微信小程序 websocket 实现SpringMVC+Spring+Mybatis


Posted in Javascript onAugust 04, 2017

微信小程序实现websocket步骤:

后台:

1. 添加maven依赖
 2. 创建握手
 3. 创建处理器
 4. spring配置(xml配置或javabean方式配置任选一种)

微信小程序:

1. 书写连接

java后台

1.添加maven依赖

<!-- websocket -->
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-messaging</artifactId>
    <version>${spring.version}</version>
  </dependency>

  <!-- 其中spring版本 -->
  <!-- 注意spring版本一定要为4以上版本 -->
  <spring.version>4.3.7.RELEASE</spring.version>

2.创建握手

package com.ahutshop.websocket;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;
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;

/**
 * 此类用来获取登录用户信息并交由websocket管理
 */
public class MyWebSocketInterceptor implements HandshakeInterceptor {

  @Override
  public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse arg1, WebSocketHandler arg2,
      Map<String, Object> arg3) throws Exception {
    // 将ServerHttpRequest转换成request请求相关的类,用来获取request域中的用户信息
    if (request instanceof ServletServerHttpRequest) {
      ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
      HttpServletRequest httpRequest = servletRequest.getServletRequest();

    }

    System.out.println("连接到我了");

    return true;
  }

  @Override
  public void afterHandshake(ServerHttpRequest arg0, ServerHttpResponse arg1, WebSocketHandler arg2, Exception arg3) {
    // TODO Auto-generated method stub

  }

}

3.创建处理器

package com.ahutshop.websocket;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.WebSocketMessage;
import org.springframework.web.socket.WebSocketSession;

public class WebSocketPushHandler implements WebSocketHandler {
  private static final List<WebSocketSession> users = new ArrayList<>();

  // 用户进入系统监听
  @Override
  public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    System.out.println("成功进入了系统。。。");
    users.add(session);

    sendMessagesToUsers(new TextMessage("今天晚上服务器维护,请注意"));
  }

  //
  @Override
  public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
    // 将消息进行转化,因为是消息是json数据,可能里面包含了发送给某个人的信息,所以需要用json相关的工具类处理之后再封装成TextMessage,
    // 我这儿并没有做处理,消息的封装格式一般有{from:xxxx,to:xxxxx,msg:xxxxx},来自哪里,发送给谁,什么消息等等
    // TextMessage msg = (TextMessage)message.getPayload();
    // 给所有用户群发消息
    //sendMessagesToUsers(msg);
    // 给指定用户群发消息
    //sendMessageToUser(userId, msg);

  }

  // 后台错误信息处理方法
  @Override
  public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {

  }

  // 用户退出后的处理,不如退出之后,要将用户信息从websocket的session中remove掉,这样用户就处于离线状态了,也不会占用系统资源
  @Override
  public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
    if (session.isOpen()) {
      session.close();
    }
    users.remove(session);
    System.out.println("安全退出了系统");

  }

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

  /**
   * 给所有的用户发送消息
   */
  public void sendMessagesToUsers(TextMessage message) {
    for (WebSocketSession user : users) {
      try {
        // isOpen()在线就发送
        if (user.isOpen()) {
          user.sendMessage(message);
        }
      } catch (IOException e) {
        e.printStackTrace();
      }
    }
  }

  /**
   * 发送消息给指定的用户
   */
  public void sendMessageToUser(String userId, TextMessage message) {
    for (WebSocketSession user : users) {
      if (user.getAttributes().get("").equals(userId)) {
        try {
          // isOpen()在线就发送
          if (user.isOpen()) {
            user.sendMessage(message);
          }
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
  }
}

4.spring配置

javabean方式配置(推荐)

package com.ahutshop.websocket;

import org.springframework.context.annotation.Bean;
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.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;

@Configuration
@EnableWebSocket
public class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
  @Override
  public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

    registry.addHandler(WebSocketPushHandler(), "/webSocketServer.action").addInterceptors(new MyWebSocketInterceptor()).setAllowedOrigins("*");
    registry.addHandler(WebSocketPushHandler(), "/sockjs/webSocketServer.action")
        .addInterceptors(new MyWebSocketInterceptor()).withSockJS();
  }

  @Bean
  public WebSocketHandler WebSocketPushHandler() {
    return new WebSocketPushHandler();
  }

}

spring.xml中配置扫描包
<!-- 扫描包 -->
<context:component-scan base-package="com.ahutshop.websocket" />

注意:

1. /webSocketServer.action之所以要加上.action的后缀,是因为web.xmlk中配置了拦截的后缀名为.action

<!-- springmvc模块 -->
<servlet>
  <servlet-name>DispatcherServlet</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:springmvc.xml</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
  <!-- 支持异步 -->
  <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
  <servlet-name>DispatcherServlet</servlet-name>
  <url-pattern>*.action</url-pattern> 
</servlet-mapping>

2 .setAllowedOrigins(“*”)中的*代表合法的请求域名,该方法接受一个可变数组作为参数,一定要配置,不然会请求时会出现403

xml方式配置(省略)

微信小程序

1.websocket.wxml

<!--pages/websocket/websocket.wxml-->
<view class="page">
 <view class="page__hd">
 </view>
 <view class="page__bd">

 <button bindtap="connectWebsocket" type="primary">连接websocket</button>

 </view>
</view>

2.websocket.js

// pages/websocket/websocket.js
Page({

 /**
  * 页面的初始数据
  */
 data: {

 },
 connectWebsocket: function () {
  wx.connectSocket({
   url: 'ws://localhost:8080/AhutShop/webSocketServer.action',
   data: {
   },
   header: {
    'content-type': 'application/json'
   },
   method: "GET"
  })
  wx.onSocketOpen(function (res) {
   console.log('WebSocket连接已打开!')
  })
  wx.onSocketError(function (res) {
   console.log('WebSocket连接打开失败,请检查!')
  })
  wx.onSocketMessage(function (res) {
   console.log('收到服务器内容:' + res.data)
  })
 }
})

运行效果

微信小程序 websocket 实现SpringMVC+Spring+Mybatis

以上就是微信小程序 后台的建立,如有疑问请留言或者到本站社区交流讨论,本站关于微信小程序的文章还有很多,希望大家多多搜索查阅,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
利用javascript实现web页面中指定区域打印
Oct 30 Javascript
js中confirm实现执行操作前弹出确认框的方法
Nov 01 Javascript
详细解密jsonp跨域请求
Apr 15 Javascript
javascript动态创建链接的方法
May 13 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
May 25 Javascript
Highcharts入门之基本属性
Aug 02 Javascript
js完整倒计时代码分享
Sep 18 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
jQuery Chosen通用初始化
Mar 07 Javascript
jquery实现一个全局计时器(商城可用)
Jun 30 jQuery
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
Mar 01 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
Aug 18 Javascript
Angular实现响应式表单
Aug 04 #Javascript
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 #Javascript
jQuery选取所有复选框被选中的值并用Ajax异步提交数据的实例
Aug 04 #jQuery
JavaScript正则表达式校验与递归函数实际应用实例解析
Aug 04 #Javascript
js模拟百度模糊搜索的实例
Aug 04 #Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 #Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 #Javascript
You might like
PHP操作文件方法问答
2007/03/16 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
PHP中Session可能会引起并发问题
2015/06/26 PHP
从刷票了解获得客户端IP的方法
2015/09/21 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
web前端开发也需要日志
2010/12/09 Javascript
关于js日期转化为毫秒数“节省20%的效率和和节省9个字符“问题
2012/03/01 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
详解js实现线段交点的三种算法
2016/08/09 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
2016/08/31 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
原生js中ajax访问的实例详解
2017/09/19 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
JavaScript中作用域链的概念及用途讲解
2020/08/06 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
用Python实现换行符转换的脚本的教程
2015/04/16 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python 解决中文写入Excel时抛异常的问题
2018/05/03 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
在keras下实现多个模型的融合方式
2020/05/23 Python
python3代码中实现加法重载的实例
2020/12/03 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
个人收入证明范本
2014/01/12 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
分层教学实施方案
2014/03/19 职场文书
六年级学生期末评语
2014/12/26 职场文书
家长通知书家长意见
2014/12/30 职场文书
旷工检讨书1000字
2015/01/01 职场文书
维稳承诺书
2015/01/20 职场文书
Django操作cookie的实现
2021/05/26 Python