《Web异步与实时交互-iframe AJAX WebSocket开发实战.docx》由会员分享,可在线阅读,更多相关《Web异步与实时交互-iframe AJAX WebSocket开发实战.docx(97页珍藏版)》请在三一办公上搜索。
1、Web异步与实时交互iframeAJAXWebSOCket开发实战1 .第1章Web交互开发相关技术概述2 .第2章iframe实现模拟异步交互3 .第3章iframe应用案例分析4 .第4章AJAX实现异步后台传输技术5 .第5章AJAX应用案例分析6 .第6章WebSoekel实现主动推送交互7 .第7章WebSe)Cket聊天室8 .第8章若干异步传输技术及交互方式的综合测试与分析9 .欢迎来到异步社区!10 .看完了第1章Web交互开发相关技术概述Web交互开发中的异步、实时Web交互技术,是当前Web应用技术研究领域的新热点之-O本章首先对传统Web交互技术进行了简单介绍,进一步从W
2、eb异步交互技术和Web实时交互方式两个角度,对Web交互开发中的异步、实时等系列技术进行了概要介绍、分析,并给出了本书的思路及内容安排。1.1 基于HTTP协议的Web交互HTTP协议(HyperTextTransportPotocol,超文本传输协议),是基于服务器/客户端模式的无连接、无状态的协议。基于HTTP协议的Web应用中,所有的请求是由客户端发起的,服务器处于被动响应的地位。然而,服务器却相当于是信息的发布者,当有新信息产生时,服务器并不能主动将新信息发送给客户端,必须等待客户端主动发起访问请求建立连接后才能发送给客户端。当遇到实时监控、即时通信、在线互动等的Web交互开发需求(
3、如设备监控、聊天室、股票行情等需求)时,传统的Web交互技术显得力不从心。最初,客户端只能通过设定自动刷新时间的方式(如使用meta标签,或通过JaVaSCriPt代码进行设定)使浏览器主动刷新,向服务器端发送请求,来获取服务器端的新信息。这种方式有以下几个缺点。(1)刷新页面的时候,网页会呈现一片空白,影响用户的体验。(2)在多数情况下页面中需要更新的信息只是很小一部分,其他信息不变。这样,在刷新整个页面时,传送了额外的信息,使得页面刷新速度变慢,并增加了网络的负担。(3)由于客户端隔一段时间才发送一次请求,并不能实时获得服务器端的新信息,有一定延迟。其中,问题(1)(2)可以通过1.2节中
4、介绍的Web异步技术来解决;问题(3)可以通过1.3节中介绍的Web实时交互技术来解决。1.2 Web异步交互技术iframeAJAX及WebSOCket随着Web交互技术的发展,出现了使用iframe模拟异步传输,来实现局部刷新页面获取数据的功能,从而解决1.1节中的问题(1)(2)oiframe是一种HTML标记,它会创建包含另外一个文档的内联框架,通过iframe框架可以在当前页面中显示其他页面的信息。这时将iframe的SrC属性设置为对另外一个页面的连接请求,并在当前页面中通过JaVaSCriPt动态更新iframe的内容,就可以将服务器端的数据响应到客户端,而不会出现主页面一片空白
5、,等待刷新的现象。并且,仅刷新iframe框架而不是主页面,也减少了页面刷新的内容,这在一定程度上提高了页面刷新速度。然而,iframe是通过刷新隐藏框架,获取响应后通过DoM技术对主页内容进行更新一这实际上是模拟的异步交互,并非真正的异步交互。随着Web交互技术的发展,一个真正意义上的异步交互技术应运而生AJAXo这种技术通过异步通信和响应,来完成页面的局部刷新,以此改善传统Web应用中大量不必要的整页刷新,从而提高响应的效率,让用户更快地得到操作结果,减少中间的等待时间。同时AJAX作为浏览器端技术,极大地改善页面的表现和交互方式,可以让传统的Web应用程序界面具备桌面应用程序般的表现力,
6、从而为用户提供更人性的服务。但是,iframe、AJAX都是基于HTTP协议进行Web交互。HTTP协议的工作模式对于其构建实时Web应用存在诸多的限制只能先由客户端提交请求,服务器端响应请求,并非是由服务器向客户端进行主动推送。随着HTML5标准的推出,这一状况得到了改善,其提出了一种新的浏览器服务器通信协议一WebSoCket协议。通过该协议可以在浏览器和服务器之间构建一条全双工的通信连接,可以支持服务器端向客户端主动推送信息,实现实时刷新页面的功能。WebSoCket协议不仅解决了1.1节中的问题(1)(2),还解决了1.1节问题(3)中提出的实时性问题。综上所述,AJAX作为当今非常热
7、门、流行的异步传输技术,已被行业广泛采用。但在AJAX这种真正的异步传输技术出现之前,一般使用iframe模拟实现异步传输,目的是保证网页在不刷新的情况下进行数据传输更新网页内容,从而提高用户的体验。目前,iframe实现模拟异步传输这一技术,仍然经常被程序员使用。而WebSOCket技术,作为HTML5标准中的亮点,真正实现了“服务器推”的概念。其实际上是对AJAX技术的跨越式优化。但由于目前该技术较新(AJAX应用较成熟)、浏览器支持、WebSoCket对服务器端性能的影响等方面的因素,尚未被大范围应用。因此,出现了这些异步传输技术在应用市场上被共同使用的情况,有必要对这3种异步技术进行深
8、入的研究和分析。1.3 Web实时交互方式轮询、长轮询、长连接及推送如何实时获取服务器端的最新数据,是Web实时交互关注的内容。在介绍Web实时交互方式前,先来具体了解HTTP的通信机制,为之后概念的精准定义做铺垫。HTTP通信过程可分为4步。第1步:HTTP是基于传输层的TCP协议,在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器在TCP层建立连接。在TCP层进行“三次握手”之后,建立了TCP连接,此时HTTP就可以进行传输了(注意,由于HTTP为无连接、无状态的协议,在本书之后的章节内容中,若提到打开、保持或关闭连接时,其中的“连接”均指TCP层的连接)。第2步:建立连接后
9、,客户端发送一个请求给服务器。第3步:服务器接到请求后,给予相应的响应信息。第4步:客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户端与服务器断开连接。需要注意的是,在第4步服务器响应请求后是否断开连接,要看协议版本(HTTPLO协议在服务器响应后,会关闭连接;HTTPLl协议在服务器响应后,默认会保持连接,直到超时或出错),要看是否客户端主动请求断开连接、要看是否服务器端主动断开连接,要看是否出错或是否连接超时等对连接进行断开。在很多情况下,保持住连接,有以下两点好处。(1)客户端和服务器可以继续通过保持住的连接发送请求及响应,节省了为每个请求建立新连接所需的时间、资源。
10、这在客户端内存、CPU等资源比较有限,或服务器端需要处理大量并发请求时,保持连接,重用该连接的传输通道是非常有必要的技术手段。(2)当客户端向服务器端发送请求后,服务器端若无需要响应给客户端的最新信息时,阻塞该请求不进行响应,并保持住连接;等到服务器端有信息需要响应该客户端时,使用保持住的连接进行响应。该技术手段属于实时Web交互技术,可以有效解决1.1节问题(3)中实时更新服务器端信息的需求。基于上述基础知识,在大量分析相关Web实时交互技术的基础上,总结并清晰定义4种Web交互技术,即轮询、长轮询、长连接及推送。 轮询:客户端定时发送请求,服务器端接收到客户端请求后,马上进行响应,并关闭连
11、接。 长轮询:客户端发送请求,服务器端接收到客户端请求后进行阻塞,并保持连接;当服务器端有数据需要响应时,使用保持住的连接进行响应,并关闭连接。 长连接:客户端发送请求,服务器端接收到客户端请求后进行阻塞,并保持连接;当服务器端有数据需要响应时,使用保持住的连接进行响应,并保持住连接。 推送:客户端与服务器端建立连接后,服务器端可以直接将数据推送给客户端。其中,轮询是不断、循环使用基于HTTP协议的传统Web交互方式对服务器端数据进行获取,但正如1.1节所述,其在满足实时更新服务器端信息时有一定延迟。除此之外,长轮询、长连接及推送都可以满足实时更新服务器端信息,属于实时Web交互技术的范畴。本
12、节中介绍的iframe、AJAX和WebSoCket是三项Web异步交互技术,可使用轮询、长轮询、长连接及推送4种Web实时交互方式,与服务器进行交互。1.4内容安排本书以介绍iframe、AJAX和WebSoCket三项Web异步交互技术为基本主线,在此基础上,进一步对iframe、AJAX和WebSoCkel分别通过轮询、长轮询、长连接和推送方式,实现对Web交互时的性能进行测试和深入分析。章节内容安排为,第2章到第7章主要介绍上述三项技术的相关知识、关键代码解析以及案例实现,重点在技术知识讲解、技术上手应用方面;第8章,是以前7章内容为基础,对相关理论、技术细节、不同方案进行进一步深入地
13、测试、分析,目的在于使读者更加清晰、深入地了解三项Web异步交互技术及4种Web交互技术,在面对不同系统开发需求时,可以根据本书提供的测试分析中的各项性能指标,进行综合考虑,并最终设计、确定技术方案0第2章iframe实现模拟异步交互最初,客户端只能通过设定自动刷新时间的方式(如使用meta标签,或通过JaVaSCriPt代码进行设定)使浏览器主动刷新,向服务器端发送请求,以轮询的方式获取服务器端的最新信息。通常情况下,用户要获取最新的信息,必须刷新浏览器中的整个页面来获取服务器端的响应数据。但是,在多数情况下页面中需要更新的信息只是很小一部分,其他信息不变。这样,在刷新整个页面时,不仅传送了
14、额外的信息,增加了网络的负担,且刷新页面的同时,网页会呈现一片空白,给用户的视觉体验带来严重的影响。iframe技术模拟实现了异步交互技术,有效解决了上述问题。本章介绍了利用iframe实现模拟异步交互技术的相关基础知识、工作原理、关键代码及基本案例。2.1 简介服务器端响应时间是用户体验中关键的一部分。为了解决之前技术更新页面时,服务器端响应时间长、页面刷新速度慢、用户体验度差等问题,使用iframe模拟异步交互技术来实现局部刷新页面获取数据。iframe是一种HTML标签,它会创建包含另外一个文档的内联框架。通过iframe框架可以在当前页面中显示其他页面的信息。这时将iframe的SrC
15、属性设置为对另外一个页面的长连接请求,并在当前页面中通过JaVaSCriPt动态更新iframe的内容,即可将服务器端响应的数据无刷新显示在主页面。通过iframe实现的模拟异步交互技术,可以应用于聊天室、实时状态监控、股票行情等需要实时刷新的应用场景。2.2 相关关键技术及工作原理2.2.1 DOMDOM(DocumentObjectModel)即文档对象模型。DOM是与系统平台和编程语言无关的W3C官方标准。W3C对DoM的定义是:“一个与系统平台和编程语言无关的接口,程序和脚本可以通过这个接口动态地对文档的内容、结构和样式进行访问和修改。”DOM本质上是一个树形结构模型,它将整个页面映射
16、为一个由层次节点组成的文档。每个节点都有一系列的子节点;每个子节点都有唯一的父节点;节点又分为元素节点和文本节点两种,元素节点中有属性。DoM可以根据节点之间的关系对文档进行操作。程序开发人员可以利用DoM技术实现动态地创建文档,遍历文档结构,添加、修改、删除文档内容等。DoM技术实现了用户页面动态地变化,使得页面的可交互性大大地增强。目前,DoM包括以下3个部分。CoreDOMCOreDOM是针对任意结构文档的标准对象模型,它所定义的对象已经可以表达出任何HTML和XML文档中的数据。 HTMLDOMHTMLDe)M是针对HTML的文档对象模型,它将所有的HTML元素定义为对象,Web开发人
17、员可以通过对象的方法来访问并操作HTML文档。 XMLDOMXMLDoM是针对XML的文档对象模型,它定义了针对XML的标准对象集合以及访问和操作XML文档的方法。HTMLl)OM的方法及属性用户可以利用HTMLDOM提供的方法和属性,实现节点的创建、复制、插入、删除、替换、查找以及遍历等操作。(1) HTMLDc)M方法 CreateEIementO方法:用于按照指定标签名创建一个新的节点元素。其语法格式如下:reference=document.CreateElement(element) CreateTeXtNOde()方法:用于创建一个包含指定文本内容的文本节点。语法格式如下:refe
18、rence=document.CreateTextNode(text) ckneNode()方法:用于指定节点创建副本。语法格式如下:reference=node.CloneNode(deep) 叩PendChild()方法:用于指定节点追加一个子节点。语法格式如下:reference=element.appendChild(newChild) insertBefore():用于在指定节点的前面插入一个新节点。语法格式如下:reference=element.InsertBefore(newChild,targetNode) removeChikl()方法:用于删除指定元素的子节点。语法格式如
19、下:reference=element.removechild(node) replaceChild()方法:用于指定元素的一个子节点替换成另一个子节点。语法格式如下:reference=element.replaceChild(newChildroldChild) SetAtmbUIe()方法:用于指定元素节点添加一个新的属性值或改变它现有属性值,该方法只能用在属性节点上。语法格式如下:element.SetAttribute(attributeName,attributevalue) getElementById():用于返回带有指定ID的元素节点,如果元素不存在,则返回nullo语法格式
20、如下:element=document.getEIementById(ID) getElementsByTagName()方法:用于返回包含指定标签名的所有元素的节点列表。语法格式如下:elements=document.getElementSByTagName(tagName)(2) HTMLDoM属性 nodeName:该属性将返回一个字符串,其内容是给定节点的名字。语法格式如下:name=node.nodeNamenodeName属性会根据节点类型返回相应的值。 nodeType:该属性将返回一个代表给定节点类型的整数。表2/列出了常用的节点类型,包括元素、属性、文本、注释、文档等。语法
21、格式如下:integer=node.nodeType表21nodeType常用节点类型描述元素类型IIodeTyPe值元素1属性2文本3注释8文档9 nodeValue:该属性将返回给定节点的当前值。语法格式如下:value=node.nodeValue ChildNodes:该属性将返回一个数组,这个数组由指定元素节点的所有子节点组成。语法格式如下:nodeList=node.ChildNodes firstChild:该属性将返回指定节点的第一个子节点。语法格式如下:reference=node.firstChild IastChild:该属性将返回指定节点的最后一个子节点。语法格式如下:
22、reference=node.IastChild parentNode:该属性将返回指定节点的父节点。语法格式如下:reference=node.parentNode2.2.2iframeiframe是超文本标记语言(HTML)的一个标签,是用来实现框架的一种方式。和常见的frame一样,用它来对网页结构进行拆分,使相应网页部分在刷新时保持不变。iframe相对frame更加灵活,它可以内嵌到网页的任意地方,实现在一个网页里内嵌另一个网页。使用方法简单,将它的SrC属性指向想要包含的文件即可,并且可以根据情况指定其宽(width),高(height)等属性。 标签的SrC属性:规定在ifram
23、e中显示的文档的URL。语法格式如下: HTMLonIOad事件属性:OnlOad属性在对象已加载时触发。OnIOad常用在VbOdy中,一旦完全加载所有内容(包括图像、脚本文件、CSS文件等),就执行一段脚本。语法格式如下:2.2.3 SerVIet中的doGet与doPost方法当客户使用get方式请求SerVlet时,Web容器调用doGet方法处理请求,doGet方法的定义代码如下:publicvoiddoGet(HttpServletRequestrequest,HttpservletResponseresponse)throwsServletException,IOExceptio
24、ndoPost方法是用来处理使用POSt方式提交的表单,不能处理客户端浏览器直接访问的方式。doPost方法的定义代码如下:publicvoiddoPost(HttpServletRequestrequest,HttpservletResponseresponse)throwsServletException,IOException使用SerVlet的doGe函doPost方法来处理iframe提交的请求。2.2.4 工作原理在实现iframe模拟异步交互技术中,利用iframe内嵌网页的特性,实现网页间数据的“隐形传输:通过对主页面中隐藏的iframe内嵌网页不断进行刷新,可以不断地向服务器
25、端提交请求,服务器端通过相应SerVIeI的doPost/doGet方法处理并响应。客户端所获得的响应数据,通过JavaSCriPt调用DC)M模型,可以将其更新于主页面中,而不需要刷新整个父窗口的内容,当前页面其他的数据状态得以保留,同时减少了数据的传输量。2.3示例程序下面使用iframe模拟异步交互技术,使用轮询的方式,实现数字累加功能。2.3.1 客户端关键代码客户端代码主要包含3个部分:定时向服务器端发送请求、接收服务器端返回的信息及展示服务器端返回的信息。关键代码如下所示:functionaddMessage(counts)/将服务踞端发送回的信息更新到文本框VarInessage
26、Element=document.getElementBy工d(message);/获取id为message的文messageElement.innerHTML+=counts;将新信息添加到文本框functionfOif(true)variframeElement=document.getElementById(,iframe);IframeElement.src=IframeElement.src;SetTimeout(f,30*1000);)SetTimeout(f,30*1000);定时器,实现每30秒调用一次函数f/通过SrC指向一个SerVlet类,实现对服务器为实现客户端定时向服
27、务器发送请求,通过在客户端添加一个定时器,定时时间为301000(以亳秒计算时间,即30秒)。当时间到达30秒后,通过调用函数f来更改iframe的SrC属性,重新向服务器发送请求,也就实现了轮询。服务器返回给客户端的是一段js代码,该js代码调用了addMessage函数。该函数的作用是将新信息添加到id为message的div中。2.3.2 服务器端关键代码服务器端的关键代码主要是在SerVlet中,通过doGet方法来处理来自客户端的请求。关键代码如下所示:publicclassTestServletextendsHttPSerVIet/子类TeStServlet继承父类HttPSerV
28、Ietprivateintcounts=0;/私有成员变量COUntS0Verride/覆盖父类的方法protectedvoiddoGet(HttpServletRequestrequest,HttpservletResponseresponse)throwsServletException,IOExceptionPrintWriterout=response.getWriter();/输出内容到客户端,就是用户的网页Out.printin(,parent.addMessage(+counts+,);/调用counts+;)接收到来自客户端的请求后,首先会通过response.getWrite
29、r()方法来获得一个响应的输出流,然后将CoUntS计数信息连同包含g的屈代码发送回客户端,客户端通过执行调用主页面的addMessage函数将COUntS信息进行显示。2.3.3 案例系统运行效果程序开始运行后,运行效果如图21所示。图2-1程序运行后网页的最初效果当程序运行30秒后,数字增加1,运行效果如图2-2所示。QVers*on2showjsp图2-2系统运行30秒后的网页效果程序每运行30秒,数字增加1,运行效果如图2-3所示。ClocalhostQftOSnalDemoVersion2show)5p第3章iframe应用案例分析在上一章具体介绍了iframe相关关键技术。本章将通
30、过一个iframe聊天室案例来更加深入地了解和掌握iframe技术。本章将通过iframe实现模拟异步交互,使得页面在不刷新的情况下实现主页面数据的更新,提高聊天室系统的用户体验。另外,为了将聊天信息实时的传送到客户端,采用长连接方式实现Web实时交互。3.1 iframeW天室案例核心技术实现3.1.1 iframe相关属性介绍 CSSdiSPlay属性:display属性规定元素应该生成的框的类型。当值为none时隐藏该标签内的文本信息,在页面中不显示。但源代码中,仍然可以看的到隐藏的内容。语法格式如下: CSSoVerfIoW属性:OVerfIoW属性规定当内容溢出元素框时发生的事情,当
31、值为SCron时内容会被修剪,但浏览器会显示滚动条以便查看其余的内容。语法格式如下: 标签SrC属性:SrC属性规定显示在iframe中的文档的地址。语法格式如下: HTMLOnIOad事件属性:OnlOad属性常用在中,页面加载完成后会触发OnIOad事件。语法格式如下: 标签target属性:规定在何处打开actionURL。语法格式如下: 标签action属性:action属性规定当提交表单时:向何处发送表单数据。语法格式如下:3.1.2 iframe聊天室案例工作原理在本案例中,主页面采用嵌套iframe框架子页面的方式来实现局部刷新,也就是说只需刷新子页面就可以达到更新主页面的目的,
32、从而实现数据的“隐形”传输。在iframe聊天室的工作流程中,首先由客户端通过form表单以POSt方法将数据发送给指定的Web服务器,然后经过Web服务器处理后将数据返回到target属性指定的iframe框架,并通过在iframe框架中调用相应函数把数据显示在主页面上。在整个过程中,主页面无整体刷新,数据传输量减少。iframe聊天室采用长连接的方式,建立客户端与服务器端之间稳定可靠的连接。当服务器端接收到不同用户提交的表单数据时,会将数据封装成messages元素并保存到Bk)CkingQUeUe动态数组中。同时服务器端遍历所有的连接,并将Bk)CkingQUeUe队列中数据发送给它们。
33、此时BlOCkingQUeUe动态数组清空,循环因无法获取数据而阻塞,有效避免了服务器端无限输出重复数据给客户端的问题。当有新用户发送数据时.,循环再次开始,并把新数据发送给当前在线用户。若无新用户发送数据,循环将被阻塞,客户端和服务器端的连接会一直保持直至时间超时或用户主动断开。iframe聊天室采用长连接的方式,服务器会主动地、及时地把新的数据传送给客户端,无须用户不停请求,减少了网络资源的浪费。3.2 案例实现运行准备工作1.配置TOmCat需要配置TOmCat连接为NIO,否则无法使用TomCatCometoTOmCat目录下conf7server.xmLPrOtOeoI更改为org.
34、apache.coyote.http1l.Http1INioProtocol:2.导入TomCat的CataIina.jar包在开发过程中,需要用到TOmCat的CatalinaJar包。3.2.2客户端关键代码下面引入聊天室客户端案例。客户端向服务器发送请求,建立长连接。随后客户端可以向服务器发送信息并将服务器返回的消息即时更新到页面上。关键代码如下所示。ChatRoom.htmlfunctionaddMessage(message)/将服务器发送回的信息更新到文本框varmessageElement=document.getElementById(message);/获取id为messag
35、e的文本messageElement.innerHTML+=message;/将新信息添加的文本框document.getElementByld(,input_message*).value=将id为inpujmessage的文document.getElementByld(,input_name).value=/将id为input_name的文本框清空functioniframeRefresh()variframeElement=document.getElementByldCiframeRecieveMessage);/获取id为ifraneRecieveMessage的框架IframeE
36、lement.src=iframeElement.src;/重新给它的SrC属性赋值)姓名:消息:首先,在客户端建立了两个iframe隐藏框架,分别命名为iframeSendMessage和iframeRecieveMessage0iframeSendMessage框架用于将客户端消息发送给服务器,iframeRecieveMessage框架用于将服务器端返回的信息显示在页面上。通过隐臧两个框架的刷新,使总页面部分无需刷新而实现数据更新。在iframeRecieveMessage框架中,通过SrC属性将其连接到CometSerVlet类中,建立起长连接,接收服务器返回的数据。当页面加载完成后通
37、过OMOad属性调用iframeRefresh()函数,iframeRefresh()函数会在服务器超时或页面加载完成时重新加载COmetSerVIet类。其次,建立一个标签,id为message,用于显示服务器端发回的信息。addMessage函数会将服务器端返回的数据显示在div上。最后,建立form表单用于向服务器传输数据,其中包括用户姓名和消息。通过Iarget属性在iframeSendMessage框架中打开ReCeiVeMeSSageSerVlet类。通过action属性将聊天信息发送到ReCeiVeMeSSageSerVIet类中。也就是说通过iframeSendMessage框
38、架把客户端数据交给ReCeiVeMeSSageSerVIet类处理。3.2.3服务器端关键代码1.CometServletCometSerVIet代码功能主要包括3个部分:启动线程建立长连接;启动MeSSageSendSerVIet类准备将服务器端的数据发送给客户端;处理HTTP长连接周期内的多种事件。关键代码如下所示:publicclassCometServletextendsHttpServletimplementsCometProcessorprivatestaticfinallongSerialVersionUID=IL;/私有成员变量COUntSArrayLiSt数组是可变数组,数组
39、存储的类型是HttPSerVIetReSPOnSe类型其允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的随机访问privateArrayListconnections=null;声明一个数组类型的引用privateMessageSendServletmessageSend=null;/声明一个类的对象/当访问这个SerVlet时进行初始化publicvoidinit()connections=newArrayList();/为这个引用变量分配内存地址messageSend=newMessageSendServlet(connections);/为这个对象分配内存地址,同时传入
40、这个对象初始化所需要的参数ThreadmessageThread=newThread(messageSend);messageThread.startO;/这两句代码为对象启动一个装程/继承COmetIPrOCeSSOr必须实现的函数,函数包含3种事件的处理publicvoidevent(CometEventevent)throwsIOException,ServletExceptionHttpservletResponseresponse=event.getHttpServletResponse();response.SetCharacterEncoding(UTF-8);responsea
41、ddHeader(Connection,close);if(event.getEventType()=CometEvent.EventType.BEGIN)System.out.printin(BEGIN);synchronized(connections)connections.add(response);SyStem.oUt.rintln(当前在线用户数量:+connections.size();/为一个共享资源加锁防止多个对象同时访问。elseif(event.getEventType()=CometEvent.EventType.ERROR)System.out.printin(,ER
42、ROR);synchronized(connections)connections.remove(response);SyStem.out.printin(当前在线用户数量:+connections.size();event.close();elseif(event.getEventType()=CometEvent.EventType.END)System.out.printIn();synchronized(connections)connections.remove(response);System.out.printIn(当前主线用户数量:+connections.size();event.close();)ArrayListCOrmeCIionS用于保存正在等待响应的HTTP长连接,是HttPSerVIetReSPonSe对象,可以理解为所有在线用户。MessageSendermessageSender是用于发送消息的线程。SerVlel中初始化init时,启动一个线程用于处理聊天消息,并把COnneCtiOnS传给MeSSageSendSerVlet类准备接收客户端发送的信息。COmetSerVIet是处理ComelHttP长连接的S