1. 程式人生 > >Java WebSocket程式設計——WebSocket端點的生命週期

Java WebSocket程式設計——WebSocket端點的生命週期

1.認識WebSocket端點的4個生命週期

  • 開啟事件:此事件發生在端點上建立新連線時並且在任何其他事件發生之前
  • 訊息事件:此事件接收WebSocket對話中另一個端傳送的訊息。它可以發生在WebSocket端點接收了開啟事件之後並且在接收關閉事件關閉連線之前的任意時刻。
  • 錯誤事件:此事件在WebSocket連線或者端點發送錯誤時產生(注:若錯誤是致命錯誤,則該連線會被關閉)
  • 關閉事件:此事件表示WebSocket端點的連線目前正在部分地關閉,它可以由參與連線的任意一個端點發出。

2.註解式端點事件處理

對於註解式端點來說,為了攔截不同的生命週期事件,我們需要以下方法級註解:@OnOpen @OnMessage @OnError @OnClose
  • @OnOpen
該註解對應攔截開啟事件。開啟事件伴隨著三部分資訊:WebSocket Session物件,用於表示已經建立好的連線;配置物件(EndpointConfig的例項),包含了用來配置端點的資訊;一組路徑引數,用於開啟階段握手時WebSocket端點匹配入站URI過程中獲取的路徑引數。 例子:
	/**
	 * 使用@OnOpen註解的方法是沒有任何返回值的公有方法,
	 * 這些方法有一個可選的Session引數,一個可選的EndpointConfig引數,以及任意數量的被@PathParam註解的String引數。
	 * 另外,這些引數的順序可以任意排列。
	 * @param session 用於表示已經建立好的連線
	 * @param config 配置物件
	 */
	@OnOpen
	public void init(Session session, EndpointConfig config) {
		// initialization code
	}
  • @OnMessage
該註解對應攔截訊息事件。訊息事件伴隨著四部分資訊:WebSocket Session物件,用於表示已經建立好的連線;配置物件(EndpointConfig的例項),包含了用來配置端點的資訊;一組路徑引數,用於開啟階段握手時WebSocket端點匹配入站URI過程中獲取的路徑引數;訊息本身。
連線上的訊息將以3種基本形式抵達:文字訊息、二進位制訊息或Pong訊息。JavaWebSocket API提供了一系列的選項使得能夠以這些形式接收訊息。最基本的形式是選擇使用帶String引數的方法來處理文字訊息;使用帶ByteBuffer或者是byte[]引數的方法來處理二進位制訊息;若你的訊息將僅僅處理Pong訊息,則可以使用JavaWebSocket API中的PongMessage介面的一個例項。 例子:
	/**
	 * 註解@OnMessage是方法級別註解,該註解指定了被註解的方法處理入站訊息
	 * 這些方法有一個可選的Session引數,一個可選的EndpointConfig引數,任意數量的被@PathParam註解的String引數,以及訊息本身。
	 * @param incomingMessage 入站訊息
	 * @return String 伺服器端返回的資料
	 */
	@OnMessage
	public String reply(String incomingMessage) {
		return "The server has received message:" + incomingMessage;
	}
或者:
	@OnMessage
	public void reply(byte[] messageData, Session session) {
        //process binarry data
	}
對於文字和二進位制訊息來說有一些更加高階的選項。例如:你可以選擇當訊息到來時分批地接收文字或者二進位制訊息。若如此,可以使用一對引數來表示到來的訊息分片(partial message)。對文字訊息分片來說是String和boolean,其中String引數表示文字訊息分片,boolean引數表示該分片是否是序列中的最後一個訊息分片;對二進位制訊息分片來說,可以選擇一對引數ByteBuffer(或者byte[])和boolean,其中ByteBuffer(或者byte[])表示二進位制訊息分片,boolean引數表示該分片是否是序列中的最後一個訊息分片。
	@OnMessage
	public void reply(String incomingMessage, boolean isLast) {
		//pass on to feed elsewhere
	}

	@OnMessage
	public void reply(ByteBuffer partialData, boolean isLast) {
		if (!isLast) {
			//there is more to come !
		} else {
			//now we have the whole message !
		}
	}
使用@OnMessage註解來處理輸入訊息的另一個選項是選擇使用Java I/O流(java.io.Reader,java.io.InputStream)。 WebSocket應用一般是非同步的雙向訊息。一般情況下的WebSocket應用並不總是立即響應入站訊息。如果想要立刻響應入站訊息,可以通過將@OnMessage註解的方法的返回型別設定為有返回型別,那麼WebSocket實現立即將返回值作為訊息返回給剛剛在方法中處理的訊息的傳送者。
  • @OnError
