目錄:【持續更新。。。。。】
spring 部分常用注解
spring boot 學習之路1(簡單入門)
spring boot 學習之路2(注解介紹)
spring boot 學習之路3( 集成mybatis )
spring boot 學習之路4(日志輸出)
spring boot 學習之路5(打成war包部署tomcat)
spring boot 學習之路6(定時任務)
spring boot 學習之路6(集成durid連接池)
spring boot 學習之路7(靜態頁面自動生效問題)
spring boot 學習之路8 (整合websocket(1))
spring boot 學習之路9 (項目啟動后就執行特定方法)
初探websocket:
WebSocket是html5新增加的一種通信協議,目前流行的瀏覽器都支持這個協議,例如Chrome,Safari,Firefox,Opera,IE等等,對該協議支持最早的應該是chrome,從chrome12就已經開始支持,隨着協議草案的不斷變化,各個瀏覽器對協議的實現也在不停的更新。該協議還是草案,沒有成為標准,不過成為標准應該只是時間問題了,從WebSocket草案的提出到現在已經有十幾個版本了,目前對該協議支持最完善的瀏覽器應該是chrome,畢竟WebSocket協議草案也是Google發布的。
WebSocket API簡介:
var ws = new WebSocket(“ws://localhost:9999/ws/huhy/”);
ws.onopen = function(){ws.send(“Test!”); };
ws.onmessage = function(evt){console.log(evt.data);ws.close();};
ws.onclose = function(evt){console.log(“WebSocketClosed!”);};
ws.onerror = function(evt){console.log(“WebSocketError!”);};
注:
第一行代碼是在申請一個WebSocket對象,參數是需要連接的服務器端的地址,同http協議使用http://開頭一樣,WebSocket協議的URL使用ws://開頭,另外安全的WebSocket協議使用wss://開頭。
第二行到第五行為WebSocket對象注冊消息的處理函數,WebSocket對象一共支持四個消息 onopen, onmessage, onclose和onerror,當Browser和WebSocketServer連接成功后,會觸發onopen消息;如果連接失敗,發送、接收數據失敗或者處理數據出現錯誤,browser會觸發onerror消息;當Browser接收到WebSocketServer發送過來的數據時,就會觸發onmessage消息,參數evt中包含server傳輸過來的數據;當Browser接收到WebSocketServer端發送的關閉連接請求時,就會觸發onclose消息。我們可以看出所有的操作都是采用消息的方式觸發的,這樣就不會阻塞UI,使得UI有更快的響應時間,得到更好的用戶體驗。
說正事,
spring boot 和websocket的整合:
我分三步:
第一步:在pom中引入依賴jar包
第二步:
開發靜態頁面:由於spring boot 應用,所以選擇類控制頁面
第三步: 往spring容器中注入 ServerEndpointExporter
實現上面接口;
1 package com.huhy.web.websocket; 2 3 /** 4 * @Author:{huhy} 5 * @DATE:Created on 2017/11/20 10:34 6 * @Class Description: 7 */ 8 import org.springframework.stereotype.Component; 9 10 import javax.websocket.*; 11 import javax.websocket.server.PathParam; 12 import javax.websocket.server.ServerEndpoint; 13 import java.io.IOException; 14 import java.util.Map; 15 import java.util.concurrent.ConcurrentHashMap; 16 17 /** 18 * ServerEndpoint 19 * <p> 20 * 使用springboot的唯一區別是要@Component聲明下,而使用獨立容器是由容器自己管理websocket的,但在springboot中連容器都是spring管理的。 21 * <p> 22 * 雖然@Component默認是單例模式的,但springboot還是會為每個websocket連接初始化一個bean,所以可以用一個靜態set保存起來。 23 */ 24 @ServerEndpoint("/ws/huhy/{userName}") //WebSocket客戶端建立連接的地址 25 @Component 26 public class ChatRoomServerEndpoint { 27 28 /** 29 * 存活的session集合(使用線程安全的map保存) 30 */ 31 private static Map<String, Session> livingSessions = new ConcurrentHashMap<>(); 32 33 /** 34 * 建立連接的回調方法 35 * 36 * @param session 與客戶端的WebSocket連接會話 37 * @param userName 用戶名,WebSocket支持路徑參數 38 */ 39 @OnOpen 40 public void onOpen(Session session, @PathParam("userName") String userName) { 41 livingSessions.put(session.getId(), session); 42 sendMessageToAll(userName + " 加入聊天室"); 43 } 44 45 /** 46 * 收到客戶端消息的回調方法 47 * 48 * @param message 客戶端傳過來的消息 49 * @param session 對應的session 50 */ 51 @OnMessage 52 public void onMessage(String message, Session session, @PathParam("userName") String userName) { 53 sendMessageToAll(userName + " : " + message); 54 } 55 56 57 /** 58 * 發生錯誤的回調方法 59 * 60 * @param session 61 * @param error 62 */ 63 @OnError 64 public void onError(Session session, Throwable error) { 65 System.out.println("發生錯誤"); 66 error.printStackTrace(); 67 } 68 69 /** 70 * 關閉連接的回調方法 71 */ 72 @OnClose 73 public void onClose(Session session, @PathParam("userName") String userName) { 74 livingSessions.remove(session.getId()); 75 sendMessageToAll(userName + " 退出聊天室"); 76 } 77 78 79 /** 80 * 單獨發送消息 81 * 82 * @param session 83 * @param message 84 */ 85 public void sendMessage(Session session, String message) { 86 try { 87 session.getBasicRemote().sendText(message); 88 } catch (IOException e) { 89 e.printStackTrace(); 90 } 91 } 92 93 /** 94 * 群發消息 95 * 96 * @param message 97 */ 98 public void sendMessageToAll(String message) { 99 livingSessions.forEach((sessionId, session) -> { 100 sendMessage(session, message); 101 }); 102 } 103 104 }
測試:
先啟動spring boot 應用:
啟動兩個以上頁面
輸入驗證是不是可以同步: