Comet學(xué)習(xí)筆記(一)Tomcat與Comet近來(lái)由于畢業(yè)設(shè)計(jì),一直在忙于comet技術(shù)的研究,有了一些心得和想法,特來(lái)與大家分享。 Comet技術(shù)被稱(chēng)為下一代Ajax技術(shù),主要通過(guò)實(shí)現(xiàn)server push來(lái)解決ajax需要定時(shí)頻繁發(fā)送請(qǐng)求的問(wèn)題。 通過(guò)Comet技術(shù),客戶(hù)端所需要的response信息不再需要主動(dòng)的去索取,而是在服務(wù)器端以event的形式推至客戶(hù)端。 Comet技術(shù)常見(jiàn)的實(shí)現(xiàn)方式 streaming和long polling long poll:HTTP的連接保持,直到server端一個(gè)事件觸發(fā)或者到達(dá)timeout事件。client端在收到response消息后,一個(gè)新的HTTP請(qǐng)求會(huì)立刻開(kāi)放。通過(guò)這種方式,server端可以將數(shù)據(jù)在任何時(shí)候push到客戶(hù)端。 streaming:在streaming方式中,HTTP的連接是始終保持的,即使客戶(hù)端收到響應(yīng),HTTP連接也不斷開(kāi)。 Tomcat與Comet 在Tomcat 6中,增加了對(duì)Comet的支持,但是其自帶例子(/webapps/examples/jsp/chat)有很多問(wèn)題,沒(méi)有運(yùn)行成功,懷疑該例并不完整(我的版本Tomcat 6.0.16),經(jīng)過(guò)學(xué)習(xí)和研究,發(fā)現(xiàn)了一些問(wèn)題,希望能給仍然奮戰(zhàn)在其中的朋友一些幫助。 前期準(zhǔn)備:使用tomcat提供的comet api之前,需要增加對(duì)NIO的支持,配置nio可是相當(dāng)方便,要做的僅僅是在server.xml里邊修改connector: <connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8080" redirectport="8443" connectiontimeout="20000"> Tomcat 6提供了CometProcessor和CometEvent接口,具體功能和操作不再贅述,詳情請(qǐng)見(jiàn)http://tomcat./tomcat-6.0-doc/aio.html。注意:實(shí)現(xiàn)CometProcessor接口后不用在servlet中寫(xiě)doGet,doPoset方法,所有事件在BEGIN,READ,END,ERROR中實(shí)現(xiàn)。 簡(jiǎ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 } 在此源代碼中,僅完成向客戶(hù)端發(fā)送Hello World字符串的功能,關(guān)鍵點(diǎn),out.flush()不可缺少,以往在寫(xiě)ajax程序的時(shí)候,往往忽略寫(xiě)這句話(huà),但這里如果不寫(xiě),客戶(hù)端無(wú)法收到響應(yīng)文字。由于tomcat采用streaming的方式實(shí)現(xiàn)comet,不知是否不加這句話(huà)的時(shí)候,客戶(hù)端不知道你的消息已經(jīng)結(jié)束,而始終處于一個(gè)等待的狀態(tài)(如果您有更專(zhuān)業(yè)的解釋?zhuān)?qǐng)指教)。 服務(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> |
|