使用webSocket需要注意什么

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

從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)服務(wù)體系,各種行業(yè)企業(yè)客戶(hù)提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)公司將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。

1. 什么是webSocket

一種網(wǎng)絡(luò)通信協(xié)議,是 HTML5 開(kāi)始提供的一種在單個(gè) TCP 連接上進(jìn)行全雙工通訊的協(xié)議。

  • HTTP 協(xié)議的缺陷:通信只能由客戶(hù)端發(fā)起,且服務(wù)端不能主動(dòng)向客戶(hù)端發(fā)送資源。

  • 如果想要知道服務(wù)端是否準(zhǔn)備好資源,只有采用輪詢(xún)方式請(qǐng)求,浪費(fèi)資源(因?yàn)楸仨毑煌_B接,或者 HTTP 連接始終打開(kāi)), websocket正是解決了這一問(wèn)題,可以實(shí)現(xiàn)雙向通信。

  • WebSocket目前支持兩種統(tǒng)一資源標(biāo)志符wswss,類(lèi)似于HTTP和HTTPS,主要是加密與非加密的兩種協(xié)議。

  • 一圖看懂HTTP與webSocket的原理區(qū)別:

使用webSocket需要注意什么

2. webSocket的注解及使用

  • 常用注解:

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

表示一個(gè)URI映射的路徑,標(biāo)準(zhǔn)的restfulAPI,{nickName}為路徑參數(shù)。用于注解于類(lèi)上。

@OnOpen     @OnMessage     @OnClose      @OnError

以上四個(gè)注解用于方法上,分別對(duì)應(yīng)不同的事件:打開(kāi)連接、收到消息、連接關(guān)閉、發(fā)生錯(cuò)誤。當(dāng)發(fā)生對(duì)應(yīng)事件時(shí),該方法將會(huì)被觸發(fā)。通常開(kāi)發(fā)中主要在@OnMessage方法內(nèi)進(jìn)行業(yè)務(wù)開(kāi)發(fā)。

@PathParam("nickName")

此注解用于獲取路徑參數(shù){nickName}。

  • 五種連接狀態(tài):

NOT_YET_CONNECTED, CONNECTING, OPEN, CLOSING, CLOSED;
  • 服務(wù)端的簡(jiǎn)單實(shí)例

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

	// 用來(lái)存放每個(gè)客戶(hù)端對(duì)應(yīng)的MyWebSocket對(duì)象 全局對(duì)象
	private static CopyOnWriteArraySet<CustomWebSocket> user = new CopyOnWriteArraySet<CustomWebSocket>();
	// 與某個(gè)客戶(hù)端的連接會(huì)話(huà),需要通過(guò)它來(lái)給客戶(hù)端發(fā)送數(shù)據(jù)
	private Session session;

	@OnMessage
	public void onMessage(String message, Session session, @PathParam("nickName") String nickName) throws IOException {
		// 群發(fā)消息
		for (CustomWebSocket myWebSocket : user) {
			log.info("請(qǐng)求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的注意事項(xiàng)

  • WebSocket服務(wù)端 由spring管理后,默認(rèn)是單例,但是對(duì)于WebSocket對(duì)象,每個(gè)連接會(huì)新建一個(gè)對(duì)象,
    因此需要注意static關(guān)鍵字的優(yōu)雅使用。一個(gè)session對(duì)應(yīng)一個(gè)會(huì)話(huà)。

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

  • 如果報(bào)錯(cuò):The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method,則是存在多線(xiàn)程并發(fā)發(fā)送消息的情況。采用同步機(jī)制即可。

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

關(guān)于“使用webSocket需要注意什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

文章名稱(chēng):使用webSocket需要注意什么
URL網(wǎng)址:http://muchs.cn/article18/jeppdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開(kāi)發(fā)、品牌網(wǎng)站設(shè)計(jì)、ChatGPT、App設(shè)計(jì)、做網(wǎng)站、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司