基于Tomcat的websocket說明文檔_第1頁
基于Tomcat的websocket說明文檔_第2頁
基于Tomcat的websocket說明文檔_第3頁
基于Tomcat的websocket說明文檔_第4頁
基于Tomcat的websocket說明文檔_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

本文格式為Word版,下載可任意編輯——基于Tomcat的websocket說明文檔Tomcat版本:Tomcat7.0.27及其以上

瀏覽器:MozillaFirefox,Chromium等,不支持IE

WebSockets簡介

WebSocket是下一代web通信的協(xié)議,他有以下特點(diǎn):·整頁重新加載

·使用Ajax處理重新加載組件·Comet通信

類似于AJAX,但在服務(wù)器上不長時間持有線程。TCP雙向通信

上面羅列的每一種特性都有優(yōu)點(diǎn)和缺點(diǎn),Tomcat6使用Comet處理機(jī)制通過HTTP實(shí)現(xiàn)了雙向通信。這種實(shí)現(xiàn)允許異步事件驅(qū)動和雙向通信,但是這種實(shí)現(xiàn)有一些限制:

·由于HTTP是基于請求/相應(yīng)的,不是一個雙向協(xié)議,代理和其他的中介機(jī)制可能無法正常運(yùn)行,而且在任何特定的時間點(diǎn),只能單向傳輸。

·對于服務(wù)器端開發(fā)者來說,引入多線程開發(fā)模型會變得更加困難。·由于不是標(biāo)準(zhǔn)的API,會導(dǎo)致沒有統(tǒng)一接口。Servlet3.0引入了一個新的功能叫做異步servlet,Servlet接收到請求之后,可能首先需要對請求攜帶的數(shù)據(jù)進(jìn)行一些預(yù)處理;接著,Servlet線程將請求轉(zhuǎn)交給一個異步線程來執(zhí)行業(yè)務(wù)處理,線程本身返回至容器,此時Servlet還沒有生成響應(yīng)數(shù)據(jù),異步線程處理完業(yè)務(wù)以后,可以直接生成響應(yīng)數(shù)據(jù)(異步線程擁有ServletRequest和ServletResponse對象的引用),或者將請求繼續(xù)轉(zhuǎn)發(fā)給其它Servlet。如此一來,Servlet線程不再是一直處于阻塞狀態(tài)以等待業(yè)務(wù)規(guī)律的處理,而是啟動異步線程之后可以馬上返回。

這個特性要比tomcat的comet處理機(jī)制強(qiáng)大。而這是一個標(biāo)準(zhǔn)的ServletAPI,在其基礎(chǔ)上建立通用開發(fā)框架是十分簡單的。異步的servlet雖然解決了一部分網(wǎng)絡(luò)通信的需求,但是由于其缺乏雙向通信的支持,使其的適用范圍依舊有限。

WebSocket是另外一種嘗試通過HTTP支持異步、事件驅(qū)動和雙向通信的規(guī)范協(xié)議。其標(biāo)準(zhǔn)化的一個形式是JavaScriptAPI。現(xiàn)在缺乏一個標(biāo)準(zhǔn)的服務(wù)器端API,Servlet3.1的專家小組正在積極的研究對此的一些基層的支持,這也是我寫這篇文章的原因。

WebSocket是否將蛻變成一個完整完備的WebSocketAPI仍有待觀測。在此期間主要的的Servlet容器都只是支持非標(biāo)準(zhǔn)的API,Tomcat也不例外。

例如

在Tomcat7.0.27版本中,apache給出了WebSocket的實(shí)現(xiàn),這項(xiàng)功能是好多Tomcat用戶一直期望的,而如今,這項(xiàng)功能有了。

第一個類,需要一個Servlet來處理WebSocket請求:

MyWebSocketServlet.Javapackagecom.yzkj.websocket;

importjavax.servlet.http.HttpServletRequest;

importorg.apache.catalina.websocket.StreamInbound;importorg.apache.catalina.websocket.WebSocketServlet;

publicclassMyWebSocketServletextendsWebSocketServlet{

/*與7.0.27不同的,Tomcat7.0.29改變了createWebSocketInbound方法的定義,增加了一個HttpServletRequest參數(shù),這樣我們也可以從request參數(shù)中獲取更多請求方的信息*/

}

@Override

protectedStreamInboundcreateWebSocketInbound(Stringarg0){}

System.out.println(\);returnnewMyMessageInbound();

這個Servlet繼承自WebSocketServlet,實(shí)現(xiàn)createWebSocketInbound方法。該方法返回其次個類的實(shí)例。

其次個類,處理每一次具體的WebSocket任務(wù):

MyMessageInbound.javapackagecom.yzkj.websocket;

importjava.io.IOException;importjava.nio.ByteBuffer;importjava.nio.CharBuffer;

importorg.apache.catalina.websocket.MessageInbound;importorg.apache.catalina.websocket.WsOutbound;

//實(shí)現(xiàn)下面四個事件處理函數(shù)(其實(shí)onClose和onOpen有缺省實(shí)現(xiàn))

publicclassMyMessageInboundextendsMessageInbound{//有二進(jìn)制消息數(shù)據(jù)到達(dá),@Override

protectedvoidonBinaryMessage(ByteBufferarg0)throwsIOException{

//TODOAuto-generatedmethodstub}

//有文本消息數(shù)據(jù)到達(dá)@Override

protectedvoidonTextMessage(CharBuffermsg)throwsIOException{for(MessageInboundmessageInbound:InitServlet.getSocketList()){

CharBufferbuffer=CharBuffer.wrap(msg);

WsOutboundoutbound=messageInbound.getWsOutbound();//getWsOutbound可以返回當(dāng)前的WsOutbound,通過他向客戶端回傳數(shù)據(jù),這里采用的是nio的CharBuffer

outbound.writeTextMessage(buffer);outbound.flush();}}

//WebSocket關(guān)閉事件,參數(shù)status應(yīng)當(dāng)來自

org.apache.catalina.websocket.Constants中定義的幾個常量,可以參考文檔或者核對一下Tomcat的源碼@Override

protectedvoidonClose(intstatus){

InitServlet.getSocketList().remove(this);super.onClose(status);}

//WebSocket握手完成,創(chuàng)立完畢,WsOutbound用于向客戶端發(fā)送數(shù)據(jù)@Override

protectedvoidonOpen(WsOutboundoutbound){super.onOpen(outbound);

InitServlet.getSocketList().add(this);}}

這個類繼承自MessageInbound類,必需實(shí)現(xiàn)onBinaryMessage和onTextMessage方法。

還要一個初始化的Servlet

InitServlet.java

packagecom.yzkj.websocket;

importjava.util.ArrayList;importjava.util.List;

importjavax.servlet.ServletConfig;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;

importorg.apache.catalina.websocket.MessageInbound;

publicclassInitServletextendsHttpServlet{

privatestaticListsocketList;

publicvoidinit(ServletConfigconfig)throwsServletException{InitServlet.socketList=newArrayList();super.init(config);

System.out.println(\);}

publicstaticListgetSocketList(){returnInitServlet.socketList;}}

最終,web.xml中進(jìn)行一下Servlet的配置。

mywebsocket

com.yzkj.websocket.MyWebSocketServlet

mywebsocket*.do

initServlet

com.yzkj.websocke

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論