【WebSocket】WebSocket消息推送
準備使用WebSocket實現Java與Vue或者安卓間的實時通信,實現私密聊天、群聊。查詢下資料備用。
WebSocket客戶端
websocket允許通過JavaScript建立與遠程服務器的連接,從而實現客戶端與服務器間雙向的通信。在websocket中有兩個方法:
1、send() 向遠程服務器發送數據
2、close() 關閉該websocket鏈接
websocket同時還定義了幾個監聽函數
1、onopen 當網絡連接建立時觸發該事件
2、onerror 當網絡發生錯誤時觸發該事件
3、onclose 當websocket被關閉時觸發該事件
4、onmessage 當websocket接收到服務器發來的消息的時觸發的事件,也是通信中最重要的一個監聽事件。msg.data
websocket還定義了一個readyState屬性,這個屬性可以返回websocket所處的狀態:
1、CONNECTING(0) websocket正嘗試與服務器建立連接
2、OPEN(1) websocket與服務器已經建立連接
3、CLOSING(2) websocket正在關閉與服務器的連接
4、CLOSED(3) websocket已經關閉了與服務器的連接
websocket的url開頭是ws,如果需要ssl加密可以使用wss,當我們調用websocket的構造方法構建一個websocket對象(new WebSocket(url))的之后,就可以進行即時通信了。
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>WebSocket 客戶端</title>
</head>
<body>
<div>
<input type="button" id="btnConnection" value="連接" />
<input type="button" id="btnClose" value="關閉" />
<input type="button" id="btnSend" value="發送" />
</div>
<script src="js/jquery-1.11.1.min.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
var socket;
if(typeof(WebSocket) == "undefined") {
alert("您的瀏覽器不支持WebSocket");
return;
}
$("#btnConnection").click(function() {
//實現化WebSocket對象,指定要連接的服務器地址與端口
socket = new WebSocket("ws://192.168.1.2:8888");
//打開事件
socket.onopen = function() {
alert("Socket 已打開");
//socket.send("這是來自客戶端的消息" + location.href + new Date());
};
//獲得消息事件
socket.onmessage = function(msg) {
alert(msg.data);
};
//關閉事件
socket.onclose = function() {
alert("Socket已關閉");
};
//發生了錯誤事件
socket.onerror = function() {
alert("發生了錯誤");
}
});
//發送消息
$("#btnSend").click(function() {
socket.send("這是來自客戶端的消息" + location.href + new Date());
});
//關閉
$("#btnClose").click(function() {
socket.close();
});
</script>
</body>
</html>
WebSocket服務器端
JSR356定義了WebSocket的規范,Tomcat7中實現了該標準。JSR356 的 WebSocket 規范使用 javax.websocket.*的 API,可以將一個普通 Java 對象(POJO)使用 @ServerEndpoint 注釋作為 WebSocket 服務器的端點。
@ServerEndpoint("/push")
public class EchoEndpoint {
@OnOpen
public void onOpen(Session session) throws IOException {
//以下代碼省略...
}
@OnMessage
public String onMessage(String message) {
//以下代碼省略...
}
@Message(maxMessageSize=6)
public void receiveMessage(String s) {
//以下代碼省略...
}
@OnError
public void onError(Throwable t) {
//以下代碼省略...
}
@OnClose
public void onClose(Session session, CloseReason reason) {
//以下代碼省略...
}
}
上面簡潔代碼即建立了一個WebSocket的服務端,@ServerEndpoint("/push")的annotation注釋端點表示將WebSocket服務端運行在ws://[Server端IP或域名]:[Server端口]/項目/push的訪問端點,客戶端瀏覽器已經可以對WebSocket客戶端API發起HTTP長連接了。
使用ServerEndpoint注釋的類必須有一個公共的無參數構造函數,
@OnMessage注解的Java方法用于接收傳入的WebSocket信息,這個信息可以是文本格式,也可以是二進制格式。
@OnOpen在這個端點一個新的連接建立時被調用。參數提供了連接的另一端的更多細節。Session表明兩個WebSocket端點對話連接的另一端,可以理解為類似HTTPSession的概念。
@OnClose在連接被終止時調用。參數closeReason可封裝更多細節,如為什么一個WebSocket連接關閉。
更高級的定制如@Message注釋,MaxMessageSize屬性可以被用來定義消息字節最大限制,在示例程序中,如果超過6個字節的信息被接收,就報告錯誤和連接關閉。
package action;
import javax.websocket.CloseReason;
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;
//ws://127.0.0.1:8087/Demo1/ws/張三
@ServerEndpoint("/ws/{user}")
public class WSServer {
private String currentUser;
//連接打開時執行
@OnOpen
public void onOpen(@PathParam("user") String user, Session session) {
currentUser = user;
System.out.println("Connected ... " + session.getId());
}
//收到消息時執行
@OnMessage
public String onMessage(String message, Session session) {
System.out.println(currentUser + ":" + message);
return currentUser + ":" + message;
}
//連接關閉時執行
@OnClose
public void onClose(Session session, CloseReason closeReason) {
System.out.println(String.format("Session %s closed because of %s", session.getId(), closeReason));
}
//連接錯誤時執行
@OnError
public void onError(Throwable t) {
t.printStackTrace();
}
}
url中的字符張三是的路徑參數,響應請求的方法將自動映射。
測試運行
小結與消息推送框架
Socket在應用程序間通信被廣泛使用,如果需要兼容低版本的瀏覽器,建議使用反向ajax或長鏈接實現;如果純移動端或不需考慮非現代瀏覽器則可以直接使用websocket。Flash實現推送消息的方法不建議使用,因為依賴插件且手機端支持不好。關于反向ajax也有一些封裝好的插件如“Pushlet”
開源Java消息推送框架 Pushlet
Pushlet 是一個開源的 Comet 框架,Pushlet 使用了觀察者模型:客戶端發送請求,訂閱感興趣的事件;服務器端為每個客戶端分配一個會話 ID 作為標記,事件源會把新產生的事件以多播的方式發送到訂閱者的事件隊列里。
源碼地址:https://github.com/wjw465150/Pushlet
Pushlet是一種comet實現:在Servlet機制下,數據從server端的Java對象直接推送(push)到(動態)HTML頁面,而無需任何Javaapplet或者插件的幫助。它使server端可以周期性地更新client的web頁面,這與傳統的request/response方式相悖。瀏覽器client為兼容JavaScript1.4版本以上的瀏覽器(如InternetExplorer、FireFox),并使用JavaScript/DynamicHTML特性。而底層實現使用一個servlet通過Http連接到JavaScript所在的瀏覽器,并將數據推送到后者。
開源DotNet消息推送框架SignalR
SignalR是一個ASP .NET下的類庫,可以在ASP .NET的Web項目中實現實時通信。在Web網頁與服務器端間建立Socket連接,當WebSockets可用時(即瀏覽器支持Html5)SignalR使用WebSockets,當不支持時SignalR將使用長輪詢來保證達到相同效果。
官網:http://signalr.net/
源碼:https://github.com/SignalR/SignalR
聊天實例參考:
https://www.cnblogs.com/huanzi-qch/p/9889521.html
websocket消息推送參考:
https://www.cnblogs.com/best/p/5695570.html整理的很詳細。
詳情請看原文。
總結
以上是生活随笔為你收集整理的【WebSocket】WebSocket消息推送的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 完整的项目管理流程(软件开发)
- 下一篇: 简单配置让iterm2用得更爽