中大计算机毕业论文-分布式网络中的推送系统的设计与实现.doc
本 科 生 毕 业 论 文题 目:分布式网络中的推送系统的设计与实现院 系:软件学院专 业:软件工程(计算机应用方向)学生姓名:学 号指导教师:明志(副教授)(职 称)二一五 年 三 月摘 要随着互联网计算机技术的飞速发展,网络已经成了大众生活必不可少的部分,它的最大优点就是可以将大量的信息互相共享。不管是移动终端还是个人电脑,人们总是可以通过设备进入互联网中获得自己感兴趣的信息。但与此同时,由于互联网是属于大家的,具有很强的开放性,使得网络上的信息每天都在呈爆炸式地增长,信息的泛滥而引起网民难以消化的现象已经不再是新鲜事。在当今这个步伐急促的社会中,要想通过普通浏览的方式在信息海洋中找到自己所需要的内容确实不是一件轻松的事,普通的浏览查找在当今已经可以说得上是一种既消耗精力又浪费时间的信息获取方式,在注重用户体验的今天,它已经很难达用户满意程度。为了给各位网民带来具有针对性的个性化服务,将方便快捷的体验带给网民,信息推送技术(PUSH)应运而生。有了PUSH技术,用户再也不用手动地在互联网上查找自己想要的信息,而只需设置订阅自己所感兴趣的内容,PUSH系统就会定期地向用户推送相关消息,整个过程中用户处于被动状态,省去了手动查找等繁杂步骤,大大提高了用户的体验质量。因此,推送技术已经在近些年中得到了巨大的发展和推广,尤其是在当今分布式主流的网络中,一个好的推送系统会给成千上万的用户带来便利,也给了各个消息发送方带来了推广渠道。通过推送系统,各个组织可以把自己的新闻消息推送到特定用户的设备中,形成了定向传送的局面,双方的需求都得到了满足,并且还有了效率的保证。关键词:信息获取,推送技术,个性化AbstractWith the rapid development of the technology in internet and computer field, network has become the indispensable part of the public life. Its most important advantage is the capacity of sharing lots of message. With mobile terminal or pc, people can easily connect to the internet to get the message he/she like.But in the same time, since the internet belongs to ourselves, it is so open that the messages in internet are increasing rapidly everyday. It is no more a news that netizen can not digest soon because of the message overflow. In this hurried society, it is not an easy thing to find the message we want in the data ocean by ordinary browsing. Nowaday the ordinary browsing way is time-wasted and vigor-wasted to get message. From point view of paying attention to customer experience, it can hardly make the customer satisfied.To give the netizen individual service and convenient experience, the message push technology occurs. With the push technology, customers no more need to find the message manually. They just need to setup the content they interest in, and the push system will push the relevant message to the customer. The customers are in passive state all the time without the manual checking, and the customer experience is enhancing largely.So the push technology has been popularized and developed largely these years, especially in the distributed network. An excellent push system can bring convenience to customers and provide more spread way to the pushers. With the push system, an organization can send their news to the specific customers. It satisfy the pushers and recievers in the same time and guarantee the efficiency.Keywords: obtain message, push technology, individuation目 录第一章 前言11.1 背景现状分析11.2 推送系统概述21.3 论文结构简介3第二章 技术与原理42.1 推送基本原理42.2 PUSH技术优缺点分析52.3 JAVA网络编程62.4 JAVA数据库编程112.4.1 JDBC简介112.4.2 JAVA数据库操作122.5 XMPP协议介绍17第三章 架构设计193.1 系统架构及原理193.2 业务用例的实现203.3 数据库设计223.3.1 构建数据库的系统流程223.3.2 表的具体设计24第四章 模块设计284.1 ConnectionPool类介绍284.2 Cache类介绍384.3 OnlineManager类介绍434.4 Loger类介绍48第五章 部署应用525.1 运行环境525.2 使用说明53第六章 结论576.1 工作总结576.2 工作展望58致谢59参考文献60i第一章 前言1.1 背景现状分析Pull与Push技术对用户来说都是信息获取方式,但却是两种截然相反的信息获取技术。Pull为信息拉取技术,在信息获取时,用户必须时时处于主动地位,并且参与信息获取整个过程;Push技术为信息推送技术,服务器处于主动地位,用户处于被动地位。通常情况下,人们都是采用“Pull”方式从网络上“拉取”信息,即利用搜索引擎来获取信息的方式。随着网络上信息资源的日益丰富,基于Pull技术的信息获取技术无论在信息的搜索速度、传输速度,还是搜索信息的质量上都越来越难以令人满意。这是由于Pull技术自身存在的不足造成的。一是以Pull方式获取信息不仅时间长,而且费用高。Pull技术是通过URL来进行信息资源定位的。人们上网获取信息时,必须首先利用各种搜索引擎去查找各个服务器在网上的URL,然后再通过URL去访问该服务器,定位、浏览、选择自己所需的信息资源。这样人们查询一次信息,必须长时间地频繁登录多个服务器,因而不仅时间长,而且费用高。二是信息效率低,资源浪费严重。从网络技术上讲,Pull技术是一种点到点的传输方式,当多个用户需要一条信息时,该信息就必须重复传输多次,因此严重地浪费了网络带宽和服务器资源。三是服务器被动服务,用户获取信息及时性差。Pull方式获取信息时,用户是主动的,服务器和信息是被动的,也就是说,用户必须主动到服务器上寻找信息,这就是人们通常所说的“人找信息”。另外,这种方式客户机和服务器必须保持实时的连接才能获取信息。但由于网络信息更新快,这就要求用户必须经常上网查看信息,否则很难及时获得自己所需的最新信息。简单地说,Internet发展到今天的规模,网上具有海量信息,这种依靠被动“拉取”信息的服务方式,在时间延迟、查全率、查准率、响应时间等方面都不能满足用户的需求,可以说,以Pull技术为代表的信息获取模式已成为信息共享的瓶颈。 Pull与Push技术对用户来说都是信息获取技术,但二者存在着根本的不同。以Pull技术为核心的信息拉取技术,在信息获取时,用户必须时时处于主动地位,也就是说,用户必须参与信息获取的整个过程。而以Push技术为核心的信息推送技术,在信息推送过程中,服务器始终处于主动地位,用户却处于被动地位。与Pull技术相比,Push技术不仅获取信息的效率高,费用低,而且及时性强,因而它一出现便受到人们的青睐。Push技术能够通过一定的技术标准或协议,把用户感兴趣的信息,按照用户的要求及时、主动地推送给用户。用户收到信息后,还可以离线浏览。信息推送技术将深刻地改变网络信息的传播方式,使用户不必“大海捞针”式地搜集信息,而由服务器主动、及时地把用户感兴趣的信息推送给用户,用户可以“以逸待劳”地坐等信息到来。1.2 推送系统概述随着互联网越来越深入人心,网络容量和浏览人数都以惊人的速度增长着。当人们上网浏览资讯,面临着数以百万计的网页,他们就更需要一种简便快速的方法找到他们所需要的信息内容。毫无疑问,推送系统将是一个很好的选择,通过这类系统,用户可以全面、及时、准确的获得个人感兴趣的内容。我们来打个比方,推送系统好比一个传递信息中间者,它的一边是发布方,一边是接受方,一旦发布方有了新的推送消息,它就立即将信息传递到特定的接收方当中,将原来复杂繁琐的步骤最简化,以提高信息分享的效率。在推送系统的面前,人们只需要做这几件事,假如你是一个网民,你只需要订阅好你所感兴趣的内容,然后就可以悠哉的等待最新信息的到来,想接受什么消息和拒绝接受什么消息完全由用户来决定,以此体现了个性化的用户体验;接入你是一个组织,你想要发布一些消息(如新闻、通知等),你只需要填写好消息的内容,推送系统的服务器就会自动地将消息转发推送到被订阅的用户去,不必担心用户因为不在线而因此的消息推送失败,对于没在线的用户,服务器会将消息保存下来,等待用户下一次上线再推送,整个过程方便保险。1.3 论文结构简介本论文各章节内容安排如下:第一章作为本论文的绪论,主要论述了消息推送技术的背景现况、推送系统的概述,并简要介绍了本文的结构。第二章会把实现系统的技术原理进行详细的阐述,比如如何实现推送功能、如何对在线用户进行管理、如何将信息中转保存等等关键技术问题,也会讨论到系统的运行机制和一些用到的关键算法。第三章主要讲述整个推送系统的框架设计,该章首先会对系统进行一个整体化的分析论述,整体论述后还会对系统的各大模块进行功能性的介绍,并分析其在整个系统中的重要性以及各个模块之间是如何衔接起来支撑整个系统。第四章 将会深入分析各个模块的设计实现过程,剖析各模块的内部结构,也讲述到实现过程中要注意的细节以及如何对模块进行优化以保证系统的运行效率。第五章 主要对消息推送系统的设计实现进行一个整体总结,并且提出本次实践当中存在的一些局限性和有待改进的地方。第二章 技术与原理2.1 推送基本原理尽管在定义上Push方式的消息推送是由服务器占有主动权,终端用户处于被动状态,但其实技术实现的背后还是基于“请求响应”模式,在这模式上做了一定修改。终端用户一旦设置好自己的订阅内容,就不停“隐蔽”地向服务器发送请求,而一旦服务器发现有新的消息需要推送,就给终端返回推送消息,以此实现了推送的效果。在这里主要涉及到两个方面,一个是轮询时间,它代表着终端访问服务器的时间间隔;另一个是服务器的请求处理方式,接收到来自终端的请求后,服务器可以选择挂起连接或者马上返回消息给用户。根据轮询时间、请求处理方式,分为以下两种Push。 简单轮询:客户端一般以定时方式发起请求,服务端处理后返回响应。图2.1 简单轮询原理特点:原理、客户端/服务端实现简单可根据应用场景调整轮询时间间隔服务端需要处理大量请求长轮询:客户端发起请求后服务端将该请求挂起(不返回响应),直到超时、异常或需要处理响应(推内容)才返回。客户端收到响应后再次请求(即轮询)服务端,并处理响应。图2.1.2 长轮询原理特点:实时性高服务端需要管理挂起请求2.2 PUSH技术优缺点分析Push技术作为一种网络信息获取技术是成功的,它的好处可概括为:l 可以避免用户在网上无目的上网查找,利用离线浏览技术使用户可采用离线方式进行阅读。 l 可以提高被推送信息的准确性,控制搜索深度,过滤不必要的信息。 l 能被推送的信息内容有教学资料、新闻、电影、音乐、房产信息、股市行情、共享软件、天气预报等。 l 能被推送的文件有文字、图形、图像、声音、小程序等,并且可以超文本或通过超文本访问的文件的形式保存在用户的硬盘上。 l 可以推送通过专用的播放程序实时显示的信息,向用户提供多媒体信息。l Push服务器能对各个用户的兴趣和偏好进行智能性识别、预测,根据用户要求自动搜集定制信息并定期快速、连续不断地向目标用户主动推送,满足了用户的个性化需求。 但同时也存在很多需要完善的地方: l 难以满足用户个性化的要求。Push技术是按照预先确定的一系列标准来传送信息的,这种标准是建立在发送方和接收方之间的协议上,而不是以用户需求为基础的。多数Push产品针对性较差,满足个性化程度不高,这在覆盖推送中表现尤为突出。 l 未能解决信息过载问题。Push技术本来是为了解决因特网上信息过载而出现的新技术,然而结果事与愿违。如果Push产品大量使用,反而会加重网络信息过载。l 数据风暴问题。“推送技术”与过去常用的“拉取技术”的显著不同是:拉取是由用户来控制信息的检索与获取,用户是主动的。而推送技术则考虑由其他方来控制信息的传送。当信息提供商将大量信息强制性地推向用户时,便会将用户淹没于“信息垃圾”中。 l 网络带宽浪费问题。Push技术为网络带来新的服务模型的同时也引起了带宽浪费问题,这主要是由Push服务器主动发送大量信息或客户代理自动进行站点搜索所造成的。因此,Push产品必须考虑如何有效地利用带宽,这将是决定该项技术前景的关键。2.3 JAVA网络编程本推送系统主要使用java语言实现,因此java的网络编程在本项目中占有很大比重,而网络编程本来就是开发者的必备技术之一,接下来本节会简单介绍一下网络编程以及java本身网络编程的一些技巧。从通俗的角度上来说,网络编程就是指通过程序将数据从一台网络设备上传输到另一台设备之中去,而上述所说的程序实际上就是指服务程序和客户端,每一次的数据连接都是由一方提出请求,等另一方确认接受之后才会得以进行,并且客户端程序就是提出请求的一方,服务器就是被请求然后确认接受的一方。在讲解网络传送的原理之前,我们需要理解两个概念,一个是IP地址,一个是端口号。IP地址是一个32位的二进制序列,通常被分割成四个八位的二进制数,它好比是一台电话的电话号码,用来识别出互联网中的唯一设备,正是有了这个唯一的标识,我们才可以在千千万万台设备中将数据方便快捷的传输到我们的目的主机中去。而端口号是用来识别数一台主机中的一个服务,也就是一个程序,每个程序都有自己的端口号,知道了端口号之后数据达到主机后就可以根据端口号分配到目的程序中去,以保证数据不会被其它服务所接收。所以,通过IP地址/端口号,我们就可以识别出网络中的唯一服务,实现双方的连接和数据的传送。尽管数据的传送是建立在IP地址/端口号对之上,但传送的方式根据其机制的不同也分为多种,而当今网络连接协议主要分为两大类:TCP协议以及UDP协议。TCP是一种面向连接的协议,言下之意就是在数据传送之前设备之间必须先建立好可靠安全的连接,而每一次的连接必须双方完成了“三次握手”之后才能得以进行,即双方事前必须经过三重确认后才可以传输数据。另外,TCP连接是一种安全的连接,它保证数据一定会传送到目的地,如果数据在传输过程中意外丢失,它会通过一系列的机制进行重发,并且设有阻塞机制以保证网络的稳定性,常见的TCP协议有HTTP协议、FTP协议等等。UDP是一种无连接协议,即在传送数据之前并不需要建立一个传输通道,而是从程序中获取到所要发送的数据,随后将之“扔”到网络中,整个过程并不需要维护一个数据的连接状态,它使用的是最大交付方式,即不保证数据能准确地传输到目的程序当中,但因为不设有阻塞机制,因此速度会相对TCP连接快,适用于一些流媒体或语音数据等传输,平时我们使用的“ping”命令就是对目标主机发送UDP协议数据包以测试当前网络是否通行。简单介绍完一些关于网络编程的概念之后,接下来谈一下现实java网络编程中的实际方法,由于本推送系统使用的是TCP协议,因此下面我们暂时不探讨java网络编程中UDP连接的实现。在java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以.Socket类代表客户端连接,以.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,具体点说,Java语言无法实现底层的网络嗅探以及获得IP包结构等信息。但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。下面分别介绍一下在Java语言中客户端和服务器端的实现步骤。在客户端网络编程中,首先需要建立连接,在Java API中以.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下: Socket socket1 = new Socket(“192.168.100.100”,10000); Socket socket2 = new Socket(“”,80);上面的代码中,socket1实现的是连接到IP地址是192.168.100.100的计算机的10000号端口,而socket2实现的是连接到域名是的计算机的80号端口,至于底层网络如何实现建立连接,对于程序员来说是完全透明的。如果建立连接时,本机网络不通,或服务器端程序未开启,则会抛出异常。连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下: OutputStream os = socket1.getOutputStream(); /获得输出流 InputStream is = socket1.getInputStream(); /获得输入流上面的代码中,分别从socket1这个连接对象获得了输出流和输入流对象,在整个网络编程中,后续的数据交换就变成了IO操作,也就是遵循“请求-响应”模型的规定,先向输出流中写入数据,这些数据会被系统发送出去,然后在从输入流中读取服务器端的反馈信息,这样就完成了一次数据交换过程,当然这个数据交换过程可以多次进行。这里获得的只是最基本的输出流和输入流对象,还可以根据前面学习到的IO知识,使用流的嵌套将这些获得到的基本流对象转换成需要的装饰流对象,从而方便数据的操作。最后当数据交换完成以后,关闭网络连接,释放网络连接占用的系统端口和内存等资源,完成网络操作,示例代码如下: socket1.close();介绍完一个简单的客户端编程的示例,下面接着介绍一下TCP类型的服务器端的编写。首先需要说明的是,客户端的步骤和服务器端的编写步骤不同,所以在学习服务器端编程时注意不要和客户端混淆起来。在服务器端程序编程中,由于服务器端实现的是被动等待连接,所以服务器端编程的第一个步骤是监听端口,也就是监听是否有客户端连接到达。实现服务器端监听的代码为: ServerSocket ss = new ServerSocket(10000);该代码实现的功能是监听当前计算机的10000号端口,如果在执行该代码时,10000号端口已经被别的程序占用,那么将抛出异常。否则将实现监听。服务器端编程的第二个步骤是获得连接。该步骤的作用是当有客户端连接到达时,建立一个和客户端连接对应的Socket连接对象,从而释放客户端连接对于服务器端端口的占用。实现功能就像公司的前台一样,当一个客户到达公司时,会告诉前台我找某某某,然后前台就通知某某某, 然后就可以继续接待其它客户了。通过获得连接,使得客户端的连接在服务器端获得了保持,另外使得服务器端的端口释放出来,可以继续等待其它的客户端连接。 实现获得连接的代码是: Socket socket = ss.accept();该代码实现的功能是获得当前连接到服务器端的客户端连接。需要说明的是accept是一个阻塞方法,也就是当无连接时,该方法将阻塞程序的执行,直到连接到达时才执行该行代码。另外获得的连接会在服务器端的该端口注册,这样以后就可以通过在服务器端的注册信息直接通信,而注册以后服务器端的端口就被释放出来,又可以继续接受其它的连接了。连接获得以后,后续的编程就和客户端的网络编程类似了,这里获得的Socket类型的连接就和客户端的网络连接一样了,只是服务器端需要首先读取发送过来的数据,然后进行逻辑处理以后再发送给客户端,也就是交换数据的顺序和客户端交换数据的步骤刚好相反。这部分的内容和客户端很类似,所以就不重复了。最后,在服务器端通信完成以后,关闭服务器端连接。实现的代码为: ss.close();综上所述,java网络编程步骤大概可以概括为如下图:图2.3.1 网络编程流程2.4 JAVA数据库编程推送系统服务器可能会面临着大量数据的存储和转发,也会包括一系列的事务操作,因此系统需要数据库的技术支持来保证运作的效率。本推送系统使用了MYSQL数据库来维护数据,下面会介绍一下JAVA语言中数据库的使用技巧。2.4.1 JDBC简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事。换言之,有了JDBC API,就不必为访问Sybase数据库专门写一个程序,为访问Oracle数据库又专门写一个程序,或为访问Informix数据库又编写另一个程序等等,程序员只需用JDBC API写一个程序就够了,它可向相应数据库发送SQL调用。同时,将Java语言和JDBC结合起来使程序员不必为不同的平台编写不同的应用程序,只须写一遍程序就可以让它在任何平台上运行,这也是Java语言“编写一次,处处运行”的优势。Java数据库连接体系结构是用于Java应用程序连接数据库的标准方法。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDBC为程序开发提供标准的接口,并为数据库厂商及第三方中间件厂商实现与数据库的连接提供了标准方法。JDBC使用已有的SQL标准并支持与其它数据库连接标准,如ODBC之间的桥接。JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。Java 具有坚固、安全、易于使用、易于理解和可从网络上自动下载等特性,是编写数据库应用程序的杰出语言。所需要的只是 Java应用程序与各种不同数据库之间进行对话的方法。而 JDBC 正是作为此种用途的机制。2.4.2 JAVA数据库操作由于本系统采用的是MYSQL数据库,所以本节接下来只介绍JAVA语言中MYSQL数据库的使用方法。首先,我们必须在主机中先安装好MYSQL数据库以及在项目中导入MYSQL数据库的JDBC驱动包以保证JAVA程序能正常访问数据库,以上操作网上有具体教程,在这里不进行详述。完成上述两部后,我们就可以使用JDBC提供的API对MYSQL数据库进行操作,操作过程主要分成以下几步:1、加载合适的JDBC驱动程序Class.forName(Driver);MySQL驱动程序:com.mysql.jdbc.Driver Oracle驱动程序:oracle.jdbc.driver.OracleDriver SQLServer驱动程序: com.Microsoft.jdbc.sqlserver.SQLServerDriver2、建立数据库连接与MySQL数据库连接的方法:Connection con=DriverManager.getConnection(“jdbc:mysql:/主机IP或主机名:3306/数据库名”,用户名,密码);java.sql.DriveManager 用来处理装载驱动程序并且为创建新的数据库连接提供支持;java.sql.Connection 用于完成对特定定数据库的连接;java.sql.Statement 用于对特定的数据库执行SQL语句;java.sql.Statement又包含了以下两个重要的子类型:java.sql.PreparedStatement 用于执行预编译的SQL语句; java.sql.CallableStatement 用于执行数据库中存储的过程的调用;java.sql.ResultSet 用于保存查询所得的结果集3、创建Statement对象Statement st=con.createStatement(); /最后可以不关闭,但推荐关闭利用Statement对象可以执行静态SQL语句,静态SQL语句可以是Select语句、Delete语句、Update语句和Insert语句。执行SQL语句Statement接口提供了三种执行SQL语句的方法:executeQuery()、executeUpdate() 和execute()。具体使用哪一个方法由SQL语句本身来决定。executeQuery 用于产生单个结果集的语句,例如 SELECT 语句等。executeUpdate 用于执行INSERT、UPDATE或DELETE 语句以及SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个 整数,指示受影响的行数(即更新计数)。对于 CREATE TABLE 或DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。一般不会需要该高级功能。 JDBC在编译时并不对将要执行的SQL查询语句作任何检查,只是将其作为一个String类对象,直到驱动程序执行SQL查询语句时才知道其是否正确。对于错误的SQL查询语句,在执行时将会产生 SQLException。 一个Statement对象在同一时间只能打开一个结果集,对第二个结果集的打开隐含着对第一个结果集的关闭。 如果想对多个结果集同时操作,必须创建出多个Statement对象,在每个Statement对象上执行SQL查询语句以获得相应的结果集。 如果不需要同时处理多个结果集,则可以在一个Statement对象上顺序执行多个SQL查询语句,对获得的结果集进行顺序操作。str="insertinto customer values('wangyang',24,'beijing','wangyang')"int recordNumber=st.executeUpdate(str);执行executeUpdate()方法返回该SQL语句涉及的记录数。str="select* from mycustomer" /查询表中记录ResultSet rs=st.executeQuery(str); 由于SQL语句是select,用executeQuery()方法,返回一个结果集保存在ResultSet对象rs中。4、分析ResultSet对象 执行完毕SQL语句后,将返回一个ResultSet类的对象,它包含所有的查询结果。但对ResultSet类的对象方式依赖于光标(Cursor)的 类型,而对每一行中的各个列,可以按任何顺序进行处理(当然,如果按从左到右的顺序对各列进行处理可以获得较高的执行效率);ResultSet类中的Course方式主要有:ResultSet.TYPE_FORWARD_ONLY(为缺省设置):光标只能前进不能后退,也就是只能从第一个一直移动到最后一个。ResultSet.TYPE_SCROLL_SENSITIVE:允许光标前进或后退并感应到其它ResultSet的光标的移动情形。ResultSet.TYPE_SCROLL_INSENSITIVE:允许光标前进或后退并不能感应到其它ResultSet的光标的移动情形。ResultSet类中的数据是否允许修改主要有:ResultSet.CONCUR_READ_ONLY(为缺省设置):表示数据只能只读,不能更改。ResultSet.CONCUR_UPDATABLE:表示数据允许被修改。可以在创建Statement或PreparedStatement对象时指定ResultSet的这两个特性。Statement stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);或PreparedStatement pstmt=con.PrepareStatement("insert into bookTable values (?,?,?)",ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet类的对象维持一个指向当前行的指针,利用ResultSet类的next()方法可以移动到下一行(在JDBC中,Java程序一次只 能看到一行数据),如果next()的返回值为false,则说明已到记录集的尾部。另外JDBC也没有类似ODBC 的书签功能的方法。 利用ResultSet类的getXXX()方法可以获得某一列的结果,其中XXX代表JDBC中的Java数据类型,如 getInt()、getString()、getDate()等。访问时需要指定要检索的列(可以采用 int值作为列号(从1开始计数)或指定列(字段)名方式,但字段名不区别字母的大小写)。示例:while(rs.next()int id=rs.getInt("id");String name=rs.getString("cName");int age=rs.getInt("cAge");String address=rs.getString("cAddress");String email=rs.getString("cEmail");System.out.println(id+" "+name+" "+age+" "+address+" "+email);获得结果集中的结构信息:利用ResultSet类的getMetaData()方法来获得结果集中的一些结构信息(主要提供用来描述列的数量、列的名称、列的数据类型。利用ResulSetMetaData类中的方法)。ResultsetMetaData rsmd = rs.getMetaData();rsmd.getColumnCount(); /返回结果集中的列数rsmd.getColumnLabel(1); /返回第一列的列名(字段名)例如:Statement stmt=con.createStatement();ResultSet rs=stmt.executeQuery("select * from TableName");for(int i=1; i<=rs.getMetaData().getColumnCount(); i+) /跟踪显示各个列的名称 System.out.print(rs. getColumnName (i)+"t");while(rs.next() /跟踪显示各个列的值for(int j=1; j<=rs.getMetaData().getColumnCount(); j+) System.out.print(rs.getObject(j)+"t");5、关闭连接(注意关闭的顺序) 例:rs.close();st.close();con.close()2.5 XMPP协议介绍XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同。XMPP协议具有以下特点:l XMPP 协议是公开的,由JSF开源社区组织开发的。XMPP 协议并不属于任何的机构和个人,而是属于整个社区,这一点从根本上保证了其开放性。l XMPP 协议具有良好的扩展性。在XMPP 中,