Administrator лет назад: 4
Родитель
Сommit
91105122c6

+ 5 - 1
pom.xml

@@ -86,7 +86,11 @@
      <artifactId>jaxb-api</artifactId>
      <version>2.3.0</version>
  </dependency>
- 
+<dependency>
+    <groupId>de.dfki.cos.basys.platform.wrapper-bundle-settings</groupId>
+    <artifactId>javax.websocket-api</artifactId>
+    <version>0.2.6</version>
+</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
 			<artifactId>spring-webmvc</artifactId>

+ 0 - 1
src/main/java/com/goafanti/common/controller/PublicController.java

@@ -555,7 +555,6 @@ public class PublicController extends CertifyApiController {
 	}
 	
 	
-	
     /**
      * 导入流水
      * @param file

+ 128 - 0
src/main/java/com/goafanti/common/controller/WebSocketController.java

@@ -0,0 +1,128 @@
+package com.goafanti.common.controller;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.socket.server.standard.SpringConfigurator;
+
+@ServerEndpoint(value="/websocketDemo/{userId}",configurator = SpringConfigurator.class)
+public class WebSocketController {
+	//日志记录      
+    private Logger logger = LoggerFactory.getLogger(WebSocketController.class);
+    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static int onlineCount = 0;
+   
+    //记录每个用户下多个终端的连接
+    private static Map<Long, Set<WebSocketController>> userSocket = new HashMap<>();
+ 
+    //需要session来对用户发送数据, 获取连接特征userId
+    private Session session;
+    private Long userId;
+   
+    /**
+     * @Title: onOpen
+     * @Description: websocekt连接建立时的操作
+     * @param @param userId 用户id
+     * @param @param session websocket连接的session属性
+     * @param @throws IOException
+     */
+    @OnOpen
+    public void onOpen(@PathParam("userId") Long userId,Session session) throws IOException{
+        this.session = session;
+        this.userId = userId;
+        onlineCount++;
+        //根据该用户当前是否已经在别的终端登录进行添加操作
+        if (userSocket.containsKey(this.userId)) {
+            logger.debug("当前用户id:{}已有其他终端登录",this.userId);
+            userSocket.get(this.userId).add(this); //增加该用户set中的连接实例
+        }else {
+            logger.debug("当前用户id:{}第一个终端登录",this.userId);
+            Set<WebSocketController> addUserSet = new HashSet<>();
+            addUserSet.add(this);
+            userSocket.put(this.userId, addUserSet);
+        }
+        logger.debug("用户{}登录的终端个数是为{}",userId,userSocket.get(this.userId).size());
+        logger.debug("当前在线用户数为:{},所有终端个数为:{}",userSocket.size(),onlineCount);
+    }
+   
+    /**
+     * @Title: onClose
+     * @Description: 连接关闭的操作
+     */
+    @OnClose
+    public void onClose(){
+        //移除当前用户终端登录的websocket信息,如果该用户的所有终端都下线了,则删除该用户的记录
+        if (userSocket.get(this.userId).size() == 0) {
+            userSocket.remove(this.userId);
+        }else{
+            userSocket.get(this.userId).remove(this);
+        }
+        logger.debug("用户{}登录的终端个数是为{}",this.userId,userSocket.get(this.userId).size());
+        logger.debug("当前在线用户数为:{},所有终端个数为:{}",userSocket.size(),onlineCount);
+    }
+   
+    /**
+     * @Title: onMessage
+     * @Description: 收到消息后的操作
+     * @param @param message 收到的消息
+     * @param @param session 该连接的session属性
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) {    
+        logger.debug("收到来自用户id为:{}的消息:{}",this.userId,message);
+        if(session ==null)  logger.debug("session null");
+    }
+   
+    /**
+     * @Title: onError
+     * @Description: 连接发生错误时候的操作
+     * @param @param session 该连接的session
+     * @param @param error 发生的错误
+     */
+    @OnError
+    public void onError(Session session, Throwable error){
+        logger.debug("用户id为:{}的连接发送错误",this.userId);
+        error.printStackTrace();
+    }
+   
+  /**
+   * @Title: sendMessageToUser
+   * @Description: 发送消息给用户下的所有终端
+   * @param @param userId 用户id
+   * @param @param message 发送的消息
+   * @param @return 发送成功返回true,反则返回false
+   */
+    public Boolean sendMessageToUser(Long userId,String message){
+        if (userSocket.containsKey(userId)) {
+            logger.debug(" 给用户id为:{}的所有终端发送消息:{}",userId,message);
+            for (WebSocketController WS : userSocket.get(userId)) {
+                logger.debug("sessionId为:{}",WS.session.getId());
+                try {
+                    WS.session.getBasicRemote().sendText(message);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    logger.debug(" 给用户id为:{}发送消息失败",userId);
+                    return false;
+                }
+            }
+            return true;
+        }
+        logger.debug("发送错误:当前连接不包含id为:{}的用户",userId);
+        return false;
+    }
+  
+
+}

