Browse Source

socket代码

1021934019@qq.com 4 years ago
parent
commit
35c674fe68

+ 10 - 0
blade-service-api/blade-system-api/src/main/java/org/springblade/system/feign/ISysClientFallback.java

@@ -31,6 +31,16 @@ import java.util.List;
 public class ISysClientFallback implements ISysClient {
 
 	@Override
+	public R<List<Role>> listRoleAlias() {
+		return R.fail("获取数据失败");
+	}
+
+	@Override
+	public R<Long> getRoleByAlias(String alias) {
+		return R.fail("获取数据失败");
+	}
+
+	@Override
 	public R<Menu> getMenu(Long id) {
 		return R.fail("获取数据失败");
 	}

+ 16 - 0
blade-service/blade-client/pom.xml

@@ -85,6 +85,22 @@
             <groupId>org.springblade</groupId>
             <artifactId>blade-starter-transaction</artifactId>
         </dependency>
+        <!-- websocket -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <!-- spring web排除tomcat -->
+     <!--   <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>-->
     </dependencies>
 
 

+ 6 - 0
blade-service/blade-client/src/main/java/org/springblade/client/ClientApplication.java

@@ -7,7 +7,9 @@ import org.springblade.core.launch.BladeApplication;
 import org.springblade.core.transaction.annotation.SeataCloudApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
 import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 
 /**
  * Desk启动器
@@ -29,6 +31,10 @@ public class ClientApplication {
 	public static void main(String[] args) {
 		BladeApplication.run(LauncherConstant.APPLICATION_CLIENT_NAME, ClientApplication.class, args);
 	}
+	@Bean
+	public ServerEndpointExporter serverEndpointExporter() {
+		return new ServerEndpointExporter();
+	}
 
 }
 

+ 24 - 0
blade-service/blade-client/src/main/java/org/springblade/client/config/WebSocketConfig.java

@@ -0,0 +1,24 @@
+package org.springblade.client.config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+
+/*
+@Component
+public class WebSocketConfig
+{
+
+*/
+/*
+  *
+     * 	注入ServerEndpointExporter,
+     * 	这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket
+*//*
+
+    @Bean
+    public ServerEndpointExporter serverEndpointExporter() {
+        return new ServerEndpointExporter();
+    }
+}
+*/

+ 2 - 2
blade-service/blade-client/src/main/java/org/springblade/client/message/mapper/MessageMapper.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="org.srpingblade.client.mapper.MessageMapper">
+<mapper namespace="org.springblade.client.message.mapper.MessageMapper">
 
     <!-- 通用查询映射结果 -->
-    <resultMap id="messageResultMap" type="org.srpingblade.client.entity.Message">
+    <resultMap id="messageResultMap" type="org.springblade.client.entity.Message">
         <id column="id" property="id"/>
         <result column="user_id" property="userId"/>
         <result column="user_name" property="userName"/>

+ 0 - 16
blade-service/blade-client/src/main/java/org/springblade/client/message/socket/MessageSocket.java

@@ -1,16 +0,0 @@
-package org.springblade.client.message.socket;
-
-import io.swagger.annotations.Api;
-import lombok.AllArgsConstructor;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-@RestController
-@AllArgsConstructor
-@RequestMapping("/socket/message")
-@Api(value = "消息socket接口", tags = "消息socket接口")
-public class MessageSocket
-{
-
-}

+ 138 - 0
blade-service/blade-client/src/main/java/org/springblade/client/message/socket/MessageWebSocket.java

@@ -0,0 +1,138 @@
+package org.springblade.client.message.socket;
+
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+
+
+import org.springframework.stereotype.Component;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.concurrent.CopyOnWriteArraySet;
+
+/**
+ * 消息信息推送socket
+ */
+@Component
+@Slf4j
+@ServerEndpoint("/websocket/{userId}")
+public class MessageWebSocket
+{
+
+    /**使用示例
+     * 在业务中操作websocket
+     * @Autowried webSocket webSocket;
+     * webSocket.sendAllMessage("你有一条新的推送");
+     *
+     * */
+
+
+    private Session session;
+
+    private static CopyOnWriteArraySet<MessageWebSocket> webSockets =new CopyOnWriteArraySet<>();
+    private static Map<Long, Session> sessionPool = new HashMap<Long, Session>();
+
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value="userId")Long userId) {
+        try {
+            this.session = session;
+            webSockets.add(this);
+            sessionPool.put(userId, session);
+            log.info("【websocket消息】有新的连接,总数为:"+webSockets.size());
+            send(userId);
+        } catch (Exception e) {
+        }
+    }
+
+    @OnClose
+    public void onClose() {
+        try {
+            webSockets.remove(this);
+            log.info("【websocket消息】连接断开,总数为:"+webSockets.size());
+        } catch (Exception e) {
+        }
+    }
+
+    @OnMessage
+    public void onMessage(String message) {
+        //todo 现在有个定时任务刷,应该去掉
+        log.debug("【websocket消息】收到客户端消息:"+message);
+        JSONObject obj = new JSONObject();
+        obj.put("cmd", "heartcheck");//业务类型
+        obj.put("msgTxt", "心跳响应");//消息内容
+        session.getAsyncRemote().sendText(obj.toJSONString());
+    }
+
+    // 此为广播消息
+    public void sendAllMessage(String message) {
+        log.info("【websocket消息】广播消息:"+message);
+        for(MessageWebSocket messageWebSocket : webSockets) {
+            try {
+                if(messageWebSocket.session.isOpen()) {
+					messageWebSocket.session.getAsyncRemote().sendText(message);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // 此为单点消息(单人)
+    public void sendOneMessage(Long userId, String message) {
+        Session session = sessionPool.get(userId);
+        if (session != null&&session.isOpen()) {
+            try {
+                log.info("【websocket消息】 单点消息:"+message);
+                session.getAsyncRemote().sendText(message);
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    // 此为单点消息(多人)
+    public void sendMoreMessage(String[] userIds, String message) {
+        for(String userId:userIds) {
+            Session session = sessionPool.get(userId);
+            if (session != null&&session.isOpen()) {
+                try {
+                    log.info("【websocket消息】 单点消息:"+message);
+                    session.getAsyncRemote().sendText(message);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+
+
+    public void send(Long userId)
+    {
+        try
+		{
+            while(true)
+            {
+                int max=175;
+                int min=10;
+                Random random = new Random();
+                int x = random.nextInt(max) % (max - min + 1) + min;
+                int y = random.nextInt(max) % (max - min + 1) + min;
+                String mark="["+x+","+y+"]";
+				sendOneMessage(userId,mark);
+                Thread.sleep(6000);
+            }
+        }
+        catch (InterruptedException e)
+		{
+            e.printStackTrace();
+        }
+    }
+}