基于多线程的网络爬虫的设计与实现毕业论文.doc_第1页
基于多线程的网络爬虫的设计与实现毕业论文.doc_第2页
基于多线程的网络爬虫的设计与实现毕业论文.doc_第3页
基于多线程的网络爬虫的设计与实现毕业论文.doc_第4页
基于多线程的网络爬虫的设计与实现毕业论文.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成都学院学士学位论文(设计) 本 科 毕 业 论 文题 目 基于多线程的网络爬虫的设计与实现毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。作 者 签 名: 日 期: 指导教师签名: 日期: 使用授权说明本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。作者签名: 日 期: 基于多线程的网络爬虫的设计与实现摘要:网络爬虫(Web Crawler),又叫网络蜘蛛(Web Spider),是搜索引擎的重要组成部分。随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战,作为搜索引擎不可或缺的一部分网络爬虫,一直是个热门的研究课题,它的效能,直接决定了搜索引擎的未来。本课题所研究的网络爬虫采用广度优先搜索算法,并基于Java语言进行网络编程。实现网络爬虫关键技术是对URL进行分析和去重。为使网络爬虫具备更高效的抓取能力,因而使用了多线程技术。同时为了避免无限制的等待,应该对网络爬虫连接网络及读取时间最大值进行设定。 本课题的目标是研究并实现一个实现简单的可在后台自动运行的爬虫程序。系统可以进行面向主题的抓取。从行为上来看,它更近似于主题网络爬虫。关键词:网络爬虫;广度优先;Java; 多线程;Design and implementation of a web crawler based on multithreading Specialty: Software Engineering Student Number: Student: Supervisor: ABSTRACT:Web Crawler, also called Web Spider, is an important part of search engine. With the rapid development of Internet, the World Wide Web becomes the carrier of a large amount of information. And How to effectively extract and use this information to become a great challenge. The quality of a search engine is mostly depended on the quality of a Web Crawler that as an indispensable part of web crawler search engine. So Web Crawler is a hot research topic those years.The project which was studied in this paper using the breadth-first search algorithm, and based on the Java language for network programming. Implementation of the key technology of web crawler is to analyze and to URL. In order to make the web crawler has more efficient grasping ability, so the use of multi-threading technology. At the same time in order to avoid waiting without limit, should be on the web crawler connecting network and read the time of maximum value. The goal of this project is to research and realize an implementation can be run automatically in the background simple crawler program. System can be a subject oriented grab. From the point of view, it is more similar to the topic web crawler.Key words: Web Crawler; Breadth-First Search; Java; Multi-Threading目 录绪 论11 概述21.1 研究目的和意义21.2 网络爬虫的历史21.3 研究现状和发展趋势32 网络爬虫相关技术52.1 URL52.2 HTTP协议52.2.1 HTTP协议简介52.2.2 HTTP消息的结构62.2.3 请求方法72.2.4 HTTP状态代码82.3 Java多线程82.3.1 定义82.3.2 优点82.3.3 不足82.3.4 Java多线程编程92.4 Java 网络编程112.4.1 TCP/IP112.4.2 网络编程步骤112.4.3 Java网络编程技术132.5 正则表达式142.5.1 正则表达式特点142.5.2符号功能152.6 网页搜索策略152.6.1广度优先搜索152.6.2深度优先搜索162.6.3最佳优先搜索163 需求分析和模型设计173.1 网络爬虫的定义173.2网络爬虫的分类173.3 系统需求分析173.3.1 下载网页173.3.2 分解网页183.3.3 遍历网络183.3.4 存储网页183.4 模型设计183.5 数据库结构193.6 技术选型203.6.1 Java 简介203.6.2 eclipse基本介绍204 网络爬虫模型的总体设计214.1 网络爬虫总体设计214.2 URL处理214.2.1 URL抽取214.2.2 URL解析214.2.3 URL判重224.2.4 URL保存224.3 网页抓取224.4 网页相关度224.4.1 什么是网页标题224.4.2 算法实现步骤和算法描述:234.5 HttpClient 类库与Jericho HTML Parser类库234.5.1 HttpClient234.5.2 Jericho Html Parser234.6 多线程设计245 系统实现255.1 实现工具255.2 系统模块实现255.2.1 URL队列255.2.2 网页下载265.2.3 提取URL275.2.4 Spider类285.2.5数据库操作296 系统运行测试306.1 系统运行测试306.2 系统分析32结 论33参考文献34致 谢3535绪 论随着计算机和网络技术的日臻成熟并被广泛的应用到社会生活的各个领域,网络上的信息呈爆炸式增长,并由此诞生了大量的数据,人类进入了一个“大数据时代”。这使得人们在网上找到自己所需的信息越来越困难,如果在信息的海洋里捞针。据统计搜索引擎已经成为仅次于电子邮件服务,是人们使用最多的网路服务。搜索引擎搜集互联网上数以亿计的网页,并为每个关键词建立索引。用户通过输入自己感兴趣的关键字就能获得与之相关的网页。从搜索引擎出发就能很快的到达互联网的任何一个地方。在建立搜索引擎的过程中,获取网页是非常重要的一个环节。爬虫程序就是用来获取网页的程序。网络爬虫,是一种按照一定的规则,自动的抓取因特网信息的程序或者脚本。另外一些不常使用的名字还有网路蚂蚁,自动索引,模拟程序或者蠕虫。网络蜘蛛是通过网页的链接地址来寻找网页,从网站的一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。 WEB资源自动获取技术程序就是用来搜集网页的程序。以何种策略遍历互联网上的网页,也成了该程序主要的研究方向。现在比较流行的搜索引擎,比如Google,百度,它们自动获取资源程序的技术内幕一般都不公开。目前几种比较常用的自动获取资源实现策略:广度优先的爬虫程序,Repetitive爬虫程序,定义爬行爬虫程序,深层次爬行爬虫程序。此外,还有根据概率论进行可用Web页的数量估算,?用于评估互联网Web规模的抽样爬虫程序;采用爬行深度、页面导入链接量分析等方法,限制从程序下载不相关的Web页的选择性爬行程序等等。自动获取资源技术为搜索引擎从互联网上自动获取整个网页,也可以网页中的某一个图片或者是网页链接的文件等资源,是搜索引擎的重要组成部分。自动获取资源技术程序的实现策略,运行效率直接影响搜索引擎的搜索结果。不同的搜索引擎,会根据对搜索结果的不同需求,选择最合适的爬行策略来搜集互联网上的信息。高效,优秀的自动获取资源程序可以使人们在互联网上寻找到更及时,更准确的信息。本课题旨在根据上述原理设计与实现一个网络爬虫系统。1 概述1.1 研究目的和意义网络蜘蛛是通过网页的链接地址来寻找网页,从网站的某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。而本课题的主要就是怎样更高效的获取网页,并通过所给条件筛选得到人们所需要的网页。随着互连网的飞速发展,网络信息量呈现出爆炸性增长的趋势,当今这个时代被称为“大数据”时代。越来越多的信息涌到人们的面前,然而互联网在人们提供丰富信息的同时,却在如何对信息进行高效便捷使用方面给人民带来巨大的挑战:一方面互联网上的信息种类繁多、丰富多彩,而另一方面却很难找到真正有用的信息,当人们想从浩淼无边的数据海洋中快速准确的找到自己所需要的信息时,常常需要“搜索引擎”的帮助,而网络爬虫是搜索引擎的重要组成。它为搜索引擎从Internet上下载网页。作为搜索引擎的资源采集部分,网络爬虫的性能将直接影响到整个搜索引擎索引网页的数量、质量和更新周期。高效,优秀的爬虫程序可以使人们在互联网上寻找到更及时,更准确的信息。1.2 网络爬虫的历史在互联网发展的早期,网站数量相对较少,信息数据量不大,查找也比较容易。然而伴随互联网井喷性的发展,普通网络用户想找到自己所需的资料简直如同在数据的海洋里捞针,为满足大众信息检索需求的专业搜索网站便应运而生了。所有搜索引擎的鼻祖,是1990年由Montreal的McGill University三名学生(Alan Emtage、Peter Deutsch、Bill Wheelan)发明的Archie(Archie FAQ)。Alan Emtage等想到了开发一个可以用文件名查找文件的系统,于是便有了Archie。Archie是第一个自动索引互联网上匿名FTP网站文件的程序,但它还不是真正的搜索引擎。Archie是一个可搜索的FTP文件名列表,用户必须输入精确的文件名搜索,然后Archie会告诉用户哪一个FTP地址可以下载该文件。由于Archie深受欢迎,受其启发,Nevada System Computing Services大学于1993年开发了一个Gopher(Gopher FAQ)搜索工具Veronica(Veronica FAQ)。Jug head是后来另一个Gopher搜索工具。虽然当时万维网还未出现,但网络中文件传输还是相当频繁的,而且由于大量的文件散布在各个分散的FTP主机中,查询起来非常不便,因此Alan Archie工作原理与现在的搜索引擎已经很接近,它依靠脚本程序自动搜索网上的文件,然后对有关信息进行索引,供使用者以一定的表达式查询。当时,“机器人”一词在编程者中十分流行。电脑“机器人”(Computer Robot)是指某个能以人类无法达到的速度不间断地执行某项任务的软件程序。由于专门用于检索信息的“机器人”程序象蜘蛛一样在网络间爬来爬去,因此, 搜索引擎的“机器人”程序就被称为“蜘蛛”程序。世界上第一个用于监测互联网发展规模的“机器人”程序是Matthew Gray开发的World wide Web Wanderer。刚开始它只用来统计互联网上的服务器数量,后来则发展为能够检索网站域名。与Wanderer相对应,Martin Kosher于1993年10月创建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“机器人”程序,而是靠网站主动提交信息来建立 自己的链接索引,类似于现在我们熟知的Yahoo。随着互联网的迅速发展,使得检索所有新出现的网页变得越来越困难,因此,在Matthew Gray的Wanderer基础上,一些编程者将传统的“蜘蛛”程序工作原理作了些改进。直到一些编程者提出了这样的设想,既然所有网页都可能有连向其他网站的链接,那么从跟踪一个网站的链接开始,就有可能检索整个互联网。到1993年底,一些基于此原理的搜索引擎开始纷纷涌现,但是早期的搜索引擎只是以搜索工具在数据库中找到匹配信息的先后次序排列搜索结果,因此毫无信息关联度可言。而RBSE是第一个在搜索结果排列中引入关键字串匹配程度概念的引擎。最早现代意义上的搜索引擎出现于1994年7月。当时Michael Mauldin将John Leavitt的蜘蛛程序接入到其索引程序中,创建了大家现在熟知的Lycos(2000年被西班牙网络集团Terra Lycos Network收购)。同年4月,斯坦福(Stanford)大学最为著名的两名博士生,美籍华人杨致远(Gerry Yang)和David Filo共同创办了Yahoo公司,并成功地使搜索引擎的概念深入人心。从此搜索引擎进入了高速发展时期。目前,互联网上有名有姓的搜索引擎已达数百家,其检索的信息量也与从前不可同日而语。像国外的Google,国内的百度,这样的搜索引擎巨擘由于掌握的大多数的入口流量,成为互联网世界的霸主,并带来了巨大的商业价值。1.3 研究现状和发展趋势因为搜索引擎的商业化应用带来了巨大的商业价值,所以作为搜索引擎的核心部分的网络爬虫技术,也理所应当的成为了国内外研究的热点。对于网络爬虫的研究从上世纪九十年代就开始了目前爬虫技术已经相当成熟。并催生了像Baidu和Google这样的网络巨擘,而其他公司也纷纷推出了自己的搜索引擎。网络爬虫是搜索引擎的重要组成部分。现今,网络爬虫主要分为通用爬虫和聚焦爬虫两类。通用搜索引擎的目标是尽可能大的网络覆盖率,通用搜索引擎大多提供基于关键字的检索。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。同时,支持根据语义信息提出的查询。 网络爬虫的发展趋势随着AJAX/Web2.0等技术的流行,如何抓取AJAX等动态页面成了搜索引擎急需解决的问题,如果搜索引擎依旧采用“爬”的机制,是无法抓取到AJAX页面的有效数据的。除此之外,网络爬虫还主要面对着一下的这些问题(摘自百度百科5):1、强制用Cookies。部分站长为了让用户记住登陆信息,强迫用户使用Cookies。如果未开启,则无法进行访问,访问页面显示的也不会正常,这种方式会让蜘蛛无法进行访问。2、登陆要求。有些企业站和个人站的设置一定要注册登陆后才能看到相关的文章内容,这种对蜘蛛不是很友好,蜘蛛不会注册、也不会登陆。3、动态URL。动态URL简单的说就是带有问号、等号及参数的网址就是动态URL,动态URL不利于搜索引擎蜘蛛的爬行和抓取。4、Flash。有的网站页面使用Flash视觉效果是很正常的,比如用Flash做的Logo、广告、图表等,这些对搜索引擎抓取和收录是没有问题的,很多网站的首页是一个大的Flash文件,这种就叫蜘蛛陷阱,在蜘蛛抓取时HTML代码中只是一个链接,并没有文字。虽然大的Flash效果看上去很好,外观看着也很漂亮,但可惜搜索引擎看不到,无法读取任何内容。 5、无休止的跳转。对搜索引擎来说只对301跳转相对来说比较友好,对其他形式的跳转都是比较敏感,例如:JavaScript跳转、Meta Refresh跳转、Flash跳转、302跳转。2 网络爬虫相关技术本章将会对于网络爬虫紧密相关的一些技术进行说明。2.1 URL 统一资源定位符(URL,Uniform Resource Locator)也被称为网页地址,是因特网上标准的资源的地址。它最初是由蒂姆伯纳斯李发明用来作为万维网的地址的。(摘自百度百科5) URL是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。 URL结构一般分为两个部分,一个是物理结构,一个是逻辑结构。在物理结构包括扁平结构和树型结构。扁平结构就是网站中所有的页面都是在根目录这一级别,形成一个扁平的物理结构。这比较适合于小型的网站,因为如果太多文件都放在根目录下的话,制作和维护起来比较麻烦。而树型结构的意义是在一级目录下分为多个频道或者称之为目录,然后目录下面再放上属于这个频道的页面,首页、频道首页、频道下的内容就好比树干、树枝、树叶的关系。逻辑结构就是由网页内部链接所形成的逻辑的或链接的网络图。比较好的情况是逻辑结构与前面的树型物理结构相吻合。统一资源定位符 URL 是对可以从因特网上得到的资源的位置和访问方法的一种简洁的表示。URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。URL 相当于一个文件名在网络范围的扩展。因此 URL 是与因特网相连的机器上的任何可访问对象的一个指针。 URL 的一般形式是::/:/网络爬虫就是通过提取和分析出网页中的URL地址,对相应网络进行爬取。2.2 HTTP协议本课题研究的网络爬虫是用于对于Internet上的信息进行获取,而HTTP协议是Internet上最重要的协议之一。2.2.1 HTTP协议简介协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。超文本传输协议 (HTTP-Hypertext transfer protocol) 是分布式,协作式,超媒体系统应用之间的通信协议。是万维网(world wide web)交换信息的基础。HTTP协议的主要特点可概括如下:1、支持客户/服务器模式。http 协议 简介 http 协议 简介2、 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。 3、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。 4、无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。 5、无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。2.2.2 HTTP消息的结构Request 消息的结构,Request 消息分为3部分,第一部分叫请求行, 第二部分叫http header, 第三部分是body. header和body之间有个空行,结构如图2-1:图2-1 Request 消息结构第一行中的Method表示请求方法,比如POST,GET,Path-to-resource表示请求的资源,Http/version-number 表示HTTP协议的版本号。当使用的是GET 方法的时候,body是为空的Response消息的结构, 和Request消息的结构基本一样。 同样也分为三部分,第一部分叫request line, 第二部分叫request header,第三部分是body. header和body之间也有个空行,结构如图2-2:图2-2 Response消息结构HTTP/version-number表示HTTP协议的版本号,status-code 和message 请看下节HTTP状态代码的详细解释.2.2.3 请求方法 HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:本系统主要研究Get请求的特点。OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送*的请求来测试服务器的功能性。HEAD 向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。GET 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。PUT 向指定资源位置上传其最新内容。DELETE 请求服务器删除Request-URI所标识的资源。TRACE 回显服务器收到的请求,主要用于测试或诊断。CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。其中GET和POST方法是常用的两种请求方法。它们有着以下的区别:1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx ? name = XXX &id=XXX. POST方法是把提交的数据放在HTTP包的Body中.2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.2.2.4 HTTP状态代码 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。所有状态码的第一个数字代表了响应的五种状态之一。而当网络爬虫必须根据返回的状态代码就行相应的处理。主要包括5大类消息状态:1xx: 信息;2xx: 表示请求成功; 3xx: 重定向;4xx: 客户端错误;5xx: 服务器错误其中200:请求成功(其后是对GET和POST请求的应答文档)。本系统主要处理该状态码的消息;2.3 Java多线程在一个程序中,一些独立运行的程序片断叫做“线程”(Thread),利用它编程的概念就叫作“多线程处理”。(摘自百度百科5)2.3.1 定义线程(Thread):每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。(摘自百度百科5)2.3.2 优点使用线程可以把占据时间长的程序中的任务放到后台去处理。用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。程序的运行速度可能加快。在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。还有其他很多使用多线程的好处,这里就不在累述。2.3.3 不足1.如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换。2.更多的线程需要更多的内存空间。3.线程可能会给程序带来更多“Bug”,因此要小心使用。4.线程的中止需要考虑其对程序运行的影响。5.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。2.3.4 Java多线程编程计算机程序得以执行的三个要素是:CPU,程序代码,可存取的数据。在JAVA语言中,多线程的机制是通过虚拟CPU来实现的。可以形象的理解为,在一个JAVA程序内部虚拟了多台计算机,每台计算机对应一个线程,有自己的CPU,可以获取所需的代码和数据,因此能独立执行任务,相互间还可以共用代码和数据。JAVA的线程是通过java.lang.Thread类来实现的,它内部实现了虚拟CPU的功能,能够接收和处理传递给它的代码和数据,并提供了独立的运行控制功能。每个JAVA应用程序都至少有一个线程,这就是所谓的主线程。它由JVM创建并调用JAVA应用程序的main方法。在JAVA中创建线程的一种方式是通过Thread来实现的。Thread有很多个构造器来创建一个线程(Thread)实例:Thread();创建一个线程。Thread(Runnable target);创建一个线程,并指定一个目标。Thread(Runnable target,String name);创建一个名为name的目标为target的线程。Thread(String name);创建一个名为name的线程。Thread(ThreadGroup group,Runnable target);创建一个隶属于group线程组,目标为target的线程。通常,我们可以将一个类继承Thread,然后,覆盖Thread中的run()方法,这样让这个类本身也就成了线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。使用start()方法,线程进入Runnable状态,它将线程调度器注册这个线程。调用start()方法并不一定马上会执行这个线程,正如上面所说,它只是进入Runnble而不是Running。我们也可以通过实现Runnable接口并实现接口中定义的唯一方法run(),可以创建一个线程。在使用Runnable接口时,不能直接创建所需类的对象并运行它,而是必须从Thread类的一个实例内部运行它。从上面两种创建线程的方法可以看出,如果继承Thread类,则这个类本身可以调用start方法,也就是说将这个继承了Thread的类当作目标对象;而如果实现Runnable接口,则这个类必须被当作其他线程的目标对象。JAVA的线程从产生到消失,可分为5种状态:新建(New),可运行(Runnable),运行(Running),阻塞(Blocked)以及死亡(Dead)。其中,Running状态并非属于JAVA规范中定义的线程状态,也就是说,在JAVA规范中,并没有将运行(Running)状态真正的设置为一个状态,它属于可运行状态的一种。当使用new来新建一个线程时,它处于New状态,这个时候,线程并未进行任何操作。然后,调用线程的start()方法,来向线程调度程序(通常是JVM或操作系统)注册一个线程,这个时候,这个线程一切就绪,就等待CPU时间了。线程调度程序根据调度策略来调度不同的线程,调用线程的run方法给已经注册的各个线程以执行的机会,被调度执行的线程进入运行(Running)状态。当线程的run方法运行完毕,线程将被抛弃,进入死亡状态。你不能调用restart方法来重新开始一个处于死亡状态的线程,但是,你可以调用处于死亡状态的线程对象的各个方法。如果线程在运行(Running)状态中因为I/O阻塞,等待键盘键入,调用了线程的sleep方法,调用了对象的wait()方法等,则线程将进入阻塞状态,直到这些阻塞原因被解除,如:IO完成,键盘输入了数据,调用sleep方法后的睡眠时间到或者其他线程调用了对象的notify或notifyAll方法来唤醒这个因为等待而阻塞的线程等,线程将返回到Runnable状态重新等待调度程序调度,注意,被阻塞的线程不会直接返回到Running状态,而是重新回到Runnable状态等待线程调度程序的调用。线程调度程序会根据调度情况,将正在运行中的线程设置为Runnable状态,例如,有一个比当前运行状态线程更高运行等级的线程进入Runnable状态,就可能将当前运行的线程从Running状态“踢出”,让它回到Runnable状态。Java线程会以以下三种方式之一结束:1.线程到达其run()方法的末尾;2.线程抛出一个未捕获到的Exception或Error;3.另一个线程调用一个Deprecated的stop()方法。注意,因为这个方法会引起线程的安全问题,已经被不推荐使用了,所以,不要再程序调用这个方法。当同时运行的相互独立的线程需要共享数据并且需要考虑其他线程的状态时,就需要使用一套机制使得这些线程同步,避免在争用资源时发生冲突,甚至发生死锁。JAVA提供了多种机制以实现线程同步。多数JAVA同步是以对象锁定为中心的。JAVA中从Object对象继承来的每个对象都有一个单独的锁。由于JAVA中的每个对象都是从Object继承来的。所以JAVA中的每个对象都有自己的锁。这样使它在共享的线程之间可以相互协调。在JAVA中实现线程同步的另一个方法是通过使用synchronized关键字。JAVA使用synchronized关键字来定义程序中要求线程同步的部分。synchronized关键字实现的基本操作是把每个需要线程同步的部分定义为一个临界区,在临界区中同一时刻只有一个线程被执行。2.4 Java 网络编程 网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。虽然通过IP地址和端口可以找到网络上运行的一个程序,但是如果需要进行网络编程,则还需要了解网络通讯的过程。2.4.1 TCP/IPTransmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。TCP/IP协议不是TCP和IP这两个协议的合称,而是指因特网整个TCP/IP协议族。而最主要的是TCP协议和IP协议。(摘自百度百科5)本课题将采用IPv4协议作为开发基础。IPv4网际协议版本4(Internet Protocol version 4)。IPv4(通常称之IP)自20世纪80年代早期以来一直是网际协议族的主力协议。它使用32位地址。IPv4给TCP、UDP、SCTP、ICMP和IGMP提供分组递送服务。其中主要使用的基于TCP和UDP的网络编程。TCP传输控制协议(Transmission Control Protocol)。TCP是一个面向连接的协议,为用户进程提供可靠的全双工字节流。TCP套接字是一种流套接字(stream socket)。TCP关心确认、超时和重传之类的细节。大多数因特网应用程序使用TCP。TCP的可靠连接得益于它的三次握手原理。TCP协议真是通过“三次握手”的方式保证了传输的可靠性。本课题将会采用该种协议为基础,进行编程。2.4.2 网络编程步骤无论使用TCP方式还是UDP方式进行网络通讯,网络编程都是由客户端和服务器端组成。当然,B/S结构的编程中只需要实现服务器端即可。所以,下面介绍网络编程的步骤时,均以C/S结构为基础进行介绍。说明:这里的步骤实现和语言无关,也就是说,这个步骤适用于各种语言实现,不局限于Java语言。(一)客户端网络编程步骤客户端(Client)是指网络编程中首先发起连接的程序,客户端一般实现程序界面和基本逻辑实现,在进行实际的客户端编程时,无论客户端复杂还是简单,以及客户端实现的方式,客户端的编程主要由三个步骤实现:1、建立网络连接客户端网络编程的第一步都是建立网络连接。在建立网络连接时需要指定连接到的服务器的IP地址和端口号,建立完成以后,会形成一条虚拟的连接,后续的操作就可以通过该连接实现数据交换了。2、交换数据连接建立以后,就可以通过这个连接交换数据了。交换数据严格按照请求响应模型进行,由客户端发送一个请求数据到服务器,服务器反馈一个响应数据给客户端,如果客户端不发送请求则服务器端就不响应。根据逻辑需要,可以多次交换数据,但是还是必须遵循请求响应模型。3、关闭网络连接在数据交换完成以后,关闭网络连接,释放程序占用的端口、内存等系统资源,结束网络编程。最基本的步骤一般都是这三个步骤,在实际实现时,步骤2会出现重复,在进行代码组织时,由于网络编程是比较耗时的操作,所以一般开启专门的现场进行网络通讯。(二) 服务器端网络编程步骤服务器端(Server)是指在网络编程中被动等待连接的程序,服务器端一般实现程序的核心逻辑以及数据存储等核心功能。服务器端的编程步骤和客户端不同,是由四个步骤实现,依次是:1、监听端口服务器端属于被动等待连接,所以服务器端启动以后,不需要发起连接,而只需要监听本地计算机的某个固定端口即可。这个端口就是服务器端开放给客户端的端口,服务器端程序运行的本地计算机的IP地址就是服务器端程序的IP地址。2、获得连接当客户端连接到服务器端时,服务器端就可以获得一个连接,这个连接包含客户端的信息,例如客户端IP地址等等,服务器端和客户端也通过该连接进行数据交换。一般在服务器端编程中,当获得连接时,需要开启专门的线程处理该连接,每个连接都由独立的线程实现。3、交换数据服务器端通过获得的连接进行数据交换。服务器端的数据交换步骤是首先接收客户端发送过来的数据,然后进行逻辑处理,再把处理以后的结果数据发送给客户端。简单来说,就是先接收再发送,这个和客户端的数据交换数序不同。其实,服务器端获得的连接和客户端连接是一样的,只是数据交换的步骤不同。当然,服务器端的数据交换也是可以多次进行的。在数据交换完成以后,关闭和客户端的连接。4、关闭连接当服务器程序关闭时,需要关闭服务器端,通过关闭服务器端使得服务器监听的端口以及占用的内存可以释放出来,实现了连接的关闭。2.4.3 Java网络编程技术Java语言是在网络环境下诞生的,所以Java语言虽然不能说是对于网络编程的支持最好的语言,但是必须说是一种对于网络编程提供良好支持的语言,使用Java语言进行网络编程将是一件比较轻松的工作。和网络编程有关的基本API位于包中,该包中包含了基本的网络编程实现,该包是网络编程的基础。该包中既包含基础的网络编程类,也包含封装后的专门处理WEB相关的处理类。在本章中,将只介绍基础的网络编程类。InetAddress类。该类的功能是代表一个IP地址,并且将IP地址和域名相关的操作方法包含在该类的内部。按照前面的介绍,网络通讯的方式有TCP和UDP两种,其中TCP方式的网络通讯是指在通讯的过程中保持连接,有点类似于打电话,只需要拨打一次号码(建立一次网络连接),就可以多次通话(多次传输数据)。这样方式在实际的网络编程中,由于传输可靠,类似于打电话,如果甲给乙打电话,乙说没有听清楚让甲重复一遍,直到听清楚为止,实际的网络传输也是这样,如果发送的一方发送的数据接收方觉得有问题,则网络底层会自动要求发送方重发,直到接收方收到为止。在Java语言中,对于TCP方式的网络编程提供了良好的支持,在实际实现时,以.Socket类代表客户端连接,以.ServerSocket类代表服务器端连接。在进行网络编程时,底层网络通讯的细节已经实现了比较高的封装,所以在程序员实际编程时,只需要指定IP地址和端口号码就可以建立连接了。正是由于这种高度的封装,一方面简化了Java语言网络编程的难度,另外也使得使用Java语言进行网络编程时无法深入到网络的底层,所以使用Java语言进行网络底层系统编程很困难,具体点说,Java语言无法实现底层的网络嗅探以及获得IP包结构等信息。但是由于Java语言的网络编程比较简单,所以还是获得了广泛的使用。在使用TCP方式进行网络编程时,需要按照前面介绍的网络编程的步骤进行,下面分别介绍一下在Java语言中客户端和服务器端的实现步骤。在客户端网络编程中,首先需要建立连接,在Java API中以.Socket类的对象代表网络连接,所以建立客户端网络连接,也就是创建Socket类型的对象,该对象代表网络连接,示例如下: Socket socket1 = new Socket(“03”,10000); Socket socket2 = new Socket(“”,80);上面的代码中,socket1实现的是连接到IP地址是03的计算机的10000号端口,而socket2实现的是连接到域名是的计算机的80号端口,至于底层网络如何实现建立连接,对于程序员来说是完全透明的。如果建立连接时,本机网络不通,或服务器端程序未开启,则会抛出异常。连接一旦建立,则完成了客户端编程的第一步,紧接着的步骤就是按照“请求-响应”模型进行网络数据交换,在Java语言中,数据传输功能由Java IO实现,也就是说只需要从连接中获得输入流和输出流即可,然后将需要发送的数据写入连接对象的输出流中,在发送完成以后从输入流中读取数据即可。示例代码如下: OutputStream os = socket1.getOutputStream(); /获得输出流 InputStream is = socket1.getInputStream(); /获得输入流上面的代码中,分别从socket1这个连接对象获得了输出流和输入流对象,在整个网络编程中,后续的数据交换就变成了IO操作,也就是遵循“请求-响应”模型的规定,先向输出流中写入数据,这些数据会被系统发送出去,然后在从输入流中读取服务器端的反馈信息,这样就完成了一次数据交换过程,当然这个数据交换过程可以多次进行。这里获得的只是最

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论