生活随笔
收集整理的這篇文章主要介紹了
websocket使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
websocket
- 1. 概述
- 2. websocket的用法
- 3. js代碼實現
- 4. 服務器端代碼實現
maven下載地址:
https://mvnrepository.com/artifact/org.java-websocket/Java-WebSocket
1. 概述
- WebSocket是一種網絡傳輸協議,
可在單個TCP連接上進行全雙工通信,位于OSI模型的應用層。- WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,
允許服務端主動向客戶端推送數據。- 在WebSocket API中,瀏覽器和服務器只需要完成一次握手,
兩者之間就可以創建持久性的連接,并進行雙向數據傳輸。
WebSocket:
建立一次連接即可
連接斷開 不會自動重連(心跳機制)
雙向發送數據
WebSocket實現比較復雜(使用jar包)
SSE 使用 HTTP 協議,現有的服務器軟件都支持。WebSocket 是一個獨立協議。
SSE 屬于輕量級,使用簡單;WebSocket 協議相對復雜。
SSE 默認支持服務器斷線重連,WebSocket 需要自己實現。
SSE 一般只用來傳送文本,二進制數據需要編碼后傳送,WebSocket 默認支持傳送二進制數據。
SSE 支持自定義發送的消息類型
SSE 與 WebSocket 作用相似,
都是建立瀏覽器與服務器之間的通信渠道,
然后服務器向瀏覽器推送信息??傮w來說,WebSocket 更強大和靈活。
因為它是全雙工通道,可以雙向通信;
SSE 是單向通道,只能服務器向瀏覽器發送,因為流信息本質上就是下載。
如果瀏覽器向服務器發送信息,就變成了另一次 HTTP 請求
2. websocket的用法
1.啟動webSocket服務
2.使用js發送數據 (使用了心跳機制保持連接)
3.webSocket服務收到消息將消息發送給指定webSocket
3. js代碼實現
- js實現(假如現在有一個叫jack的用戶連接服務器)
var websocket
= '';
var ajaxPageNum
= 1;
var last_health
;
var health_timeout
= 10;
var tDates
= [], tData
= [];
var rightIndex
;if (window
.WebSocket
) {websocket
= new WebSocket(encodeURI('ws://' + document
.domain
+ ':8888'));websocket
.onopen = function() {console
.log('已連接');websocket
.send("onlinejack");heartbeat_timer
= setInterval(function() {keepalive(websocket
)}, 60000);};websocket
.onerror = function() {console
.log('連接發生錯誤');};websocket
.onclose = function() {console
.log('已經斷開連接');initWs();};websocket
.onmessage = function(message
) {console
.log(message
)console
.log(message
.data
)var jsonMsg
= JSON.parse(message
.data
);console
.log(jsonMsg
);};
} else {alert("該瀏覽器不支持提醒。<br/>建議使用高版本的瀏覽器,<br/>如 IE10、火狐 、谷歌 、搜狗等");
}
var initWs = function() {if (window
.WebSocket
) {websocket
= new WebSocket(encodeURI('ws://' + document
.domain
+ ':8888'));websocket
.onopen = function() {console
.log('已連接');websocket
.send("onlinejack");heartbeat_timer
= setInterval(function() {keepalive(websocket
)}, 60000);};websocket
.onerror = function() {console
.log('連接發生錯誤');};websocket
.onclose = function() {console
.log('已經斷開連接');initWs();};websocket
.onmessage = function(message
) {console
.log(message
)console
.log(message
.data
)};} else {alert("該瀏覽器不支持提醒。<br/>建議使用高版本的瀏覽器,<br/>如 IE10、火狐 、谷歌 、搜狗等");}
}
function keepalive(ws
) {var time
= new Date();if (last_health
!= -1 && (time
.getTime() - last_health
> health_timeout
)) {} else {if (ws
.bufferedAmount
== 0) {ws
.send('connect again from jack...');}}
}
4. 服務器端代碼實現
package websocket
;import java
.util
.ArrayList
;
import java
.util
.Collection
;
import java
.util
.HashMap
;
import java
.util
.List
;
import java
.util
.Map
;
import java
.util
.Set
;import org
.java_websocket
.WebSocket
;public class WsPool {private static final Map
<WebSocket, String> wsUserMap
= new HashMap<WebSocket, String>();public static String
getUserByWs(WebSocket conn
) {return wsUserMap
.get(conn
);}public static WebSocket
getWsByUser(String userName
) {Set
<WebSocket> keySet
= wsUserMap
.keySet();synchronized (keySet
) {for (WebSocket conn
: keySet
) {String cuser
= wsUserMap
.get(conn
);if (cuser
.equals(userName
)) {return conn
;}}}return null
;}public static void addUser(String userName
, WebSocket conn
) {wsUserMap
.put(conn
, userName
); }public static Collection
<String> getOnlineUser() {List
<String> setUsers
= new ArrayList<String>();Collection
<String> setUser
= wsUserMap
.values();for (String u
: setUser
) {setUsers
.add(u
);}return setUsers
;}public static boolean removeUser(WebSocket conn
) {if (wsUserMap
.containsKey(conn
)) {wsUserMap
.remove(conn
); return true;} else {return false;}}public static void sendMessageToUser(WebSocket conn
, String message
) {if (null
!= conn
&& null
!= wsUserMap
.get(conn
)) {conn
.send(message
);}}public static void sendMessageToAll(String message
) {Set
<WebSocket> keySet
= wsUserMap
.keySet();synchronized (keySet
) {for (WebSocket conn
: keySet
) {String user
= wsUserMap
.get(conn
);if (user
!= null
) {conn
.send(message
);}}}}
}
package websocket
;import java
.net
.InetSocketAddress
;import org
.java_websocket
.WebSocket
;
import org
.java_websocket
.handshake
.ClientHandshake
;
import org
.java_websocket
.server
.WebSocketServer
;public class WsServer extends WebSocketServer {public WsServer(int port
) {super(new InetSocketAddress(port
));}public WsServer(InetSocketAddress address
) {super(address
);}@Overridepublic void onOpen(WebSocket conn
, ClientHandshake handshake
) {}@Overridepublic void onClose(WebSocket conn
, int code
, String reason
, boolean remote
) {userLeave(conn
);System
.out
.println(reason
);}@Overridepublic void onMessage(WebSocket conn
, String message
) {System
.out
.println(message
);if(null
!= message
&&message
.startsWith("online")){userJoin(conn
,message
);}else if(null
!= message
&& message
.startsWith("offline")){userLeave(conn
);}}@Overridepublic void onError(WebSocket conn
, Exception ex
) {System
.out
.println("on error");ex
.printStackTrace();}private void userLeave(WebSocket conn
){WsPool
.removeUser(conn
);}private void userJoin(WebSocket conn
,String userName
){WsPool
.addUser(userName
, conn
);}}
- 配置websocket啟動 8080port(這里使用過濾器)
package filter
;import java
.io
.IOException
;import javax
.servlet
.Filter
;
import javax
.servlet
.FilterChain
;
import javax
.servlet
.FilterConfig
;
import javax
.servlet
.ServletException
;
import javax
.servlet
.ServletRequest
;
import javax
.servlet
.ServletResponse
;import org
.java_websocket
.WebSocketImpl
;import websocket
.WsServer
;public class StartWebSocket implements Filter {@Overridepublic void destroy() {}@Overridepublic void doFilter(ServletRequest arg0
, ServletResponse arg1
,FilterChain arg2
) throws IOException
, ServletException
{}@Overridepublic void init(FilterConfig arg0
) throws ServletException
{this.startWebSocketInstantMsg();}public void startWebSocketInstantMsg() {System
.out
.println("開始啟動webSocket服務...");WebSocketImpl
.DEBUG
= false;WsServer server
= new WsServer(8888);server
.start();}}
WebSocket wsConn
= WsPool
.getWsByUser("online" + toName
);
msg
.setMsgDate(new Timestamp(System
.currentTimeMillis()));
WsPool
.sendMessageToUser(wsConn
, JSON
.toJSONString(msg
));
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的websocket使用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。