Websocket入門
- 前言基礎
- 1.什么是webSocket
- 2.websocket與其他協議的區別
- 3.使用websocket簡單代碼實作
前言基礎
TCP/IP五層模型與OSI七層模型的協議

更多計網相關的知識可以看這篇文章【計算機網路-五層和七層模型】
1.什么是webSocket
WebSocket協議是基于TCP的一種新的網路協議,他是應用層的一個協議,與http協議同級別,它實作了瀏覽器與服務器全雙工(full-duplex)通信——允許服務器主動發送資訊給客戶端,
2.websocket與其他協議的區別
WebSocket和Http的異同點
相同點:
- 建立在TCP之上,通過TCP協議來傳輸資料,
- 都是可靠性傳輸協議,
- 都是應用層協議,
不同點:
- WebSocket是HTML5中的協議,支持持久連接,HTTP不支持持久連接,
- HTTP是單向協議,只能由客戶端發起,做不到服務器主動向客戶端推送資訊,
WebSocket和Socket
Socket本身并不是一個協議,它作業在OSI模型會話層,是一個套接字,TCP/IP網路的API,是為了方便大家直接使用更底層協議而存在的一個抽象層,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket介面后面,對用戶來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議,
WebSocket則是一個典型的應用層協議,
總結: 說白了它倆并沒有直接關系
WebSocket HTTP和TCP/IP
WebSocket和HTTP一樣,都是建立在TCP之上,通過TCP來傳輸資料
3.使用websocket簡單代碼實作
常量類:(可要可不要)
public class WebsocketConst {
/**
* 訊息json key:cmd
*/
public static final String MSG_CMD = "cmd";
/**
* 訊息json key:msgId
*/
public static final String MSG_ID = "msgId";
/**
* 訊息json key:msgTxt
*/
public static final String MSG_TXT = "msgTxt";
/**
* 訊息json key:userId
*/
public static final String MSG_USER_ID = "userId";
/**
* 訊息型別 heartcheck
*/
public static final String CMD_CHECK = "heartcheck";
/**
* 訊息型別 user 用戶訊息
*/
public static final String CMD_USER = "user";
/**
* 訊息型別 topic 系統通知
*/
public static final String CMD_TOPIC = "topic";
/**
* 訊息型別 email
*/
public static final String CMD_EMAIL = "email";
/**
* 訊息型別 meetingsign 會議簽到
*/
public static final String CMD_SIGN = "sign";
/**
* 訊息型別 新聞發布/取消
*/
public static final String NEWS_PUBLISH = "publish";
}
主要業務實作類:
@Component
@ServerEndpoint("/websocket/{userId}") //此注解相當于設定訪問URL
public class WebSocket {
private static final Logger log = LoggerFactory.getLogger(WebSocket.class);
private Session session;
private String userId;
/**
* 快取 webSocket連接到單機服務class中(整體方案支持集群)
*/
private static CopyOnWriteArraySet<WebSocket> webSockets = new CopyOnWriteArraySet<>();
private static Map<String, Session> sessionPool = new HashMap<String, Session>();
@OnOpen
public void onOpen(Session session, @PathParam(value = "userId") String userId) {
try {
this.session = session;
this.userId = userId;
webSockets.add(this);
sessionPool.put(userId, session);
log.info("【websocket訊息】有新的連接,總數為:" + webSockets.size());
} catch (Exception e) {
log.error(e.getMessage());
}
}
@OnClose
public void onClose() {
try {
webSockets.remove(this);
sessionPool.remove(this.userId);
log.info("【websocket訊息】連接斷開,總數為:" + webSockets.size());
} catch (Exception e) {
log.error(e.getMessage());
}
}
/**
* 服務端推送訊息
*
* @param userId
* @param message
*/
public void pushMessage(String userId, String message) {
Session session = sessionPool.get(userId);
if (session != null && session.isOpen()) {
try {
log.info("【websocket訊息】 單點訊息:" + message);
session.getAsyncRemote().sendText(message);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
/**
* 服務端推送訊息
* @param ids
* @param message
*/
public void pushMessage(String[] ids, String message) {
for (String uid:ids) {
// 如果ids的格式有問題 導致某個id為"" 直接跳出本次回圈
if ("".equals(uid)) continue;
Session session = sessionPool.get(uid);
if (session != null && session.isOpen()) {
try {
log.info("【websocket訊息】 單點訊息:" + message);
session.getAsyncRemote().sendText(message);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
}
/**
* 服務器端推送訊息
*/
public void pushMessage(String message) {
try {
webSockets.forEach(ws -> ws.session.getAsyncRemote().sendText(message));
} catch (Exception e) {
log.error(e.getMessage());
}
}
@OnMessage
public void onMessage(String message) {
//todo 現在有個定時任務刷,應該去掉
log.debug("【websocket訊息】收到客戶端訊息:" + message);
JSONObject obj = new JSONObject();
//業務型別
obj.put(WebsocketConst.MSG_CMD, WebsocketConst.CMD_CHECK);
//訊息內容
obj.put(WebsocketConst.MSG_TXT, "心跳回應");
for (WebSocket webSocket : webSockets) {
webSocket.pushMessage(message);
}
}
}
上面的WebSocket 類 ,你可以作為一個service看待,然后根據自己的業務需求呼叫里面的業務方法, 例如:可以呼叫里面多載的三個pushMessage方法來實作 服務層向客戶端發送訊息
pushMessage(String message): 向所有上線的客戶端發送訊息
pushMessage(String userId, String message): 指定向單個客戶端發送訊息
pushMessage(String[] ids, String message): 指定向多個客戶端發送訊息
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/299500.html
標籤:其他
上一篇:【軟考系統架構設計師】復盤架構設計師真題知識點第六章---架構基礎概念
下一篇:TCP滑動視窗詳解
