91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用webSocket需要注意什么

發布時間:2021-09-13 18:19:14 來源:億速云 閱讀:261 作者:小新 欄目:大數據

這篇文章將為大家詳細講解有關使用webSocket需要注意什么,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

1. 什么是webSocket

一種網絡通信協議,是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。

  • HTTP 協議的缺陷:通信只能由客戶端發起,且服務端不能主動向客戶端發送資源。

  • 如果想要知道服務端是否準備好資源,只有采用輪詢方式請求,浪費資源(因為必須不停連接,或者 HTTP 連接始終打開), websocket正是解決了這一問題,可以實現雙向通信。

  • WebSocket目前支持兩種統一資源標志符wswss,類似于HTTP和HTTPS,主要是加密與非加密的兩種協議。

  • 一圖看懂HTTP與webSocket的原理區別:

使用webSocket需要注意什么

2. webSocket的注解及使用

  • 常用注解:

@ServerEndpoint(value = "/webSocketProxy/{nickName}")

表示一個URI映射的路徑,標準的restfulAPI,{nickName}為路徑參數。用于注解于類上。

@OnOpen     @OnMessage     @OnClose      @OnError

以上四個注解用于方法上,分別對應不同的事件:打開連接、收到消息、連接關閉、發生錯誤。當發生對應事件時,該方法將會被觸發。通常開發中主要在@OnMessage方法內進行業務開發。

@PathParam("nickName")

此注解用于獲取路徑參數{nickName}。

  • 五種連接狀態:

NOT_YET_CONNECTED, CONNECTING, OPEN, CLOSING, CLOSED;
  • 服務端的簡單實例

@ServerEndpoint(value = "/customWebSocket/{nickName}")
@Component
@Slf4j
public class CustomWebSocket {

	// 用來存放每個客戶端對應的MyWebSocket對象 全局對象
	private static CopyOnWriteArraySet<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>();
	// 與某個客戶端的連接會話,需要通過它來給客戶端發送數據
	private Session session;

	@OnMessage
	public void onMessage(String message, Session session, @PathParam("nickName") String nickName) throws IOException {
		// 群發消息
		for (CustomWebSocket myWebSocket : user) {
			log.info("請求url:" + session.getRequestURI());
			myWebSocket.session.getBasicRemote().sendText(nickName + " :" + message);
			log.info("custom 收到消息:" + nickName + " :" + message);
		}
	}

	@OnOpen
	public void onOpen(Session session) {
		log.info("custom " + session.getId() + " open...");
		this.session = session;
		user.add(this);
	}

	@OnClose
	public void onClose() {
		System.out.println("custom " + this.session.getId() + " close...");
		session=null;
		user.remove(this);
	}

	@OnError
	public void onError(Session session, Throwable error) {
		session=null;
		log.warn("custom " + this.session.getId() + " error...",error);
	}

3. WebSocket的注意事項

  • WebSocket服務端 由spring管理后,默認是單例,但是對于WebSocket對象,每個連接會新建一個對象,
    因此需要注意static關鍵字的優雅使用。一個session對應一個會話。


  • 特別注意這段代碼,使用了static 修飾是類屬性,用來存儲所有連接的客戶端信息。
     static CopyOnWriteArraySet<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>();


  • 如果報錯:The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method,則是存在多線程并發發送消息的情況。采用同步機制即可。

synchronized (session){
    session.getBasicRemote().sendText(JSON.toJSONString(message));
}

關于“使用webSocket需要注意什么”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

察哈| 浙江省| 雅安市| 彰武县| 平山县| 沛县| 莎车县| 麻江县| 弋阳县| 乌兰县| 十堰市| 平泉县| 廉江市| 霸州市| 徐汇区| 新余市| 尼勒克县| 上虞市| 临沧市| 正宁县| 阿克| 黔南| 米泉市| 潼关县| 施甸县| 连南| 修文县| 府谷县| 丹棱县| 澄城县| 偃师市| 云霄县| 宝清县| 山丹县| 来宾市| 万载县| 禄劝| 岳阳县| 泰兴市| 通海县| 阜平县|