Bläddra i källkod

整合websocket

weifanli 3 år sedan
förälder
incheckning
909434ef6d

+ 97 - 0
cooleshow-websocket/pom.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>cooleshow</artifactId>
+        <groupId>com.yonge.cooleshow</groupId>
+        <version>1.0</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>cooleshow-websocket</artifactId>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <redisson.version>3.16.4</redisson.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+        </dependency>
+
+   <!--     <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-security</artifactId>
+        </dependency>-->
+
+        <!-- swagger-spring-boot -->
+        <dependency>
+            <groupId>com.spring4all</groupId>
+            <artifactId>swagger-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <!-- mybatis-plus -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.0.7.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>commons-lang</groupId>
+            <artifactId>commons-lang</artifactId>
+            <version>2.6</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- redisson -->
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>${redisson.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+            <version>2.1.6.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.68</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 26 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/WebsocketApplication.java

@@ -0,0 +1,26 @@
+package com.yonge.cooleshow.websocket;
+
+import com.spring4all.swagger.EnableSwagger2Doc;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @Author: liweifan
+ * @Data: 2022/4/18 16:32
+ */
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients("com.yonge.cooleshow")
+@MapperScan("com.yonge.cooleshow.websocket.dal.dao")
+@Configuration
+@EnableSwagger2Doc
+public class WebsocketApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(WebsocketApplication.class, args);
+    }
+}

+ 24 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/config/WebSocketConfig.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.websocket.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+ * WebScoket配置处理器
+ */
+@Configuration
+public class WebSocketConfig {
+	 /**
+     * ServerEndpointExporter 作用
+     *
+     * 这个Bean会自动注册使用@ServerEndpoint注解声明的websocket endpoint
+     *
+     * @return
+     */
+	@Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+
+}

+ 39 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/enums/MsgBizTypeEnum.java

