Comet學(xué)習(xí)筆記(一)Tomcat與Comet近來由于畢業(yè)設(shè)計,一直在忙于comet技術(shù)的研究,有了一些心得和想法,特來與大家分享。 Comet技術(shù)被稱為下一代Ajax技術(shù),主要通過實現(xiàn)server push來解決ajax需要定時頻繁發(fā)送請求的問題。 通過Comet技術(shù),客戶端所需要的response信息不再需要主動的去索取,而是在服務(wù)器端以event的形式推至客戶端。 Comet技術(shù)常見的實現(xiàn)方式 streaming和long polling long poll:HTTP的連接保持,直到server端一個事件觸發(fā)或者到達(dá)timeout事件。client端在收到response消息后,一個新的HTTP請求會立刻開放。通過這種方式,server端可以將數(shù)據(jù)在任何時候push到客戶端。 streaming:在streaming方式中,HTTP的連接是始終保持的,即使客戶端收到響應(yīng),HTTP連接也不斷開。 Tomcat與Comet 在Tomcat 6中,增加了對Comet的支持,但是其自帶例子(/webapps/examples/jsp/chat)有很多問題,沒有運行成功,懷疑該例并不完整(我的版本Tomcat 6.0.16),經(jīng)過學(xué)習(xí)和研究,發(fā)現(xiàn)了一些問題,希望能給仍然奮戰(zhàn)在其中的朋友一些幫助。 前期準(zhǔn)備:使用tomcat提供的comet api之前,需要增加對NIO的支持,配置nio可是相當(dāng)方便,要做的僅僅是在server.xml里邊修改connector: <connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8080" redirectport="8443" connectiontimeout="20000"> Tomcat 6提供了CometProcessor和CometEvent接口,具體功能和操作不再贅述,詳情請見http://tomcat./tomcat-6.0-doc/aio.html。注意:實現(xiàn)CometProcessor接口后不用在servlet中寫doGet,doPoset方法,所有事件在BEGIN,READ,END,ERROR中實現(xiàn)。 簡單的Comet servlet代碼示例: ![]() ![]() 1 import java.io.*; 2 import javax.servlet.ServletException; 3 import javax.servlet.http.*; 4 import org.apache.catalina.CometEvent; 5 import org.apache.catalina.CometProcessor; 6 import org.apache.catalina.CometEvent.EventType; 7 8 public class cometServlet extends HttpServlet implements CometProcessor { 9 10 public void event(CometEvent e) throws IOException, ServletException { 11 if(e.getEventType() == EventType.BEGIN) { 12 // fill in code handling here 13 HttpServletResponse response = e.getHttpServletResponse(); 14 PrintWriter out = response.getWriter(); 15 out.write("Hello world"); 16 out.flush(); 17 //System.out.println("message sent"); 18 } 19 if(e.getEventType() == EventType.READ) { 20 // fill in code handling here 21 } 22 // and continue handing other events 23 } 24 } 在此源代碼中,僅完成向客戶端發(fā)送Hello World字符串的功能,關(guān)鍵點,out.flush()不可缺少,以往在寫ajax程序的時候,往往忽略寫這句話,但這里如果不寫,客戶端無法收到響應(yīng)文字。由于tomcat采用streaming的方式實現(xiàn)comet,不知是否不加這句話的時候,客戶端不知道你的消息已經(jīng)結(jié)束,而始終處于一個等待的狀態(tài)(如果您有更專業(yè)的解釋,請指教)。 服務(wù)器端javascript相關(guān)代碼: ![]() ![]() 1 <script> 2 function CometEx() { 3 var request = new XMLHttpRequest(); 4 request.open("GET", 'http://localhost:8080/cometEx/cometServlet', true); 5 request.onreadystatechange = function() { 6 if (request.readyState == 3 && request.status == 200) { 7 alert(request.responseText); 8 } 9 } 10 request.send(null); 11 } 12 </script> |
|