+ 6 - 0
src/main/java/com/goafanti/common/controller/WebpageController.java

@@ -410,6 +410,12 @@ public class WebpageController extends BaseController {
 		return modelview;
 	}
 	
+	@RequestMapping(value="/portal/websocket")
+	public ModelAndView websocket(HttpServletRequest request, ModelAndView modelview){
+		modelview.setViewName("/portal/websocket");
+		return modelview;
+	}
+	
 	/**
 	 *  关于我们
 	 * @param request

+ 30 - 0
src/main/java/com/goafanti/common/service/WSMessageService.java

@@ -0,0 +1,30 @@
+package com.goafanti.common.service;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import com.goafanti.common.utils.WebSocketUtils;
+
+@Service
+public class WSMessageService {
+    private Logger logger = LoggerFactory.getLogger(WSMessageService.class);
+    //声明websocket连接类
+    private WebSocketUtils socket = new WebSocketUtils();
+
+    /**
+     * @Title: sendToAllTerminal
+     * @Description: 调用websocket类给用户下的所有终端发送消息
+     * @param @param userId 用户id
+     * @param @param message 消息
+     * @param @return 发送成功返回true,否则返回false
+     */
+    public Boolean sendToAllTerminal(Long userId,String message){   
+        logger.debug("向用户{}的消息:{}",userId,message);
+        if(socket.sendMessageToUser(userId,message)){
+            return true;
+        }else{
+            return false;
+        }   
+    }           
+}

+ 128 - 0
src/main/java/com/goafanti/common/utils/WebSocketUtils.java