該註解對應攔截錯誤事件。開啟事件伴隨著三部分資訊:錯誤資訊、傳送錯誤的會話、一組路徑引數,用於開啟階段握手時WebSocket端點匹配入站URI過程中獲取的路徑引數。
	/**註解@OnError是方法級別註解,該註解指定了被註解的方法處理錯誤事件
	 * 這些方法的引數有可選的錯誤資訊、可選的傳送錯誤的會話、可選的一組路徑引數,用於開啟階段握手時WebSocket端點匹配入站URI過程中獲取的路徑
	 * @param t 錯誤資訊
	 */
	@OnError
	public void errorHandler(Throwable t) {
		//log error here
	}
處理入站訊息時,可能會發生3種基本的錯誤型別。
  • SessionException :如果該WebSocket端點的入站訊息是非正常的。
  • DecodeException :當WebSocket實現檢視將入站訊息解碼成開發人員所要求的某個物件時傳送錯誤。
  • 其他 :由WebSocket端點的其他方法產生的執行時錯誤。
如果不選擇在應用中包含錯誤處理方法,那麼WebSocket實現將記錄WebSocket端點操作過程中產生的任何錯誤。
  • @OnClose
該註解對應攔截關閉事件。開啟事件伴隨著三部分資訊:關閉資訊、一組路徑引數,用於開啟階段握手時WebSocket端點匹配入站URI過程中獲取的路徑引數、一些描述連線關閉原因的資訊
	/**註解@OnClose是方法級別註解,該註解指定了被註解的方法處理關閉事件
	 * 這些方法的引數有可選的關閉資訊、可選的一組路徑引數,用於開啟階段握手時WebSocket端點匹配入站URI過程中獲取的路徑引數
	 * @param reason 關閉原因
	 */
	@OnError
	public void closeConnection(CloseReason reason) {
		//log the reason for posterity
		//close database connection
	}

參考書籍:

 《Java WebSocket程式設計 開發、部署和保護動態Web應用》/(美)科沃德(Coward, D.) 著;劉建、夏先波 譯. ——北京:清華大學出版社,2015


相關推薦

Java WebSocket程式設計——WebSocket端點生命週期

1.認識WebSocket端點的4個生命週期 開啟事件:此事件發生在端點上建立新連線時並且在任何其他事件發生之前訊息事件:此事件接收WebSocket對話中另一個端傳送的訊息。它可以發生在WebSo

Java中執行緒的生命週期

1、執行緒的生命週期:新建(New)、就緒(Runnable)、執行(Running)、阻塞(Blocked)和死亡(Dead)5種狀態。 2、當執行緒物件呼叫了start()方法之後,該執行緒處於就緒狀態,Java虛擬機器會為其建立方法呼叫棧和程式計數器,處於這個狀態中的執行緒並沒有開始執行,只是表示該執行

Java面試經典:Servlet生命週期

  只存在一個Servlet物件,在有客戶端請求時才進行初始化,也只初始化一次,在destroy之前,所有的請求不再初始化。初始化完成後呼叫init方法,同初始化一樣,init方法也只調用一次。接下來對於每個請求先呼叫公有的service方法,然後公有的service方法再呼叫私有的service方法,私有的

java基礎78 Servlet的生命週期

1、Servlet的生命週期 簡單的解析就是: 建立servlet例項(呼叫構造器)---->呼叫init()方法---->呼叫service()方法----->呼叫destroy()方法 構造方法:建立servlet時被呼叫,預設情況下,第一次訪問servlet的時,建立servlet物

Java TCP/IP Socket程式設計】----深入剖析----TCP套接字生命週期

目錄   簡介 TCP連線 關閉TCP連線 解調多路複用 --------筆記來自於書籍《Java TCP/IP Socket程式設計》 簡介     新的Socket例項建立後(無論是通過公有的建構函式,或通過呼叫ServerSoc

Java併發程式設計之執行緒生命週期、守護執行緒、優先順序和join、sleep、yield

Java併發程式設計中,其中一個難點是對執行緒生命週期的理解,和多種執行緒控制方法、執行緒溝通方法的靈活運用。這些方法和概念之間彼此聯絡緊密,共同構成了Java併發程式設計基石之一。 Java執行緒的生命週期 Java執行緒類定義了New、Runnable、Running Man、Blocked和Dead

Java程式設計師從笨鳥到菜鳥之(九十四)深入java虛擬機器(三)——類的生命週期 下)類的初始化

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Java WebSocket程式設計(二):WebSocket實現主動推送互動

WebSocket協議 WebSocket協議通訊機制 WebSocket協議是獨立的、基於TCP的協議。其本質是先通過HTTP/HTTPS協議進行握手後建立一個用於交換資料的TCP連線,此後伺服器端與客戶器端通過此TCP連線進行實時通訊。 WebSocket開啟握手

