diff --git a/nxhs-service/pom.xml b/nxhs-service/pom.xml
index 4f4fbae..f45ea95 100644
--- a/nxhs-service/pom.xml
+++ b/nxhs-service/pom.xml
@@ -58,6 +58,10 @@
mybatis-plus-join-core
1.4.10
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
diff --git a/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java b/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java
index db8a86a..5e1de22 100644
--- a/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java
+++ b/nxhs-service/src/main/java/cc/yunxi/config/WebMvcConfig.java
@@ -50,7 +50,7 @@ public class WebMvcConfig implements WebMvcConfigurer {
"/upload/**",
"/qrcode/**.txt",
"/wx-message/**",//微信消息推送验证
- "/wx-message/**",//微信消息推送验证
+ "/webSocketServer/**",//socket通信
"/doc.html"
);
diff --git a/nxhs-service/src/main/java/cc/yunxi/config/WebSocketConfig.java b/nxhs-service/src/main/java/cc/yunxi/config/WebSocketConfig.java
new file mode 100644
index 0000000..9f367a8
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/config/WebSocketConfig.java
@@ -0,0 +1,22 @@
+package cc.yunxi.config;
+
+import cc.yunxi.utils.WsSocketHandler;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.config.annotation.EnableWebSocket;
+import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
+import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
+
+import javax.annotation.Resource;
+
+@Configuration
+@EnableWebSocket
+public class WebSocketConfig implements WebSocketConfigurer {
+
+ @Resource
+ private WsSocketHandler wsSocketHandler;
+
+ @Override
+ public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
+ registry.addHandler(wsSocketHandler, "/webSocketServer").setAllowedOrigins("*");
+ }
+}
diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java b/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java
index 2a1c51d..b3019a5 100644
--- a/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java
+++ b/nxhs-service/src/main/java/cc/yunxi/controller/WxMessageController.java
@@ -2,10 +2,10 @@ package cc.yunxi.controller;
import cc.yunxi.common.domain.CommonResult;
-import cc.yunxi.domain.vo.vxmessage.AccessToken;
-import cc.yunxi.domain.vo.vxmessage.MessageTemplate;
-import cc.yunxi.domain.vo.vxmessage.OrderNew;
-import cc.yunxi.domain.vo.vxmessage.ResultVo;
+import cc.yunxi.domain.vo.socket.MessageTypeEnum;
+import cc.yunxi.domain.vo.socket.SocketMessage;
+import cc.yunxi.domain.vo.vxmessage.*;
+import cc.yunxi.service.IWsService;
import cc.yunxi.utils.VerifyUtil;
import cc.yunxi.utils.WeChatMessageUtil;
import cc.yunxi.utils.WeChatUtil;
@@ -13,9 +13,11 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
+import java.io.IOException;
@Api(tags = "对接微信推送认证")
@RestController
@@ -26,7 +28,8 @@ public class WxMessageController {
@Resource
private WeChatMessageUtil weChatMessageUtil;
-
+ @Resource
+ private IWsService wsService;
@Resource
private VerifyUtil verifyUtil;
@@ -79,15 +82,15 @@ public class WxMessageController {
//散户端端接收微信平台消息
@PostMapping("/clientReceive")
public String clientReceive(@RequestParam("timestamp") String timestamp,
- @RequestParam("nonce") String nonce,
- @RequestParam("openid") String openid,
- @RequestParam("encrypt_type") String encryptType,
- @RequestParam("msg_signature") String msgSignature,
- @RequestBody String encryptedData) {
+ @RequestParam("nonce") String nonce,
+ @RequestParam("openid") String openid,
+ @RequestParam("encrypt_type") String encryptType,
+ @RequestParam("msg_signature") String msgSignature,
+ @RequestBody String encryptedData) {
JSONObject _encryptedData = JSONUtil.parseObj(encryptedData);
String encrypt = _encryptedData.getStr("Encrypt");
log.info("微信推送验证");
- boolean isOfficial = verifyUtil.checkSignature("client", timestamp, nonce, encrypt,msgSignature);
+ boolean isOfficial = verifyUtil.checkSignature("client", timestamp, nonce, encrypt, msgSignature);
if (!isOfficial) {
log.error("接收推送消息失败!非官方推送,{},{},{},{}", timestamp, nonce, encrypt, msgSignature);
return "error";
@@ -101,15 +104,15 @@ public class WxMessageController {
//回收端接收微信平台消息
@PostMapping("/recyclerReceive")
public String recyclerReceive(@RequestParam("timestamp") String timestamp,
- @RequestParam("nonce") String nonce,
- @RequestParam("openid") String openid,
- @RequestParam("encrypt_type") String encryptType,
- @RequestParam("msg_signature") String msgSignature,
- @RequestBody String encryptedData) {
+ @RequestParam("nonce") String nonce,
+ @RequestParam("openid") String openid,
+ @RequestParam("encrypt_type") String encryptType,
+ @RequestParam("msg_signature") String msgSignature,
+ @RequestBody String encryptedData) {
JSONObject _encryptedData = JSONUtil.parseObj(encryptedData);
String encrypt = _encryptedData.getStr("Encrypt");
log.info("微信推送验证");
- boolean isOfficial = verifyUtil.checkSignature("recycler", timestamp, nonce, encrypt,msgSignature);
+ boolean isOfficial = verifyUtil.checkSignature("recycler", timestamp, nonce, encrypt, msgSignature);
if (!isOfficial) {
log.error("接收推送消息失败!非官方推送,{},{},{},{}", timestamp, nonce, encrypt, msgSignature);
return "error";
@@ -123,29 +126,40 @@ public class WxMessageController {
@PostMapping("/getToken")
public CommonResult getToken(@RequestBody String message) {
AccessToken client = weChatMessageUtil.getAccessToken("client");
+ SocketMessage sms = new SocketMessage();
+ sms.setMessageType(MessageTypeEnum.BOOKING);
+ sms.setGoodsType("塑料");
+ sms.setOrderNo("123332");
+ sms.setOrderAddress("地址");
+ sms.setOrderPhone("电话");
+ sms.setOrderTime("2024-06-04 17:00~18:00");
+ try {
+ wsService.sendMsgToUser("你好",sms);
+ } catch (IOException e) {
+ log.error("发送消息失败");
+ e.printStackTrace();
+ }
return CommonResult.success(client);
}
@PostMapping("/send")
public CommonResult sendMessage(@RequestBody String message) {
- AccessToken client = weChatMessageUtil.getAccessToken("client");
-
OrderNew orderNew = new OrderNew();
- orderNew.setCharacter_string22("11");//订单号
- orderNew.setTime1("2024/06/04 16:30~17:30");//预约时间
- orderNew.setName15("上门回收");//服务名称
- orderNew.setThing9("地址");//预约地址
- orderNew.setPhone_number43("13183060802");//联系电话
+ orderNew.setCharacter_string22(new ValueTemplate("RO2024032815055294242"));//订单号
+ orderNew.setTime1(new ValueTemplate("2024/06/04 16:30~17:30"));//预约时间
+ orderNew.setName15(new ValueTemplate("预约上门回收"));//服务名称
+ orderNew.setThing9(new ValueTemplate("河南"));//预约地址
+ orderNew.setPhone_number43(new ValueTemplate("13183060802"));//联系电话
MessageTemplate template = new MessageTemplate();
template.setTemplate_id(OrderNew.TEMPLATE_ID);
template.setData(orderNew);
template.setTouser("oYkV866Jjz197Iya3kJQwdypNPq8");
- template.setMiniprogram_state("trial");
- template.setPage("/pages/orderDetail/orderDetail");
+// template.setMiniprogram_state("trial");
+ template.setPage("/pages/orderDetail/orderDetail?orderId=RO2024032815055294242");
template.setLang("zh_CN");
ResultVo result = weChatMessageUtil.sendMessage(template, "client");
-
+ log.info(result.getErrcode() + "", result.getErrmsg());
return CommonResult.success(result);
}
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/socket/MessageTypeEnum.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/socket/MessageTypeEnum.java
new file mode 100644
index 0000000..62fb00b
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/socket/MessageTypeEnum.java
@@ -0,0 +1,22 @@
+package cc.yunxi.domain.vo.socket;
+
+public enum MessageTypeEnum {
+ BOOKING("新订单"),
+ TAKEN("已接单"),
+ FINISH("已完成"),
+ CANCEL("已取消");
+ private final String status;
+
+ MessageTypeEnum(String status) {
+ this.status = status;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ @Override
+ public String toString() {
+ return this.getStatus();
+ }
+}
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/socket/SocketMessage.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/socket/SocketMessage.java
new file mode 100644
index 0000000..1d46de5
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/socket/SocketMessage.java
@@ -0,0 +1,42 @@
+package cc.yunxi.domain.vo.socket;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@ApiModel("socket消息体")
+
+public class SocketMessage {
+ @ApiModelProperty("消息类型")
+ private MessageTypeEnum messageType;
+ @ApiModelProperty("订单号")
+ private String orderNo;
+ @ApiModelProperty("订单状态")
+ private String orderStatus;
+ @ApiModelProperty("商品类型")
+ private String goodsType;
+ @ApiModelProperty("预约时间")
+ private String orderTime;
+ @ApiModelProperty("预约人号码")
+ private String orderPhone;
+ @ApiModelProperty("预约地址")
+ private String orderAddress;
+ @ApiModelProperty("预计重量")
+ private String orderWeight;
+ @ApiModelProperty("接单人")
+ private String takeOrderUser;
+ @ApiModelProperty("接单时间")
+ private String takeOrderTime;
+ @ApiModelProperty("接单人电话")
+ private String takeUserPhone;
+ @ApiModelProperty("完成时间")
+ private String finishTime;
+ @ApiModelProperty("实际金额")
+ private String realMoney;
+
+}
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/FinishOrder.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/FinishOrder.java
index 6ecfbe4..69bae72 100644
--- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/FinishOrder.java
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/FinishOrder.java
@@ -1,5 +1,6 @@
package cc.yunxi.domain.vo.vxmessage;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -7,15 +8,17 @@ import lombok.Data;
@Data
@ApiModel("订单完成")
public class FinishOrder extends BaseMessage{
-
+ @JsonIgnore//不在data属性中
+ @ApiModelProperty("消息模版ID")
+ public static final String TEMPLATE_ID = "ZYcDpdGc0fh6bIfDFLZgxFstauznvG7tS4ewfu4ZNeE";
@ApiModelProperty("订单号")
- private String character_string5;
+ private ValueTemplate character_string5;
@ApiModelProperty("订单状态")
- private String thing3;
+ private ValueTemplate thing3;
@ApiModelProperty("实付金额")
- private String amount22;
+ private ValueTemplate amount22;
@ApiModelProperty("服务方")
- private String thing10;
+ private ValueTemplate thing10;
@ApiModelProperty("完成时间")
- private String date9;
+ private ValueTemplate date9;
}
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/MessageTemplate.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/MessageTemplate.java
index 42dbbc7..362ca34 100644
--- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/MessageTemplate.java
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/MessageTemplate.java
@@ -16,7 +16,7 @@ public class MessageTemplate {
@ApiModelProperty("模板内容")
private BaseMessage data;
@ApiModelProperty("跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版")
- private String miniprogram_state;
+ private String miniprogram_state ="developer";
@ApiModelProperty("语言:支持zh_CN(简体中文)、en_US(英文)、zh_HK(繁体中文)、zh_TW(繁体中文),默认为zh_CN")
private String lang = "zh_CN";
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderNew.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderNew.java
index 1ffaa7d..66fbe79 100644
--- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderNew.java
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderNew.java
@@ -13,13 +13,13 @@ public class OrderNew extends BaseMessage{
@ApiModelProperty("消息模版ID")
public static final String TEMPLATE_ID = "TfLbZu3DxLSp4TnuTVCsDTY2U4zSV2M7MNTrGHaUL5s";
@ApiModelProperty("订单编号")
- private String character_string22;
+ private ValueTemplate character_string22;
@ApiModelProperty("预约时间")
- private String time1;
+ private ValueTemplate time1;
@ApiModelProperty("服务名称")
- private String name15;
+ private ValueTemplate name15;
@ApiModelProperty("预约地址")
- private String thing9;
+ private ValueTemplate thing9;
@ApiModelProperty("联系电话")
- private String phone_number43;
+ private ValueTemplate phone_number43;
}
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderTaken.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderTaken.java
index 93f9666..ad57345 100644
--- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderTaken.java
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/OrderTaken.java
@@ -1,5 +1,6 @@
package cc.yunxi.domain.vo.vxmessage;
+import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
@@ -8,14 +9,18 @@ import lombok.Data;
@ApiModel("已接单消息模板")
@Data
public class OrderTaken extends BaseMessage{
+
+ @JsonIgnore//不在data属性中
+ @ApiModelProperty("消息模版ID")
+ public static final String TEMPLATE_ID = "CGgIed4RMXLnsteWhj2l8h2R88OWAAJrLfPs5Uvyo5U";
@ApiModelProperty("订单号")
- private String character_string5;
+ private ValueTemplate character_string5;
@ApiModelProperty("订单状态")
- private String thing4;
+ private ValueTemplate thing4;
@ApiModelProperty("联系人")
- private String thing18;
+ private ValueTemplate thing18;
@ApiModelProperty("联系电话")
- private String phone_number14;
+ private ValueTemplate phone_number14;
@ApiModelProperty("服务时间")
- private String thing6;
+ private ValueTemplate thing6;
}
diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/ValueTemplate.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/ValueTemplate.java
new file mode 100644
index 0000000..8acd219
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/vxmessage/ValueTemplate.java
@@ -0,0 +1,14 @@
+package cc.yunxi.domain.vo.vxmessage;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+@ApiModel("值模板")
+public class ValueTemplate {
+ @ApiModelProperty("值")
+ private String value;
+}
diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IWsService.java b/nxhs-service/src/main/java/cc/yunxi/service/IWsService.java
new file mode 100644
index 0000000..3ffd30f
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/service/IWsService.java
@@ -0,0 +1,35 @@
+package cc.yunxi.service;
+
+import cc.yunxi.domain.vo.socket.SocketMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.io.IOException;
+
+/**
+ * ws操作相关服务
+ */
+public interface IWsService {
+
+ /**
+ * 发送消息
+ *
+ * @param userinfo 用户唯一标识
+ * @param message 消息内容
+ * @return
+ * @throws IOException
+ */
+ public void sendMsgToUser(String userinfo, SocketMessage message) throws IOException;
+
+
+ /**
+ * 广播消息
+ *
+ * @param text
+ * @return
+ * @throws IOException
+ */
+ public void broadcastMsg(String text);
+
+
+}
+
diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/WsServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/WsServiceImpl.java
new file mode 100644
index 0000000..7599591
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/WsServiceImpl.java
@@ -0,0 +1,47 @@
+package cc.yunxi.service.impl;
+
+import cc.yunxi.domain.vo.socket.SocketMessage;
+import cc.yunxi.service.IWsService;
+import cc.yunxi.utils.WsSessionManager;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Service
+@Slf4j
+public class WsServiceImpl implements IWsService {
+
+ @Resource
+ private WsSessionManager sessionManager;
+
+ @Override
+ public void sendMsgToUser(String userinfo, SocketMessage message) throws IOException {
+ String text = JSONUtil.toJsonStr(message);
+ WebSocketSession userSession = sessionManager.getUserSession(userinfo);
+ if (userSession != null && userSession.isOpen()) {
+ userSession.sendMessage(new TextMessage(text));
+ }
+ }
+
+ @Override
+ public void broadcastMsg(String text) {
+ ConcurrentHashMap allSession = sessionManager.getAllSession();
+ if (null != allSession && allSession.size() > 0) {
+ for (WebSocketSession session : allSession.values()) {
+ try {
+ if (null != session && session.isOpen()) {
+ session.sendMessage(new TextMessage(text));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+}
diff --git a/nxhs-service/src/main/java/cc/yunxi/utils/WeChatMessageUtil.java b/nxhs-service/src/main/java/cc/yunxi/utils/WeChatMessageUtil.java
index 8bd4c8b..e986642 100644
--- a/nxhs-service/src/main/java/cc/yunxi/utils/WeChatMessageUtil.java
+++ b/nxhs-service/src/main/java/cc/yunxi/utils/WeChatMessageUtil.java
@@ -76,17 +76,18 @@ public class WeChatMessageUtil {
if ("client".equals(endpointType)) {//预约端
param.put("appid", clientProperties.getAppId());
param.put("secret", clientProperties.getAppSecret());
- result = HttpUtil.get(clientProperties.getTokenUrl(), param);
+ result = HttpUtil.get(clientProperties.getTokenUrl(), param,1000);
} else if ("recycler".equals(endpointType)) {//回收端
param.put("appid", recyclerProperties.getAppId());
param.put("secret", recyclerProperties.getAppSecret());
- result = HttpUtil.get(recyclerProperties.getTokenUrl(), param);
+ result = HttpUtil.get(recyclerProperties.getTokenUrl(), param,1000);
} else {
return null;
}
AccessToken access_token = JSONUtil.toBean(result, AccessToken.class);
access_token.setExpires_in(new AtomicLong(10 * 1000 + access_token.getExpires_in().get() * 1000));
accessTokenMap.put(endpointType, access_token);
+ return access_token;
}
log.info("当前微信access_token为:{}", token);
return token;
diff --git a/nxhs-service/src/main/java/cc/yunxi/utils/WsSessionManager.java b/nxhs-service/src/main/java/cc/yunxi/utils/WsSessionManager.java
new file mode 100644
index 0000000..4e07b37
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/utils/WsSessionManager.java
@@ -0,0 +1,97 @@
+package cc.yunxi.utils;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.WebSocketSession;
+
+import java.io.IOException;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Component
+public class WsSessionManager {
+ /**
+ * 保存连接 session 的地方
+ */
+ private static ConcurrentHashMap SESSION_POOL = new ConcurrentHashMap<>();
+ private static ConcurrentHashMap USER_SESSION_POOL = new ConcurrentHashMap<>();
+
+ /**
+ * 添加 session
+ *
+ * @param key
+ */
+ public void add(String key, WebSocketSession session) {
+ // 添加 session
+ SESSION_POOL.put(key, session);
+ }
+
+ public void addUserSession(String key, WebSocketSession session) {
+ //获取旧session
+ WebSocketSession oldSession = USER_SESSION_POOL.get(key);
+ if (null == oldSession //没有
+ || !oldSession.getId().equals(session.getId()) //id不同
+ || !oldSession.isOpen()) { //旧session已关闭
+ USER_SESSION_POOL.put(key, session); //则将新的session添加到池中
+ }
+ }
+
+ /**
+ * 删除 session,会返回删除的 session
+ *
+ * @param key
+ * @return
+ */
+ public WebSocketSession remove(String key) {
+ // 删除 session
+ USER_SESSION_POOL.remove(key);
+ return SESSION_POOL.remove(key);
+ }
+
+
+ /**
+ * 删除并同步关闭连接
+ *
+ * @param key
+ */
+ public void removeAndClose(String key) {
+ WebSocketSession session = remove(key);
+ if (session != null) {
+ try {
+ // 关闭连接
+ session.close();
+ } catch (IOException e) {
+ // todo: 关闭出现异常处理
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * 获得 session
+ *
+ * @param key
+ * @return
+ */
+ public WebSocketSession getUserSession(String key) {
+ // 获得 session
+ return USER_SESSION_POOL.get(key);
+ }
+
+ /**
+ * 获得 session
+ *
+ * @param key
+ * @return
+ */
+ public WebSocketSession getSession(String key) {
+ // 获得 session
+ return USER_SESSION_POOL.get(key);
+ }
+
+ //获取所有链接
+ public ConcurrentHashMap getAllSession() {
+ return SESSION_POOL;
+ }
+}
+
diff --git a/nxhs-service/src/main/java/cc/yunxi/utils/WsSocketHandler.java b/nxhs-service/src/main/java/cc/yunxi/utils/WsSocketHandler.java
new file mode 100644
index 0000000..41463de
--- /dev/null
+++ b/nxhs-service/src/main/java/cc/yunxi/utils/WsSocketHandler.java
@@ -0,0 +1,60 @@
+package cc.yunxi.utils;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.BinaryMessage;
+import org.springframework.web.socket.CloseStatus;
+import org.springframework.web.socket.TextMessage;
+import org.springframework.web.socket.WebSocketSession;
+import org.springframework.web.socket.handler.AbstractWebSocketHandler;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+
+/**
+ * ws消息处理类
+ */
+@Component
+@Slf4j
+public class WsSocketHandler extends AbstractWebSocketHandler {
+
+ @Resource
+ private WsSessionManager SESSION_MANAGER;
+
+ @Override
+ public void afterConnectionEstablished(WebSocketSession session) throws Exception {
+ log.info("建立ws连接");
+ SESSION_MANAGER.add(session.getId(), session);
+ }
+
+ @Override
+ protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
+ log.info("发送文本消息");
+ // 获得客户端传来的消息
+ String payload = message.getPayload();
+ log.info("server 接收到消息 " + payload);
+ JSONObject json = JSONUtil.parseObj(payload);
+ String userId = json.getStr("userId");
+ SESSION_MANAGER.addUserSession(userId, session);
+ session.sendMessage(new TextMessage("server 发送给的消息 " + payload + ",发送时间:" + LocalDateTime.now().toString()));
+ }
+
+ @Override
+ protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception {
+ log.info("发送二进制消息");
+ }
+
+ @Override
+ public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
+ log.error("异常处理");
+ SESSION_MANAGER.removeAndClose(session.getId());
+ }
+
+ @Override
+ public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
+ log.info("关闭ws连接");
+ SESSION_MANAGER.removeAndClose(session.getId());
+ }
+}
diff --git a/nxhs-service/src/main/resources/application.yml b/nxhs-service/src/main/resources/application.yml
index 5b3e558..efc1000 100644
--- a/nxhs-service/src/main/resources/application.yml
+++ b/nxhs-service/src/main/resources/application.yml
@@ -104,6 +104,7 @@ nxhs:
- /api/device/**
- /api/qrcode/**.txt
- /api/wx-message/**
+ - /api/webSocketServer/**
adminKey: 8bd2aa89033ead51c505e44994e42189 # 后台接口访问Key
upload:
basePath: /upload/