@@ -0,0 +1,128 @@
+package com.goafanti.common.utils;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import javax.websocket.OnClose;
+import javax.websocket.OnError;
+import javax.websocket.OnMessage;
+import javax.websocket.OnOpen;
+import javax.websocket.Session;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.socket.server.standard.SpringConfigurator;
+
+@ServerEndpoint(value="/open/websocket/{userId}",configurator = SpringConfigurator.class)
+public class WebSocketUtils {
+	//日志记录      
+    private Logger logger = LoggerFactory.getLogger(WebSocketUtils.class);
+    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+    private static int onlineCount = 0;
+   
+    //记录每个用户下多个终端的连接
+    private static Map<Long, Set<WebSocketUtils>> userSocket = new HashMap<>();
+ 
+    //需要session来对用户发送数据, 获取连接特征userId
+    private Session session;
+    private Long userId;
+   
+    /**
+     * @Title: onOpen
+     * @Description: websocekt连接建立时的操作
+     * @param @param userId 用户id
+     * @param @param session websocket连接的session属性
+     * @param @throws IOException
+     */
+    @OnOpen
+    public void onOpen(@PathParam("userId") Long userId,Session session) throws IOException{
+        this.session = session;
+        this.userId = userId;
+        onlineCount++;
+        //根据该用户当前是否已经在别的终端登录进行添加操作
+        if (userSocket.containsKey(this.userId)) {
+            logger.debug("当前用户id:{}已有其他终端登录",this.userId);
+            userSocket.get(this.userId).add(this); //增加该用户set中的连接实例
+        }else {
+            logger.debug("当前用户id:{}第一个终端登录",this.userId);
+            Set<WebSocketUtils> addUserSet = new HashSet<>();
+            addUserSet.add(this);
+            userSocket.put(this.userId, addUserSet);
+        }
+        logger.debug("用户{}登录的终端个数是为{}",userId,userSocket.get(this.userId).size());
+        logger.debug("当前在线用户数为:{},所有终端个数为:{}",userSocket.size(),onlineCount);
+    }
+   
+    /**
+     * @Title: onClose
+     * @Description: 连接关闭的操作
+     */
+    @OnClose
+    public void onClose(){
+        //移除当前用户终端登录的websocket信息,如果该用户的所有终端都下线了,则删除该用户的记录
+        if (userSocket.get(this.userId).size() == 0) {
+            userSocket.remove(this.userId);
+        }else{
+            userSocket.get(this.userId).remove(this);
+        }
+        logger.debug("用户{}登录的终端个数是为{}",this.userId,userSocket.get(this.userId).size());
+        logger.debug("当前在线用户数为:{},所有终端个数为:{}",userSocket.size(),onlineCount);
+    }
+   
+    /**
+     * @Title: onMessage
+     * @Description: 收到消息后的操作
+     * @param @param message 收到的消息
+     * @param @param session 该连接的session属性
+     */
+    @OnMessage
+    public void onMessage(String message, Session session) {    
+        logger.debug("收到来自用户id为:{}的消息:{}",this.userId,message);
+        if(session ==null)  logger.debug("session null");
+    }
+   
+    /**
+     * @Title: onError
+     * @Description: 连接发生错误时候的操作
+     * @param @param session 该连接的session
+     * @param @param error 发生的错误
+     */
+    @OnError
+    public void onError(Session session, Throwable error){
+        logger.debug("用户id为:{}的连接发送错误",this.userId);
+        error.printStackTrace();
+    }
+   
+  /**
+   * @Title: sendMessageToUser
+   * @Description: 发送消息给用户下的所有终端
+   * @param @param userId 用户id
+   * @param @param message 发送的消息
+   * @param @return 发送成功返回true,反则返回false
+   */
+    public Boolean sendMessageToUser(Long userId,String message){
+        if (userSocket.containsKey(userId)) {
+            logger.debug(" 给用户id为:{}的所有终端发送消息:{}",userId,message);
+            for (WebSocketUtils WS : userSocket.get(userId)) {
+                logger.debug("sessionId为:{}",WS.session.getId());
+                try {
+                    WS.session.getBasicRemote().sendText(message);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    logger.debug(" 给用户id为:{}发送消息失败",userId);
+                    return false;
+                }
+            }
+            return true;
+        }
+        logger.debug("发送错误:当前连接不包含id为:{}的用户",userId);
+        return false;
+    }
+  
+
+}

+ 64 - 0
src/main/webapp/WEB-INF/views/portal/websocket.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+
+    <head lang="en">
+        <meta charset="UTF-8">
+        <script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
+        <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
+        <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
+        <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
+        <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
+        <title>webSocket-用户66</title>
+        <script type="text/javascript">
+            $(function() {
+                var websocket;
+                if('WebSocket' in window) {
+                                        console.log("此浏览器支持websocket");
+                    websocket = new WebSocket("ws://127.0.0.1:8080/open/websocket/66");
+                } else if('MozWebSocket' in window) {
+                    alert("此浏览器只支持MozWebSocket");
+                } else {
+                    alert("此浏览器只支持SockJS");
+                }
+                websocket.onopen = function(evnt) {
+                    $("#tou").html("链接服务器成功!")
+                };
+                websocket.onmessage = function(evnt) {
+                    $("#msg").html($("#msg").html() + "<br/>" + evnt.data);
+                };
+                websocket.onerror = function(evnt) {};
+                websocket.onclose = function(evnt) {
+                    $("#tou").html("与服务器断开了链接!")
+                }
+                $('#send').bind('click', function() {
+                    send();
+                });
+
+                function send() {
+                    if(websocket != null) {
+                        var message = document.getElementById('message').value;
+                        websocket.send(message);
+                    } else {
+                        alert('未与服务器链接.');
+                    }
+                }
+            });
+        </script>
+    </head>
+
+    <body>
+        <div class="page-header" id="tou">
+            webSocket多终端聊天测试
+        </div>
+        <div class="well" id="msg"></div>
+        <div class="col-lg">
+            <div class="input-group">
+                <input type="text" class="form-control" placeholder="发送信息..." id="message">
+                <span class="input-group-btn">
+                    <button class="btn btn-default" type="button" id="send" >发送</button>
+                </span>
+            </div>
+        </div>
+    </body>
+
+</html>