@@ -0,0 +1,39 @@
+package com.yonge.cooleshow.websocket.enums;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+
+/**
+ * 消息类型枚举
+ * @Author: liweifan
+ * @Data: 2022/4/7 15:48
+ */
+public enum MsgBizTypeEnum {
+    ONLINE("建立连接"),
+    OFFLINE("断开连接"),
+    PAY_END("支付结束");
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    MsgBizTypeEnum(String msg) {
+        this.code = getCode();
+        this.msg = msg;
+    }
+
+    public String getCode() {
+        return this.name();
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 33 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/MSG.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.websocket.po;
+
+import com.yonge.cooleshow.websocket.enums.MsgBizTypeEnum;
+
+public class MSG {
+
+    MsgBizTypeEnum bizType;
+
+    String msg;
+
+    public MSG(MsgBizTypeEnum bizType, String msg) {
+        super();
+        this.msg = msg;
+    }
+
+    public MsgBizTypeEnum getBizType() {
+        return bizType;
+    }
+
+    public void setBizType(MsgBizTypeEnum bizType) {
+        this.bizType = bizType;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+
+}

+ 51 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/Message.java

@@ -0,0 +1,51 @@
+package com.yonge.cooleshow.websocket.po;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+import java.util.Date;
+
+public class Message {
+
+	//发送者name
+	public Long from;
+	//接收者name
+	public Long to;
+	//发送的文本
+	public MSG msg;
+	//发送时间
+	@JSONField(format="yyyy-MM-dd HH:mm:ss")
+	public Date date;
+
+	public Long getFrom() {
+		return from;
+	}
+
+	public void setFrom(Long from) {
+		this.from = from;
+	}
+
+	public Long getTo() {
+		return to;
+	}
+
+	public void setTo(Long to) {
+		this.to = to;
+	}
+
+	public MSG getMsg() {
+		return msg;
+	}
+
+	public void setMsg(MSG msg) {
+		this.msg = msg;
+	}
+
+	public Date getDate() {
+		return date;
+	}
+
+	public void setDate(Date date) {
+		this.date = date;
+	}
+
+}

+ 34 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/po/User.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.websocket.po;
+
+public class User {
+	Long uid;
+	
+	String name;
+	
+	public User() {
+		super();
+	}
+
+	public User(Long uid, String name) {
+		super();
+		this.uid = uid;
+		this.name = name;
+	}
+
+	public Long getUid() {
+		return uid;
+	}
+
+	public void setUid(Long uid) {
+		this.uid = uid;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+	
+}

+ 102 - 0
cooleshow-websocket/src/main/java/com/yonge/cooleshow/websocket/service/WebSocketServer.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.websocket.service;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.websocket.po.Message;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.Date;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@ServerEndpoint("/webSocket/{userId}")
+@Component
+public class WebSocketServer {
+	 //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    //concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+    private static ConcurrentHashMap<Long, Session> sessionPools = new ConcurrentHashMap<>();
+
+    //发送消息
+    public void sendMessage(Session session, String message) throws IOException {
+        if(session != null){
+            synchronized (session) {
+                System.out.println("发送数据:" + message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+    //给指定用户发送信息
+    public void sendInfo(Long userId, String message){
+        Session session = sessionPools.get(userId);
+        try {
+            sendMessage(session, message);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+    // 群发消息
+    public void broadcast(String message){
+    	for (Session session: sessionPools.values()) {
+            try {
+                sendMessage(session, message);
+            } catch(Exception e){
+                e.printStackTrace();
+                continue;
+            }
+        }
+    }
+
+    //建立连接成功调用
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "userId") Long userId){
+        sessionPools.put(userId, session);
+        addOnlineCount();
+        System.out.println(userId + "加入webSocket!当前人数为" + onlineNum);
+    }
+
+    //关闭连接时调用
+    @OnClose
+    public void onClose(@PathParam(value = "userId") Long userId){
+        sessionPools.remove(userId);
+        subOnlineCount();
+        System.out.println(userId + "断开webSocket连接!当前人数为" + onlineNum);
+    }
+
+    //收到客户端信息后,根据接收人的userId把消息推下去或者群发
+    // to=-1群发消息
+    @OnMessage
+    public void onMessage(String message) throws IOException {
+        System.out.println("server get" + message);
+        Message msg=JSON.parseObject(message, Message.class);
+		msg.setDate(new Date());
+        sendInfo(msg.getTo(), JSON.toJSONString(msg,true));
+    }
+
+    //错误时调用
+    @OnError
+    public void onError(Session session, Throwable throwable){
+        System.out.println("发生错误");
+        throwable.printStackTrace();
+    }
+
+    public static void addOnlineCount(){
+        onlineNum.incrementAndGet();
+    }
+
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+    
+    public static AtomicInteger getOnlineNumber() {
+        return onlineNum;
+    }
+    
+    public static ConcurrentHashMap<Long, Session> getSessionPools() {
+        return sessionPools;
+    }
+}

+ 12 - 0
cooleshow-websocket/src/main/resources/bootstrap-prod.yml

@@ -0,0 +1,12 @@
+spring:
+  cloud:
+    nacos:
+      config:
+        server-addr: 47.114.1.200:8848
+        namespace: 6f8374a9-598f-4889-bb17-476070ffb8de
+        group: DEFAULT_GROUP
+        prefix: websocket
+        file-extension: yaml
+        refresh:
+          enabled: true
+        enabled: true

+ 2 - 1
pom.xml

@@ -374,5 +374,6 @@
 		<module>cooleshow-im</module>
 	    <module>cooleshow-task</module>
 		<module>cooleshow-mall</module>
-  </modules>
+        <module>cooleshow-websocket</module>
+    </modules>
 </project>

+ 4 - 3
toolset/thirdparty-component/src/main/java/com/yonge/toolset/thirdparty/user/realname/provider/LinkfaceRealnameAuthenticationPlugin.java

@@ -92,7 +92,8 @@ public class LinkfaceRealnameAuthenticationPlugin implements RealnameAuthenticat
 					msg = "查无此身份证号";
 				}
 			} else {
-				msg = reason.get(status);
+				//msg = reason.get(status);
+				msg = reason.get("身份证号和姓名不一致");
 			}
 			throw new ThirdpartyException("实名认证失败,原因:{}", msg);
 		}
@@ -110,12 +111,12 @@ public class LinkfaceRealnameAuthenticationPlugin implements RealnameAuthenticat
 		this.apisUrl = apisUrl;
 	}
 
-	public static void main(String[] args) {
+	/*public static void main(String[] args) {
 		LinkfaceRealnameAuthenticationPlugin plugin = new LinkfaceRealnameAuthenticationPlugin();
 		plugin.setAppId("2cd4937c8dbd4f6a9c70c6d3122df5f4");
 		plugin.setAppSecret("3f809f3800654780beff1ce09b780297");
 		plugin.setApisUrl("https://cloudapi.linkface.cn/data/verify_id_name");
 
 		System.out.println(plugin.verify("王武", "411526199706013217"));
-	}
+	}*/
 }