当前位置:首页 > 天道酬勤 > 正文内容

java最新框架(java的ssm)

张世龙2021年12月20日 08:38天道酬勤1140

最近的项目需要功能点:商户端扫描客户的二维码,扫描结果呈现给商户和客户。

商户端的提示只要从比较容易处理的接口返回数据进行提示即可,但稍微麻烦的是用户清理后的提示。

解决方案有两种:

1、用户进行循环查询,每2秒进行一次接口查询,当接口有数据时,根据数据进行展示;

2 .客户机使用webSocket与服务器进行长时间的连接,有回复数据时提示。

两种方式都有实现,但简单说明一下1种方式的实现。 本篇将重点介绍两种方式的实现

轮询方式商户扫描代码,判断二维码信息的合法性,合法地进行扣款; 在扣款的同时将记录保存在redis中。 key是用户的标识信息,value是必须返回给用户的消息。 客户端轮询redis的数据,在数据返回时要求用户扣除结果。 该方法的服务资源消耗很大(仅供说明)。

webSocket的实现方式用户进入二维码的扫描接口,与服务器建立webSocket连接,服务端用map保存,key:用户识别value: session; 商户扫描代码后,在map中查找用户的session,并向用户发送消息; 前端收到webSocket的信息后,进行适当的展示. nginx配置

小程序的webSocket是https协议,我们的项目使用的是nginx传输。 需要配置nginx。 请粘贴nginx配置。

如果未配置nginx升级协议,则wss请求报告: errorduringwebsockethandshake 3360 unexpectedresponsecode 3360400

位置/web套接字/{2}的web套接字将根据自己的web套接字注释进行更改

映射$ http _升级$连接_升级{默认升级}; ' '关闭; 服务器443 SSL; 服务器名称你的域名; ssl on; SSL _认证中心/你的ssl pem.pem; sl _ certificate _密钥中心/你的SSL密钥.密钥; sl _会话时间输出5m; sl _ Ciphersecdhe-RSA-AE S128-GCM-SHA 2563360 ECD HE : ECDH : AES 3360 High : HIH : 空: 空: MD5: ADH: RC4; sl _ protocolstlsv1tlsv 1.1 tlsv 1.2; sl _首选项服务器芯片打开; 位置/{代理通路http://127.0.0.1:8089; 位置/web套接字/{代理_通过http://127.0.0.133608089; 代理版本1.1; 代理_集_标头升级$ http _升级; 代理集标头连接$连接_升级; } }maven依赖关系

从属关系数据库7.0 /版本控制数据库/范围/从属关系数据库- API /附属关系数据库7.0 /版本控制数据库/从属关系数据库

webSocket的路径包括用户标记{userId}和{carwashId},但是这个方法也是参考了大神,没有找到出处所以没有注明

import com.car wash.util .验证器实用程序; 导入javax.web套接字. *; 导入javax.web套接字.服务器.路径参数; 导入javax.web套接字.服务器.服务器端点; 导入Java.IO执行; import Java.util.concurrent.concurrent.concurrent快照; /** * @ServerEndpoint注释是类级注释,主要具有将当前类定义为websocket服务器端的功能。 * *注释的值用于接收用户连接的终端访问URL地址。 客户端在该URL上使用web套接字服务器端*/@ server endpoint (/web套接字/{ userid }/{ car wash id } ' )公共套接字套接字/静态私有静态在线计数=0; //concurrent包的线程安全设置。 存储与各客户端相对应的MyWebSocket对象。 服务器端要与单个客户机进行通信,请使用Map进行保存。 在这里,Key可以标识用户的私有静态冲突

HashMap<String, WebSocketTest> webSocketSet = new ConcurrentHashMap<String, WebSocketTest>(); //与某个客户端的连接会话,需要通过它来给客户端发送数据 private Session session; private String userIdCarwashId; /** * 连接建立成功调用的方法 * @param session 可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据 */ @OnOpen public void onOpen(Session session, @PathParam("userId") Integer userId, @PathParam("carwashId") Integer carwashId){ this.session = session; this.userIdCarwashId = userId + "_" + carwashId; webSocketSet.put(userIdCarwashId, this); //加入set中 addOnlineCount(); //在线数加1 System.out.println("有新连接加入!当前在线人数为" + getOnlineCount()); } /** * 连接关闭调用的方法 */ @OnClose public void onClose(){ webSocketSet.remove(this.userIdCarwashId); //从set中删除 subOnlineCount(); //在线数减1 System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount()); } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session 可选的参数 */ @OnMessage public void onMessage(String message, Session session) {// System.out.println("来自客户端的消息:" + message);// //群发消息// for(WebSocketTest item: webSocketSet){// try {// item.sendMessage(message);// } catch (IOException e) {// e.printStackTrace();// continue;// }// } } /** * 发生错误时调用 * @param session * @param error */ @OnError public void onError(Session session, Throwable error){ System.out.println("发生错误"); error.printStackTrace(); } /** * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。 * @param message * @throws IOException */ public static void sendMessage(String userIdCarwashId, String message) throws IOException{ System.out.println("当前在线用户数量: " + webSocketSet.size()); WebSocketTest userSocket = webSocketSet.get(userIdCarwashId); if(ValidatorUtil.isNotNull(userSocket)) { userSocket.session.getBasicRemote().sendText(message); } //this.session.getAsyncRemote().sendText(message); } public static synchronized int getOnlineCount() { return onlineCount; } public static synchronized void addOnlineCount() { WebSocketTest.onlineCount++; } public static synchronized void subOnlineCount() { WebSocketTest.onlineCount--; }}

还需要在springMvc.xml中增加包扫描

<context:component-scan base-package="com.carwash.websocket" />

调用发送消息的方法为

WebSocketTest.sendMessage(QRUserId + "_" + QRCarwashId, "0_扣费成功_剩余次数: " + restNumber);


小程序调试

在这里贴一下小程序的调试代码

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>

websocket.js

// pages/websocket/websocket.jsPage({ /** * 页面的初始数据 */ data: { }, connectWebsocket: function () { wx.connectSocket({ url: 'wss://你的域名/webSocket/17/2', data: { x: '1', y: '22' }, header: { 'content-type': 'application/json' }, method: "GET" }) wx.onSocketOpen(function (res) { console.log('WebSocket连接已打开!') }) wx.onSocketError(function (res) { console.log(res) console.log('WebSocket连接打开失败,请检查!') }) wx.onSocketMessage(function (res) { console.log('收到服务器内容:' + res.data) }) }})

商户扫码后的结果

到这里就大功告成了, 如有疑问可以留言

扫描二维码推送至手机访问。

版权声明:本文由花开半夏のブログ发布,如需转载请注明出处。

本文链接:https://www.zhangshilong.cn/work/25510.html

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。