WebSocket是客戶端和服務端的通訊(http://www.javashuo.com/article/p-nmcskqka-be.html)css
瞭解計算機網絡協議的人,應該都知道:HTTP 協議是一種無狀態的、無鏈接的、單向的應用層協議。它採用了請求/響應模型。通訊請求只能由客戶端發起,服務端對請求作出應答處理。html
這種通訊模型有一個弊端:HTTP 協議沒法實現服務器主動向客戶端發起消息。前端
這種單向請求的特色,註定了若是服務器有連續的狀態變化,客戶端要獲知就很是麻煩。大多數 Web 應用程序將經過頻繁的異步JavaScript和XML(AJAX)請求實現長輪詢。輪詢的效率低,很是浪費資源(由於必須不停鏈接,或者 HTTP 鏈接始終打開)。java
所以,工程師們一直在思考,有沒有更好的方法。WebSocket 就是這樣發明的。WebSocket 鏈接容許客戶端和服務器之間進行全雙工通訊,以便任一方均可以經過創建的鏈接將數據推送到另外一端。WebSocket 只須要創建一次鏈接,就能夠一直保持鏈接狀態。這相比於輪詢方式的不停創建鏈接顯然效率要大大提升。jquery
Web瀏覽器和服務器都必須實現 WebSockets 協議來創建和維護鏈接。因爲 WebSockets 鏈接長期存在,與典型的HTTP鏈接不一樣,對服務器有重要的影響。web
基於多線程或多進程的服務器沒法適用於 WebSockets,由於它旨在打開鏈接,儘量快地處理請求,而後關閉鏈接。任何實際的 WebSockets 服務器端實現都須要一個異步服務器。spring
1、前端代碼(order-->list.ftl)bootstrap
<#--播放音樂-->
<audio id="notice" loop="loop">
<source src="/sell/mp3/song.mp3" type="audio/mpeg" />
</audio>
<script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
<script>
var websocket = null;
if('WebSocket' in window) {
websocket = new WebSocket('ws://sell.natapp4.cc/sell/webSocket');
}else {
alert('該瀏覽器不支持websocket!');
}
websocket.onopen = function (event) {
console.log('創建鏈接');
}
websocket.onclose = function (event) {
console.log('鏈接關閉');
}
websocket.onmessage = function (event) {
console.log('收到消息:' + event.data)
//彈窗提醒, 播放音樂
$('#myModal').modal('show');
document.getElementById('notice').play();
}
websocket.onerror = function () {
alert('websocket通訊發生錯誤!');
}
window.onbeforeunload = function () {
websocket.close();
}
</script>
2、先在後端pom.xml引進
3、作配置類WebSocketConfig後端
4、編寫WebSocket類(http://www.javashuo.com/article/p-uvdbgvnk-z.html)瀏覽器
package com.imooc.service;
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.ServerEndpoint;
import java.util.concurrent.CopyOnWriteArraySet;
@Component
@ServerEndpoint("/webSocket")
@Slf4j
public class WebSocket {
private Session session;
private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>(); //儲存session
@OnOpen
public void onOpen(Session session) {
this.session = session;
webSocketSet.add(this);
log.info("【websocket消息】有新的鏈接, 總數:{}", webSocketSet.size());
}
@OnClose
public void onClose() {
webSocketSet.remove(this);
log.info("【websocket消息】鏈接斷開, 總數:{}", webSocketSet.size());
}
@OnMessage
public void onMessage(String message) {
log.info("【websocket消息】收到客戶端發來的消息:{}", message);
}
public void sendMessage(String message) {
for (WebSocket webSocket: webSocketSet) {
log.info("【websocket消息】廣播消息, message={}", message);
try {
webSocket.session.getBasicRemote().sendText(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
發送消息只須要使用websocket.send("發送消息"),就能夠觸發服務端的onMessage()方法,當鏈接時,觸發服務器端onOpen()方法,此時也能夠調用發送消息的方法去發送消息。關閉websocket時,觸發服務器端onclose()方法,此時也能夠發送消息,可是不能發送給本身,由於本身的已經關閉了鏈接,可是能夠發送給其餘人。
5、在建立新訂單時發送消息