1.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>
2.websocket服務器端
JSR356定義了WebSocket的規范,Tomcat7中實現了該標準。JSR356 的 WebSocket 規范使用 javax.websocket.*的 API,可以將一個普通 Java 對象(POJO)使用 @ServerEndpoint 注釋作為 WebSocket 服務器的端點。
@ServerEndpoint("/push")public class EchoEndpoint {@OnOpenpublic void onOpen(Session session) throws IOException {//以下代碼省略...}@OnMessagepublic String onMessage(String message) {//以下代碼省略...}@Message(maxMessageSize=6)public void receiveMessage(String s) {//以下代碼省略...} @OnErrorpublic void onError(Throwable t) {//以下代碼省略...}@OnClosepublic 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;//連接打開時執行@OnOpenpublic void onOpen(@PathParam("user") String user, Session session) {currentUser = user;System.out.println("Connected ... " + session.getId());}//收到消息時執行@OnMessagepublic String onMessage(String message, Session session) {System.out.println(currentUser + ":" + message);return currentUser + ":" + message;}//連接關閉時執行@OnClosepublic void onClose(Session session, CloseReason closeReason) {System.out.println(String.format("Session %s closed because of %s", session.getId(), closeReason));}//連接錯誤時執行@OnErrorpublic void onError(Throwable t) {t.printStackTrace();}
}
url中的字符張三是的路徑參數,響應請求的方法將自動映射。
3.小結
?Socket在應用程序間通信被廣泛使用,如果需要兼容低版本的瀏覽器,建議使用反向ajax或長鏈接實現;如果純移動端或不需考慮非現代瀏覽器則可以直接使用websocket。Flash實現推送消息的方法不建議使用,因為依賴插件且手機端支持不好。關于反向ajax也有一些封裝好的插件如“Pushlet”。
參考:http://www.cnblogs.com/best/p/5695570.html