簡單的說,websocket是真正實現了全雙工通訊的伺服器向客戶端推的網際網路技術。
全雙工與單工、半雙工的區別?
全雙工:簡單地說,就是可以同時進行訊號的雙向傳輸(A->B且B->A),是瞬時同步的。
單工、半雙工:一個時間段內只有一個動作發生。
推送和拉取的區別?
推:由伺服器主動發訊息給客戶端,就像廣播。優勢在於,資訊的主動性和及時性。
拉:由客戶端主動請求所需要的資料。
實現訊息通訊的幾種方式?
傳統的http協議實現方式:。
傳統的socket技術。
websocket協議實現方式。
接下來我們主要講第三種,使用websocket協議,來實現服務端定時向客戶端推送訊息。
開發環境:jdk1。8、tomcat7
後臺:springmvc、websocket、quartz
前臺:html5中新增的API
開發工具:IDEA、maven
實現步驟
一、環境搭建
(1)匯入相關約束:
在pom檔案中加入需要的約束,spring相關的約束,請各位自己匯入,這裡我就不貼出來了。
<!—— 定時器的包 ——>
(2)配置xml檔案
web。xml中就配置前端控制器,大家自行配置。然後,載入springmvc的配置檔案。
springmvc。xml檔案中
<!—— 自動將控制器載入到bean ——>
到此,環境就基本搭建完成了。
二、完成後臺的功能
這裡我就直接貼出程式碼了,上面有相關的註釋。
首先,完成websocket的實現類。
package com。socket。web。socket;import org。slf4j。Logger;import org。slf4j。LoggerFactory;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。Map;import java。util。Set;import java。util。concurrent。ConcurrentHashMap;/** * @Author: 清風一陣吹我心 * @ProjectName: socket * @Package: com。socket。web。socket * @ClassName: WebSocketServer * @Description: * @Version: 1。0 **///ServerEndpoint它的功能主要是將目前的類定義成一個websocket伺服器端。註解的值將被用於監聽使用者連線的終端訪問URL地址。@ServerEndpoint(value = “/socket/{ip}”)@Componentpublic class WebSocketServer { //使用slf4j打日誌 private static final Logger LOGGER = LoggerFactory。getLogger(WebSocketServer。class); //用來記錄當前線上連線數 private static int onLineCount = 0; //用來存放每個客戶端對應的WebSocketServer物件 private static ConcurrentHashMap
然後寫我們的定時器(quartz),這裡我就不詳解定時器了。大家可以自行去了解。
這裡我使用的是xml註解的方式,建立一個job類,此類不需要繼承任何類和實現任何介面。
package com。socket。web。quartz;import com。socket。web。socket。WebSocketServer;import java。io。IOException;import java。util。Map;import java。util。concurrent。ConcurrentHashMap;/** * @Author: 清風一陣吹我心 * @ProjectName: socket * @Package: com。socket。web。quartz * @ClassName: TestJob * @Description: * @Version: 1。0 **/public class TestJob { public void task(){ //獲取WebSocketServer物件的對映。 ConcurrentHashMap
定時器的實現類就完成了,我們還需要在springmvc。xml中進行配置
springmvc。xml配置:
<!—— 要執行的任務類 ——>
接下來是controller層的程式碼,就一個登入的功能。
package com。socket。web。controller;import com。socket。domain。User;import com。sun。org。apache。bcel。internal。generic。RETURN;import org。springframework。stereotype。Controller;import org。springframework。web。bind。annotation。RequestMapping;import org。springframework。web。bind。annotation。RequestMethod;import javax。servlet。http。HttpServletRequest;import javax。servlet。http。HttpSession;import java。util。UUID;/** * @Author: 清風一陣吹我心 * @ProjectName: socket * @Package: com。socket。web * @ClassName: ChatController * @Description: * @CreateDate: 2018/11/9 11:04 * @Version: 1。0 **/@RequestMapping(“socket”)@Controllerpublic class ChatController { /** * 跳轉到登入頁面 * @return */ @RequestMapping(value = “/login”,method = RequestMethod。GET) public String goLogin(){ return “login”; } /** * 跳轉到聊天頁面 * @param request * @return */ @RequestMapping(value = “/home”,method = RequestMethod。GET) public String goMain(HttpServletRequest request){ HttpSession session = request。getSession(); if (null == session。getAttribute(“USER_SESSION”)){ return “login”; } return “home”; } @RequestMapping(value = “/login”,method = RequestMethod。POST) public String login(User user, HttpServletRequest request){ HttpSession session = request。getSession(); //將使用者放入session session。setAttribute(“USER_SESSION”,user); return “redirect:home”; }}
以上就是登入的程式碼了,基本上就是虛擬碼,只要輸入使用者名稱就可以了,後面的邏輯,大家可以根據自己的業務來實現。
最後就是前臺頁面的設計了,登入,login。jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
訊息接收頁面,home。jsp
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
基本上,資料推送的功能就完成了,下面附上效果圖。
啟動tomcat。後臺定時器兩秒重新整理一次,判斷是否有websocket連線。
登入頁面:
資料推送頁面:
伺服器定時向客戶端推送資料的功能就完成了,有不明白的可以給博主留言,如果有什麼錯誤,也希望各位朋友指出,謝謝大家。
本文原始碼:
https://github。com/Qingfengchuiwoxin/websocket