Java WebSocket程式設計(一):EchoServer應用

通過一個簡單的示例(EchoServer應用)來了解Java WebSocket原理。這是一個客戶端/伺服器應用,客戶端是Web瀏覽器上的一小段JavaScript,伺服器是一個WebSocket端點。 執行環境:Java 8 ,Eclipse Java EE ,Tomcat 9.0

Java程式設計師從笨鳥到菜鳥之(九十三)深入java虛擬機器(二)——類的生命週期(上)類的載入和連線

         類載入器,顧名思義,類載入器(class loader)用來載入 Java 類到 Java 虛擬機器中。一般來說,Java 虛擬機器使用 Java 類的方式如下:Java 源程式(.java 檔案)在經過 Java 編譯器編譯之後就被轉換成 Java 位元組程式碼(.class 檔案)。類載

Java併發程式設計:執行緒的生命週期是個怎樣的過程?

前言 在日常開發過程中,如果我們需要執行一些比較耗時的程式的話,一般來說都是開啟一個新執行緒,把耗時的程式碼放線上程裡,然後開啟執行緒執行。但執行緒是會耗費系統資源的,如果有多個執行緒同時執行,互相之間搶佔系統資源,那無疑會對系統造成極大的壓力。所以,怎麼操作執行緒,保證不影響整個應用功能是很重要的,而這就

Java併發程式設計札記-(一)基礎-03執行緒的生命週期

本文主要講解Java中執行緒的狀態。Java中執行緒的狀態和作業系統中執行緒的狀態有所不同。 目錄 執行緒的生命週期 執行緒的狀態 執行緒的生命週期 此圖是根據自己的瞭解畫的,如果有不足或錯誤歡迎指正。 執行緒的狀態 Java中執行緒

WebSocket生命週期詳解

1、WebSocket端點的4個生命週期事件 開啟事件: 此事件發生在端點建立新連線時並且在任何其他事件發生之前。 訊息事件: 此事件接收 WebSocket 對話中另一端傳送的訊息。它可以發生在 WebSocket 端點接收了開啟事件之後並且在接收關閉事件

Java併發程式設計實戰(5)- 執行緒生命週期

在這篇文章中,我們來聊一下執行緒的生命週期。 [toc] # 概述 執行緒是作業系統中的一個概念,在Java中,它是實現併發程式的主要手段。 Java中的執行緒,本質上就是作業系統中的執行緒。 作業系統中的執行緒有“生老病死”,專業說法就是生命週期,雖然不同的開發語言對於作業系統的執行緒做了不同的封裝

java SSM框架 websocket即時通訊 代碼生成器 shiro redis 後臺框架源碼

pdh 音頻 orf 元素 數據庫連接池 extra 數據庫連接 宋體 jpg 1. 權限管理:點開二級菜單進入三級菜單顯示 角色(基礎權限)和按鈕權限 角色(基礎權限): 分角色組和角色,獨立分配菜單權限和增刪改查權限。 按鈕權限: 給角色分配按鈕

Java多執行緒生命週期

關於Java中執行緒的生命週期,首先看一下下面這張較為經典的圖: 上圖中基本上囊括了Java中多執行緒各重要知識點。掌握了上圖中的各知識點,Java中的多執行緒也就基本上掌握了。主要包括: Java執行緒具有五中基本狀態 新建狀態(New):當執行緒物件對建立後,即進入了

java基礎類庫學習(七.2)執行緒的生命週期

前言 利用java的類/介面建立好使用者執行緒後,我們呼叫執行緒物件的啟動方法,讓執行緒啟動 執行緒的生命週期:新建new 就緒runnable 執行running 阻塞blocked 死亡die 執行緒會在幾種狀態之間改變 新建new 執行緒類通過繼承Thread實現Run

Java執行緒的建立、執行緒的生命週期狀態

重新認識Java執行緒建立的三種方式:   繼承Thread類   1.通過繼承Thread類建立Thread子類,並重寫run方法。run方法的方法體表示執行緒類要完成的任務,因此也把run方法稱為執行體。 2.建立Thread子類的例項物件,就是建立了執行

JAVA執行緒的生命週期和分析工具

執行緒的生命週期的六種狀態  其中一種 有效的方法就是看原始碼 1、NEW 在 虛擬機器的 中建立物件,初始化 成員變數。 2、RUNNABLE 在虛擬中建立執行緒 私有的程式計數器,虛擬機器棧, 等待虛擬機器 執行緒排程器,分配時間片。 3、BLOCKED

java中執行緒池的生命週期

執行緒池生命週期包括: RUNNING:接收新的任務並處理佇列中的任務 SHUTDOWN:不接收新的任務,但是處理佇列中的任務 STOP:不接收新的任務,不處理佇列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的執行緒數是0 TERMINATED:termin