﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-我的舒婷，我的BLOG-文章分类-Java基础</title><link>http://www.blogjava.net/Aisce/category/25583.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 23 Nov 2007 07:10:29 GMT</lastBuildDate><pubDate>Fri, 23 Nov 2007 07:10:29 GMT</pubDate><ttl>60</ttl><item><title>Java Web项目开发需掌握技术</title><link>http://www.blogjava.net/Aisce/articles/161923.html</link><dc:creator>Aisce</dc:creator><author>Aisce</author><pubDate>Tue, 20 Nov 2007 11:26:00 GMT</pubDate><guid>http://www.blogjava.net/Aisce/articles/161923.html</guid><wfw:comment>http://www.blogjava.net/Aisce/comments/161923.html</wfw:comment><comments>http://www.blogjava.net/Aisce/articles/161923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Aisce/comments/commentRss/161923.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Aisce/services/trackbacks/161923.html</trackback:ping><description><![CDATA[目前， 国内外信息化建设已经进入基于Web应用为核心的阶段， Java作为应用于网络的最好语言，前景无限看好。然而，就算用Java建造一个不是很烦琐的web应用，也不是件轻松的事情。概括一下，实施Java的WEB项目需要掌握的技术如下： <br /><br /><div><span></span> </div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">Java</span><span style="COLOR: black">语言</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">面向对象分析设计思想</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">设计模式和框架结构</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">XML</span><span style="COLOR: black">语言</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">网页脚本语言</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">数据库</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">应用服务器</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span><span style="COLOR: black">集成开发环境</span></div><div> </div><div><span style="COLOR: black">下面我们具体地看每个技术.<br /></span></div><div><font size="2"><strong>1、Java</strong><strong>语言</strong></font></div><div><span style="COLOR: black"><br />Java</span><span style="COLOR: black">语言体系比较庞大，包括多个模块。从WEB项目应用角度讲有JSP、Servlet、JDBC、JavaBean(Application)四部分技术。</span></div><div> </div><div style="MARGIN-LEFT: 36pt; TEXT-INDENT: -36pt"><strong><span style="COLOR: black">（1）、</span>Java Database Connectivity</strong><strong><span style="COLOR: black"> (JDBC)</span></strong><strong><span style="COLOR: black">技术</span></strong></div><div>在<span>Java Web应用开发中，数据库管理系统（RDBMS）的使用是不可缺少的。</span>JDBC(Java Database Connectivity) 是一种用于执行<span> SQL 语句的 Java API。它由一组用 Java 编程语言编写的类和接口组成。JDBC 为工具/数据库开发人员提供了一个标准的API，使他们能够用纯Java API 来编写数据库应用程序。</span></div><div>简单地说，<span>JDBC 可做三件事：</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>与数据库建立连接，</div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>发送<span> SQL 语句，</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>处理结果。</div><div> </div><div><strong><span style="COLOR: black"> <span style="COLOR: black">（2）、</span>Servlet</span></strong><strong><span style="COLOR: black">技术</span></strong></div><div><span style="COLOR: black">Servlet</span><span style="COLOR: black">是运行在服务器端的程序，</span>可以被认为是服务器端的<span>applet。servlet被Web服务器（例如Tomcat）加载和执行，就如同applet被浏览器加载和执行一样。servlet从客户端(通过Web服务器)接收请求，执行某种操作，然后返回结果。</span></div><div> </div><div>Servlet的主要优点包括</div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span>l</span>Servlet是持久的。<span>servlet只需Web服务器加载一次，而且可以在不同请求之间保持服务(例如一次数据库连接)。</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet是与平台无关的。如前所述，<span>servlet是用Java编写的，它自然也继承了Java的平台无关性。</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet是可扩展的。由于<span>servlet是用Java编写的，它就具备了Java所能带来的所有优点。Java是健壮的、面向对象的编程语言，它很容易扩展以适应你的需求。servlet自然也具备了这些特征。</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet是安全的。从外界调用一个<span>servlet的惟一方法就是通过Web服务器。这提供了高水平的安全性保障，尤其是在你的Web服务器有防火墙保护的时候。</span></div><div style="MARGIN-LEFT: 21pt; TEXT-INDENT: -21pt"><span style="COLOR: black">l</span>Servlet可以在多种多样的客户机上使用。由于<span>servlet是用Java编写的，所以你可以很方便地在HTML中使用它们。</span></div><div> </div><div><strong><span style="COLOR: black"><span style="COLOR: black">（3）、</span>JavaServer Pages(JSP) </span></strong><strong><span style="COLOR: black">技术</span></strong></div><div><span style="COLOR: black">JSP</span><span style="COLOR: black">是从Servlet上分离出来的一小部分，简化了开发，加强了界面设计。JSP定位在交互网页的开发。运用Java语法，但功能较Servlet弱了很多，并且高级开发中只充当用户界面部分。</span>JSP容器收到客户端发出的请求时，首先执行其中的程序片段，然后将执行结果以<span>HTML格式响应给客户端。其中程序片段可以是：操作数据库、重新定向网页以及发送 E-Mail 等等，这些都是建立动态网站所需要的功能。所有程序操作都在服务器端执行，网络上传送给客户端的仅是得到的结果，与客户端的浏览器无关，因此，JSP 称为Server-Side Language。</span></div><div> </div><div>JavaServer Pages的主要优点包括</div><div>●一次编写，各处执行<span>(Write o­nce, Run Anywhere)特性</span></div><div>作为<span>Java 平台的一部分，JavaServer Pages 技术拥有Java语言“一次编写，各处执行”的特点。随着越来越多的供货商将JavaServer Pages 技术添加到他们的产品中，您可以针对自己公司的需求，做出审慎评估后，选择符合公司成本及规模的服务器，假若未来的需求有所变更时，更换服务器平台并不影响之前所投下的成本、人力所开发的应用程序。</span></div><div>● 搭配可重复使用的组件</div><div>JavaServer Pages技术可依赖于重复使用跨平台的组件（如：<span>JavaBean或Enterprise JavaBean组件）来执行更复杂的运算、数据处理。开发人员能够共享开发完成的组件，或者能够加强这些组件的功能，让更多用户或是客户团体使用。基于善加利用组件的方法，可以加快整体开发过程，也大大降低公司的开发成本和人力。</span></div><div>● 采用标签化页面开发</div><div>Web 网页开发人员不一定都是熟悉<span>Java 语言的程序员。因此，JSP 技术能够将许多功能封装起来，成为一个自定义的标签，这些功能是完全根据XML 的标准来制订的，即JSP 技术中的标签库(Tag Library)。因此，Web 页面开发人员可以运用自定义好的标签来达成工作需求，而无须再写复杂的Java 语法，让Web 页面开发人员亦能快速开发出一动态内容网页。</span></div><div>今后，第三方开发人员和其他人员可以为常用功能建立自己的标签库，让<span>Web 网页开发人员能够使用熟悉的开发工具，如同HTML 一样的标签语法来执行特定功能的工作。</span></div><div>●<span> N-tier 企业应用架构的支持</span></div><div>有鉴于网际网络的发展，为因应未来服务越来越繁杂的要求，且不再受地域的限制，因此，</div><div>必须放弃以往<span>Client-Server的Two-tier 架构，进而转向更具威力、弹性的分散性对象系统。由于JavaServer Page 技术是Java 2 Platform Enterprise Edition (J2EE)集成中的一部分，它主要是负责前端显示经过复杂运算后之结果内容，而分散性的对象系统则是主要依赖EJB ( Enterprise JavaBean )和JNDI ( Java Naming and Directory Interface )构建而成。</span></div><div><span style="COLOR: black"><br /><strong><span style="COLOR: black">（4）、</span>JavaBean(Application)</strong></span><strong><span style="COLOR: black">应用组件技术</span></strong><span style="COLOR: black"><br />Application</span><span style="COLOR: black">是Java应用程序，在WEB项目和一些开发中主要应用JavaBean。它就是Application的一部分，逻辑运算能力很强，能极大的发挥Java语言的优点。</span>JavaBean 被称为是<span>Java 组件技术的核心。JavaBean 的结构必须满足一定的命名约定。JavaBean能提供常用功能并且可以重复使用，这使得开发人员可以把某些关键功能和核心算法提取出来封装成为一个组件对象，这样就增加了代码的重用率和系统的安全性。</span><span style="COLOR: black"><br /><br /></span><span style="COLOR: black">高级的WEB项目会应用到以上所有技术，它们之间联合使用和协作开发会提高开发的效率和系统的性能。 <br /><br /></span><font size="2"><strong>2、</strong><strong>面向对象分析设计思想</strong></font><span style="COLOR: black"><br /><br />Java</span><span style="COLOR: black">语言是完全面向对象的语言，所以在项目设计时会有很大的帮助，在设计时应尽量舍弃以往的面向过程的设计方式。 <br /><br />在分析项目业务关系的时候，应用一些UML(Unified Modeling Language)图,例如常用的用例图(use case diagram)，类图(class diagram)，时序图(sequence diagram)等等,会有很大的帮助，这样能尽快找出业务逻辑主要面对的对象，然后对每个对象进行行为划分，最后再实现对象之间的集成和通信。</span></div><div><span style="COLOR: black"><br /></span><font size="2"><strong>3、设计模式和框架</strong><strong><span style="COLOR: black">结构<br /></span></strong></font></div><div><span style="COLOR: black">Java</span><span style="COLOR: black">从语言角度来讲不是很难，但是从整体设计角度来讲我们还需要了解一些高级应用框架。如果要设计一个良好的框架结构，单单只掌握Java语言远远不够。这就涉及到一个设计模式，还有和设计模式相关的一些知识。 <br /><br />设计模式在Java项目实施过程更是重中之重。主要在与两层的设计模式、三层的设计模式和Ｎ层的设计模式。它直接决定着项目的应用、部署和实际开发设计。 <br /><br />在普通的WEB项目中很多采用两层的开发结构。JSP+Servlet或JSP+JavaBean。当对开发要求高的项目中使用很多的还是MVC的三层开发结构，也就是JSP+Servlet+JavaBean。它能分有效的分离逻辑开发，使开发人员能专注于各自的开发。同时也能时整个开发结构流程更清晰，但是需要比较高的开发配合度。 <br />在项目中，我们经常使用著名的Model-View-Controller(MVC)架构。</span>MVC架构是随着<span>smalltalk language语言的发展提出的，它是一个著名的用户界面设计架构。经典的MVC架构把一个组件（可认为是整个应用程序的一个模块）划分成三部分组 Model管理这个模块中所用到的数据和业务逻辑。而View 管理模块如何显示给用户，Controller 决定如何处理用户和该模块交互式时候产生的事件 如用户点击一个按钮等。 <br /></span><strong><br /><font size="2">4、XML</font></strong><strong><font size="2">语言</font></strong><span style="COLOR: black"><br /><br /></span><span style="COLOR: black">在服务器和设计模式结构中会应用到自定义文件，而且在应用高级设计时也会定义自用的标签，现在流行的是用XML去定义配置，所以XML语言应该有一定掌握。</span></div><div><span style="LETTER-SPACING: 0pt">当前，<span>Java 2平台企业版（J2EE）架构在厂商市场和开发者社区中倍受推崇。作为一种工具，可扩展标记语言（XML）简化了数据交换、进程间消息交换这一类的事情，因而对开发者逐渐变得有吸引力，并开始流行起来。自然，在J2EE架构中访问或集成XML解决方案的想法也很诱人。因为这将是强大系统架构同高度灵活的数据管理方案的结合。</span></span><br /><br /><span><span style="LETTER-SPACING: 0pt">XML</span></span><span style="LETTER-SPACING: 0pt">的应用似乎是无穷无尽的，但它们大致上可以分为三大类：</span><br /><span><span style="LETTER-SPACING: 0pt">1</span></span><span style="LETTER-SPACING: 0pt">、简单数据的表示和交换（针对<span>XML的简单API（SAX）和文档对象模型（DOM）语法解析，不同的文档类型定义（DTDs）和概要（schemas））</span></span><br /><span><span style="LETTER-SPACING: 0pt">2</span></span><span style="LETTER-SPACING: 0pt">、用户界面相关、表示相关的上下文（可扩展样式表语言（<span>XSL），可扩展样式表语言转换（XSLT））</span></span><br /><span><span style="LETTER-SPACING: 0pt">3</span></span><span style="LETTER-SPACING: 0pt">、面向消息的计算（<span>XML-RPC（远程过程调用），基于SOAP协议的Web 服务（Web Services），电子化业务XML（ebXML））</span></span><br /><span style="COLOR: black"><br /></span><strong><font size="2">5、网页脚本语言</font></strong><span style="COLOR: black"><br /> <br /></span><span style="COLOR: black">为了提高WEB项目的整体性能，提高人机交互的友好界面，网页的脚本语言是很有用处的，有的时候可以解决很大的难题或提高程序的性能和应用性。 <br /><br />网页脚本语言的执行都是在客户端执行的，速度很很快，并且大多的操作与服务器没有交互运算，所以在一些应用中非常理想。在设计WEB项目的应用中，网页的脚本语言起着不能忽视的作用，所以如果设计WEB项目的应用中，对JavaScript应有一定的了解。</span></div><div> </div><div>JavaScript是一种基于对象<span>(Object Based)和事件驱动(Event Driven)并具有安全性能（Secure）的脚本语言。使用它的目的是与HTML超文本标记语言、Java 脚本语言（Java小程序）一起实现在一个Web页面中链接多个对象，与Web客户交互作用。从而可以开发客户端的应用程序等。它是通过嵌入或调入在标准的HTML语言中实现的。它具有以下几个基本特点：</span></div><div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>1.</span>它是一种脚本编写语言<span><br />JavaScript是一种脚本语言，它采用小程序段的方式实现编程。像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个易的开发过程。 <br />它的基本结构形式与C、C++、VB十分类似。但它不像这些语言一样，需要先编译，而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起，从而方便用户的使用操作。 </span></div><div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>2.</span> 基于对象的语言。<span><br /> JavaScript是一种基于对象的语言，同时以可以看作一种面向对象的。这意味着它能运用自己已经创建的对象。因此，许多功能可以来自于脚本环境中对象的方法与脚本的相互作用。 </span></div><div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>3.</span>简单性<span><br /> JavaScript的简单性主要体现在：首先它是一种基于Java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习Java是一种非常好的过渡。其次它的变量类型是采用弱类型，并未使用严格的数据类型。 </span></div><div style="MARGIN-LEFT: 23.25pt; TEXT-INDENT: -18pt"><span>4.</span>安全性<span><br /> JavaScript是一种安全性语言，它不允许访问本地的硬盘，并不能将数据存入到服务器上，不允许对网络文档进行修改和删除，只能通过浏览器实现信息浏览或动态交互。从而有效地防止数据的丢失。 </span></div><div style="MARGIN-LEFT: 5.25pt">5. 动态性<span><br /> JavaScript是动态的，它可以直接对用户或客户输入做出响应，无须经过Web服务程序。它对用户的响应，是采用以事件驱动的方式进行的。所谓事件驱动，就是指在主页(Home Page)中执行了某种操作所产生的动作，就称为“事件”(Event)。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后，可能会引起相应的事件响应。 <br /><br /></span></div><div style="TEXT-JUSTIFY: inter-ideograph; MARGIN-LEFT: 0cm; TEXT-ALIGN: justify"><strong><span style="FONT-SIZE: 10.5pt"><font size="2">6、开发工具</font></span></strong></div><div style="TEXT-JUSTIFY: inter-ideograph; MARGIN-LEFT: 0cm; TEXT-ALIGN: justify"><strong><span style="FONT-SIZE: 10.5pt"><font size="2"></font></span></strong></div><div><strong><span style="COLOR: black">（1）、数据库 </span></strong></div><div><span style="COLOR: black">在主要的应用中，数据库相关的环节应用很多，所以对数据库应该有一定了解。不能单单只了解一种数据库，因为在很多实际开发中会提出很多数据库解决方案，所以只有在了解多种数据库的情况下才能有一个比较方案。</span></div><div><span style="COLOR: black">对于数据库应该了解他的性能和一些基本的操作常识，还有该数据库的特点。而针对与Java语言WEB项目的数据库开发则主要是对JDBC的应用，还有数据库事务处理和连接池等高级概念的应用。<br /><br /></span></div><div><strong><span style="COLOR: black"><span style="COLOR: black">（2）、</span>Web</span></strong><strong><span style="COLOR: black">服务器</span></strong></div><div> </div><div><span style="COLOR: black">同数据库一样，应该了解该服务器的性能，特点和一些常识。</span></div><div><span style="COLOR: black">在应用方面，Web服务器主要是针对于配置和部署，对目录的配置，调试；对配置文件属性的修改；对访问权限和并发性的控制；Java类的部署等。</span></div><div><strong><span style="COLOR: black"><br /><span style="COLOR: black">（3）、</span>集成开发环境（IDE）：</span></strong></div><div><span style="COLOR: black">“</span><span style="COLOR: black">公欲善其事， 必先利其器”. 对于Web应用开发人员来讲，好的集成开发环境（IDE：Integrated Development Enviroment）是非常重要的。目前在市场上占主导位置的一个集成开发工具就是Eclipse. </span></div><img src ="http://www.blogjava.net/Aisce/aggbug/161923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Aisce/" target="_blank">Aisce</a> 2007-11-20 19:26 <a href="http://www.blogjava.net/Aisce/articles/161923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java网络编程 </title><link>http://www.blogjava.net/Aisce/articles/142806.html</link><dc:creator>Aisce</dc:creator><author>Aisce</author><pubDate>Wed, 05 Sep 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/Aisce/articles/142806.html</guid><wfw:comment>http://www.blogjava.net/Aisce/comments/142806.html</wfw:comment><comments>http://www.blogjava.net/Aisce/articles/142806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Aisce/comments/commentRss/142806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Aisce/services/trackbacks/142806.html</trackback:ping><description><![CDATA[
		<p>课前思考<br />　　1. 什么是TCP/ IP协议？<br />　　2. TCP/IP有哪两种传输协议,各有什么特点？<br />　　3. 什么是URL？<br />　　4. URL和IP地址有什么样的关系？<br />　　5. 什么叫套接字（Socket）？<br />　　6. 套接字（Socket）和TCP/IP协议的关系？<br />　　7. URL和套接字（Socket）的关系？<br />8．1 网络编程基本概念，TCP/IP协议简介<br />8.1.1 网络基础知识<br />   网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。网络编程中有两个主要的问题，一个是如何准确的定位网络上一台或多台主机，另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中IP层主要负责网络主机的定位，数据传输的路由，由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠的或非可靠的数据传输机制，这是网络编程的主要对象，一般不需要关心IP层是如何处理数据的。<br />　　目前较为流行的网络编程模型是客户机/服务器（C/S）结构。即通信双方一方作为服务器等待客户提出请求并予以响应。客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行，监听网络端口，一旦有客户请求，就会启动一个服务进程来响应该客户，同时自己继续监听服务端口，使后来的客户也能及时得到服务。<br />8.1.3两类传输协议：TCP；UDP<br />　　尽管TCP/IP协议的名称中只有TCP这个协议名，但是在TCP/IP的传输层同时存在TCP和UDP两个协议。<br />   TCP是Tranfer Control Protocol的简称，是一种面向连接的保证可靠传输的协议。通过TCP协议传输，得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接，以便在TCP协议的基础上进行通信，当一个socket（通常都是server socket）等待建立连接时，另一个socket可以要求进行连接，一旦这两个socket连接起来，它们就可以进行双向数据传输，双方都可以进行发送或接收操作。<br />　　UDP是User Datagram Protocol的简称，是一种无连接的协议。每个数据报都是一个独立的信息，包括完整的源地址或目的地址，它在网络上以任何可能的路径传往目的地，因此能否到达目的地，到达目的地的时间以及内容的正确性都是不能被保证的。 <br />　　下面我们对这两种协议做简单比较：<br />　　使用UDP时，每个数据报中都给出了完整的地址信息，因此无需要建立发送方和接收方的连接。对于TCP协议，由于它是一个面向连接的协议，在socket之间进行数据传输之前必然要建立连接，所以在TCP中多了一个连接建立的时间。<br /> 　 使用UDP传输数据时是有大小限制的，每个被传输的数据报必须限定在64KB之内。而TCP没有这方面的限制，一旦连接建立起来，双方的socket就可以按统一的格式传输大量的数据。UDP是一个不可靠的协议，发送方所发送的数据报并不一定以相同的次序到达接收方。而TCP是一个可靠的协议，它确保接收方完全正确地获取发送方所发送的全部数据。<br />　　总之，TCP在网络通信上有极强的生命力，例如远程连接（Telnet）和文件传输（FTP）都需要不定长度的数据被可靠地传输。相比之下UDP操作简单，而且仅需要较少的监护，因此通常用于局域网高可靠性的分散系统中client/server应用程序。<br />　　读者可能要问，既然有了保证可靠传输的TCP协议，为什么还要非可靠传输的UDP协议呢？主要的原因有两个。一是可靠的传输是要付出代价的，对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽，因此TCP传输的效率不如UDP高。二是在许多应用中并不需要保证严格的传输可靠性，比如视频会议系统，并不要求音频视频数据绝对的正确，只要保证连贯性就可以了，这种情况下显然使用UDP会更合理一些。<br />8．2 基于URL的高层次Java网络编程<br />8.2.1一致资源定位器URL<br />    URL(Uniform Resource Locator)是一致资源定位器的简称，它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源，比如最常见的WWW，FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。<br />8.2.2 URL的组成<br />   protocol://resourceName<br />　　协议名（protocol）指明获取资源所使用的传输协议，如http、ftp、gopher、file等，资源名（resourceName）则应该是资源的完整地址，包括主机名、端口号、文件名或文件内部的一个引用。例如：<br />　　<a href="http://www.sun.com/">http://www.sun.com/</a> 协议名://主机名<br />　　<a href="http://home.netscape.com/home/welcome.html">http://home.netscape.com/home/welcome.html</a> 协议名://机器名＋文件名<br />　　<a href="http://www.gamelan.com:80/Gamelan/network.html#BOTTOM">http://www.gamelan.com:80/Gamelan/network.html#BOTTOM</a> 协议名://机器名＋端口号＋文件名＋内部引用.<br />8.2.3 创建一个URL<br /> 为了表示URL， java.net中实现了类URL。我们可以通过下面的构造方法来初始化一个URL对象：<br />　　（1） public URL (String spec);<br />　　　　　通过一个表示URL地址的字符串可以构造一个URL对象。<br />　　　　　URL urlBase=new URL("<a href="http://www">http://www</a>. 263.net/") <br />　　（2） public URL(URL context, String spec);<br />　　　　　通过基URL和相对URL构造一个URL对象。<br />　　　　　URL net263=new URL ("<a href="http://www.263.net/">http://www.263.net/</a>");<br />　　　　　URL index263=new URL(net263, "index.html")<br />　　（3） public URL(String protocol, String host, String file);<br />　　　　　new URL("http", "<a href="http://www.gamelan.com">www.gamelan.com</a>", "/pages/Gamelan.net. html");<br />　　（4） public URL(String protocol, String host, int port, String file);<br />　　　　　URL gamelan=new URL("http", "<a href="http://www.gamelan.com">www.gamelan.com</a>", 80, "Pages/Gamelan.network.html");<br />　　注意：类URL的构造方法都声明抛弃非运行时例外（MalformedURLException），因此生成URL对象时，我们必须要对这一例外进行处理，通常是用try-catch语句进行捕获。格式如下：<br />   try{<br />　　　　　URL myURL= new URL(…)<br />　　}catch (MalformedURLException e){<br />　　…　　}<br />8.2.4 解析一个URL<br />一个URL对象生成后，其属性是不能被改变的，但是我们可以通过类URL所提供的方法来获取这些属性：<br />　　　public String getProtocol() 获取该URL的协议名。<br />　　　public String getHost() 获取该URL的主机名。<br />　　　public int getPort() 获取该URL的端口号，如果没有设置端口，返回-1。<br />　　　public String getFile() 获取该URL的文件名。<br />　　　public String getRef() 获取该URL在文件中的相对位置。<br />　　　public String getQuery() 获取该URL的查询信息。<br />　　　public String getPath() 获取该URL的路径<br />　　  public String getAuthority() 获取该URL的权限信息<br />　　　public String getUserInfo() 获得使用者的信息<br />　　　public String getRef() 获得该URL的锚<br />8.2.5 从URL读取WWW网络资源<br />当我们得到一个URL对象后，就可以通过它读取指定的WWW资源。这时我们将使用URL的方法openStream()，其定义为：<br />　　　　　　　　　InputStream openStream();<br />　　方法openSteam()与指定的URL建立连接并返回InputStream类的对象以从这一连接中读取数据。<br />　　public class URLReader {<br />　　public static void main(String[] args) throws Exception { //声明抛出所有例外<br />　　　　URL tirc = new URL("<a href="http://www.tirc1.cs.tsinghua.edu.cn/">http://www.tirc1.cs.tsinghua.edu.cn/</a>"); //构建一URL对象<br />     //使用openStream得到一输入流并由此构造一个BufferedReader对象<br />　　　　BufferedReader in = new BufferedReader(new InputStreamReader(tirc.openStream()));<br />　　　　String inputLine;<br />　　　　while ((inputLine = in.readLine()) != null) <br />　　　　　　　　　　　　　　　　　//从输入流不断的读数据，直到读完为止<br />　　　　　　　System.out.println(inputLine); //把读入的数据打印到屏幕上<br />　　　　in.close(); //关闭输入流<br />　　}<br />　　}<br />8.2.6 通过URLConnetction连接WWW<br />通过URL的方法openStream()，我们只能从网络上读取数据，如果我们同时还想输出数据，例如向服务器端的CGI程序发送一些数据，我们必须先与URL建立连接，然后才能对其进行读写，这时就要用到类URLConnection了。CGI是公共网关接口（Common Gateway Interface）的简称，它是用户浏览器和服务器端的应用程序进行连接的接口，有关CGI程序设计，请读者参考有关书籍。<br />　　类URLConnection也在包java.net中定义，它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时，首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。例如下面的程序段首先生成一个指向地址<a href="http://edu.chinaren.com/index.shtml">http://edu.chinaren.com/index.shtml</a>的对象，然后用openConnection（）打开该URL对象上的一个连接，返回一个URLConnection对象。如果连接过程失败，将产生IOException.<br />　　Try{<br />　　　　URL netchinaren = new URL ("<a href="http://edu.chinaren.com/index.shtml">http://edu.chinaren.com/index.shtml</a>");<br />　　　　URLConnectonn tc = netchinaren.openConnection();<br />　　}catch(MalformedURLException e){ //创建URL()对象失败<br />　　…<br />　　}catch (IOException e){ //openConnection()失败<br />　　…<br />　　}<br />　　类URLConnection提供了很多方法来设置或获取连接参数，程序设计时最常使用的是getInputStream()和getOurputStream()。其定义为：<br />　　　　　InputSteram getInputSteram();<br />　　　　　OutputSteram getOutputStream();<br />　　通过返回的输入/输出流我们可以与远程对象进行通信。看下面的例子：<br />　　 URL url =new URL ("<a href="http://www.javasoft.com/cgi-bin/backwards">http://www.javasoft.com/cgi-bin/backwards</a>"); //创建一URL对象<br />　　 URLConnectin con=url.openConnection(); //由URL对象获取URLConnection对象<br />　　 DataInputStream dis=new DataInputStream (con.getInputSteam()); //由URLConnection获取输入流，并构造DataInputStream对象<br />　　 PrintStream ps=new PrintSteam(con.getOutupSteam());//由URLConnection获取输出流，并构造PrintStream对象<br />　　 String line=dis.readLine(); //从服务器读入一行<br />　　 ps.println("client…"); //向服务器写出字符串 "client…"<br />　　　　其中backwards为服务器端的CGI程序。实际上，类URL的方法openSteam（）是通过URLConnection来实现的。它等价于<br />　　　　openConnection().getInputStream();<br />　　基于URL的网络编程在底层其实还是基于下面要讲的Socket接口的。WWW，FTP等标准化的网络服务都是基于TCP协议的，所以本质上讲URL编程也是基于TCP的一种应用.<br />8．3 基于Socket的低层次Java网络编程<br />8.3.1 Socket通讯<br />    网络上的两个程序通过一个双向的通讯连接实现数据的交换，这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面，一个Socket由一个IP地址和一个端口号唯一确定。<br />　　在传统的UNIX环境下可以操作TCP/IP协议的接口不止Socket一个，Socket所支持的协议种类也不光TCP/IP一种，因此两者之间是没有必然联系的。在Java环境下，Socket编程主要是指基于TCP/IP协议的网络编程。<br />8.3.2 Socket通讯的一般过程<br />    使用Socket进行Client/Server程序设计的一般连接过程是这样的：Server端Listen(监听)某个端口是否有连接请求，Client端向Server端发出Connect(连接)请求，Server端向Client端发回Accept（接受）消息。一个连接就建立起来了。Server端和Client端都可以通过Send，Write等方法与对方通信。<br />对于一个功能齐全的Socket，都要包含以下基本结构，其工作过程包含以下四个基本的步骤：<br />　　（1） 创建Socket；<br />　　（2） 打开连接到Socket的输入/出流；<br />　　（3） 按照一定的协议对Socket进行读/写操作；<br />　　（4） 关闭Socket.<br />8.3.3 创建Socket<br />java在包java.net中提供了两个类Socket和ServerSocket，分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类，使用很方便。其构造方法如下：<br />　　Socket(InetAddress address, int port);<br />　　Socket(InetAddress address, int port, boolean stream);<br />　　Socket(String host, int prot);<br />　　Socket(String host, int prot, boolean stream);<br />　　Socket(SocketImpl impl)<br />　　Socket(String host, int port, InetAddress localAddr, int localPort)<br />　　Socket(InetAddress address, int port, InetAddress localAddr, int localPort)<br />　　ServerSocket(int port);<br />　　ServerSocket(int port, int backlog);<br />　　ServerSocket(int port, int backlog, InetAddress bindAddr)<br />　　其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号，stream指明socket是数据流socket,还是数据报socket，localPort表示本地主机的端口号，localAddr和bindAddr是本地机器的地址（ServerSocket的主机地址），impl是socket的父类，既可以用来创建serverSocket又可以用来创建Socket。count则表示服务端所能支持的最大连接数。例如：<br />　　Socket client = new Socket("127.0.01.", 80);<br />　　ServerSocket server = new ServerSocket(80);<br />　　注意:在选择端口时，必须小心。每一个端口提供一种特定的服务，只有给出正确的端口，才能获得相应的服务。0~1023的端口号为系统所保留，例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时，最好选择一个大于1023的数以防止发生冲突。<br />　　在创建socket时如果发生错误，将产生IOException，在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。<br />8.3.8 简单的Client/Server程序设计<br />    下面我们给出一个用Socket实现的客户和服务器交互的典型的C/S结构的演示程序，读者通过仔细阅读该程序，会对前面所讨论的各个概念有更深刻的认识。程序的意义请参考注释。<br />1. 客户端程序<br />　　import java.io.*;<br />　　import java.net.*;<br />　　public class TalkClient {<br />　　　　public static void main(String args[]) {<br />　　　　　　try{<br />　　　　　　　　Socket socket=new Socket("127.0.0.1",4700); //向本机的4700端口发出客户请求<br />　　　　　　　　BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象<br />　　　　　　　　PrintWriter os=new PrintWriter(socket.getOutputStream());//由Socket对象得到输出流，并构造PrintWriter对象<br />   //由Socket对象得到输入流，并构造相应的BufferedReader对象<br />　　　　　　　　BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));<br />　　　　　　　　String readline;<br />　　　　　　　　readline=sin.readLine(); //从系统标准输入读入一字符串<br />　　　　　　　　while(!readline.equals("bye")){ //若从标准输入读入的字符串为 "bye"则停止循环<br />　　　　　　　　　　os.println(readline); //将从系统标准输入读入的字符串输出到Server<br />　　　　　　　　　　os.flush(); //刷新输出流，使Server马上收到该字符串<br />　　　　　　　　　　System.out.println("Client:"+readline); //在系统标准输出上打印读入的字符串<br />　　　　　　　　　　System.out.println("Server:"+is.readLine()); //从Server读入一字符串，并打印到标准输出上<br />　　　　　　　　　　readline=sin.readLine(); //从系统标准输入读入一字符串<br />　　　　　　　　} //继续循环<br />　　　　　　　　os.close(); //关闭Socket输出流<br />　　　　　　　　is.close(); //关闭Socket输入流<br />　　　　　　　　socket.close(); //关闭Socket<br />　　　　　　}catch(Exception e) {<br />　　　　　　　　System.out.println("Error"+e); //出错，则打印出错信息<br />　　　　　　}<br />　　}<br />}<br />2. 服务器端程序<br />　　import java.io.*;<br />　　import java.net.*;<br />　　import java.applet.Applet;<br />　　public class TalkServer{<br />　　　　public static void main(String args[]) {<br />　　　　　　try{<br />　　　　　　　　ServerSocket server=null;<br />　　　　　　　　try{ <br />　　　　　　　　　　server=new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求<br />　　　　　　　　}catch(Exception e) {<br />　　　　　　　　　　System.out.println("can not listen to:"+e); //出错，打印出错信息<br />　　　　　　　　}<br />　　　　　　　　Socket socket=null;<br />　　　　　　　　try{<br />　　　　　　　　　　socket=server.accept(); //使用accept()阻塞等待客户请求，有客户请求则产生一个Socket对象，并继续执行<br />　　　　　　　　}catch(Exception e) {<br />　　　　　　　　　　System.out.println("Error."+e); //出错，打印出错信息<br />　　　　　　　　}<br />　　　　　　　　String line;<br />   //由Socket对象得到输入流，并构造相应的BufferedReader对象<br />　　　　　　　　BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));<br />　　　　　　　　PrintWriter os=newPrintWriter(socket.getOutputStream());　//由Socket对象得到输出流，并构造PrintWriter对象<br />　　　　　　　　BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象<br />　　　　　　　　System.out.println("Client:"+is.readLine()); //在标准输出上打印从客户端读入的字符串<br />　　　　　　　　line=sin.readLine(); //从标准输入读入一字符串<br />　　　　　　　　while(!line.equals("bye")){ //如果该字符串为 "bye"，则停止循环<br />　　　　　　　　　　os.println(line); //向客户端输出该字符串<br />　　　　　　　　　　os.flush(); //刷新输出流，使Client马上收到该字符串<br />　　　　　　　　　　System.out.println("Server:"+line); //在系统标准输出上打印读入的字符串<br />　　　　　　　　　　System.out.println("Client:"+is.readLine());//从Client读入一字符串，并打印到标准输出上<br />　　　　　　　　　　line=sin.readLine(); //从系统标准输入读入一字符串<br />　　　　　　　　} 　//继续循环<br />　　　　　　　　os.close(); //关闭Socket输出流<br />　　　　　　　　is.close(); //关闭Socket输入流<br />　　　　　　　　socket.close(); //关闭Socket<br />　　　　　　　　server.close(); //关闭ServerSocket<br />　　　　　　}catch(Exception e){<br />　　　　　　　　System.out.println("Error:"+e); //出错，打印出错信息<br />　　　　　　}<br />　　　　}<br />　　}<br />8.3.9 支持多客户的client/server程序设计<br />    前面提供的Client/Server程序只能实现Server和一个客户的对话。在实际应用中，往往是在服务器上运行一个永久的程序，它可以接收来自其他多个客户端的请求，提供相应的服务。为了实现在服务器方给多个客户提供服务的功能，需要对上面的程序进行改造，利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求，一旦监听到客户请求，服务器就会启动一个专门的服务线程来响应该客户的请求，而服务器本身在启动完线程之后马上又进入监听状态，等待下一个客户的到来。<br />       ServerSocket serverSocket=null;<br />　　　　boolean listening=true;<br />　　　　try{<br />　　　　　　serverSocket=new ServerSocket(4700); //创建一个ServerSocket在端口4700监听客户请求<br />　　　　}catch(IOException e) {　　}<br />　　　　while(listening){ //永远循环监听<br />     //监听到客户请求，根据得到的Socket对象和客户计数创建服务线程，并启动它<br />　　　　　　new ServerThread(serverSocket.accept(),clientnum).start();<br />　　　　　　clientnum++; //增加客户计数<br />　　　　}<br />　　　　serverSocket.close(); //关闭ServerSocket<br />  设计ServerThread类<br />　public class ServerThread extends Thread{<br />　　　Socket socket=null; //保存与本线程相关的Socket对象<br />　　　int clientnum; //保存本进程的客户计数<br />　　　public ServerThread(Socket socket,int num) { //构造函数<br />　　　　this.socket=socket; //初始化socket变量<br />　　　　clientnum=num+1; //初始化clientnum变量<br />　　　}<br />　　　public void run() { //线程主体<br />　　　　try{<br />  //在这里实现数据的接受和发送<br />       }<br />     }<br />8.3.10 数据报Datagram通讯<br />   前面在介绍TCP/IP协议的时候，我们已经提到，在TCP/IP协议的传输层除了TCP协议之外还有一个UDP协议，相比而言UDP的应用不如TCP广泛，几个标准的应用层协议HTTP，FTP，SMTP…使用的都是TCP协议。但是，随着计算机网络的发展，UDP协议正越来越来显示出其威力，尤其是在需要很强的实时交互性的场合，如网络游戏，视频会议等，UDP更是显示出极强的威力，下面我们就介绍一下Java环境下如何实现UDP网络传输。<br />8.3.11 什么是Datagram<br />    所谓数据报（Datagram）就跟日常生活中的邮件系统一样，是不能保证可靠的寄到的，而面向链接的TCP就好比电话，双方能肯定对方接受到了信息。在本章前面，我们已经对UDP和TCP进行了比较，在这里再稍作小节：<br />　　TCP，可靠，传输大小无限制，但是需要连接建立时间，差错控制开销大。<br />　　UDP，不可靠，差错控制开销较小，传输大小限制在64K以下，不需要建立连接。</p>
		<p>8.3.12 Datagram通讯的表示方法：DatagramSocket；DatagramPacket</p>
		<p>包java.net中提供了两个类DatagramSocket和DatagramPacket用来支持数据报通信，DatagramSocket用于在程序之间建立传送数据报的通信连接， DatagramPacket则用来表示一个数据报。先来看一下DatagramSocket的构造方法：<br />　　　DatagramSocket（）；<br />　　　DatagramSocket（int prot）;<br />　　　DatagramSocket(int port, InetAddress laddr)<br />　　　　其中，port指明socket所使用的端口号，如果未指明端口号，则把socket连接到本地主机上一个可用的端口。laddr指明一个可用的本地地址。给出端口号时要保证不发生端口冲突，否则会生成SocketException类例外。注意：上述的两个构造方法都声明抛弃非运行时例外SocketException，程序中必须进行处理，或者捕获、或者声明抛弃。<br />   用数据报方式编写client/server程序时，无论在客户方还是服务方，首先都要建立一个DatagramSocket对象，用来接收或发送数据报，然后使用DatagramPacket类对象作为传输数据的载体。下面看一下DatagramPacket的构造方法 ：<br />　　　DatagramPacket（byte buf[],int length）；<br />　　　DatagramPacket(byte buf[], int length, InetAddress addr, int port);<br />　　　DatagramPacket(byte[] buf, int offset, int length)；<br />　　　DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)；</p>
		<p>　　其中，buf中存放数据报数据，length为数据报中数据的长度，addr和port旨明目的地址，offset指明了数据报的位移量。<br />　　在接收数据前，应该采用上面的第一种方法生成一个DatagramPacket对象，给出接收数据的缓冲区及其长度。然后调用DatagramSocket 的方法receive()等待数据报的到来，receive()将一直等待，直到收到一个数据报为止。<br />　　DatagramPacket packet=new DatagramPacket(buf, 256);<br />　　Socket.receive (packet);<br />　　发送数据前，也要先生成一个新的DatagramPacket对象，这时要使用上面的第二种构造方法，在给出存放发送数据的缓冲区的同时，还要给出完整的目的地址，包括IP地址和端口号。发送数据是通过DatagramSocket的方法send()实现的，send()根据数据报的目的地址来寻径，以传递数据报。<br />　　DatagramPacket packet=new DatagramPacket(buf, length, address, port);<br />　　Socket.send(packet)；<br />    在构造数据报时，要给出InetAddress类参数。类InetAddress在包java.net中定义，用来表示一个Internet地址，我们可以通过它提供的类方法getByName（）从一个表示主机名的字符串获取该主机的IP地址，然后再获取相应的地址信息。</p>
		<p>8.3.14 用数据报进行广播通讯</p>
		<p>DatagramSocket只允许数据报发送一个目的地址，java.net包中提供了一个类MulticastSocket，允许数据报以广播方式发送到该端口的所有客户。MulticastSocket用在客户端，监听服务器广播来的数据。</p>
		<p>1. 客户方程序:MulticastClient.java<br />　　import java.io.*;<br />　　import java.net.*;<br />　　import java.util.*;<br />　　public class MulticastClient {<br />　　　　public static void main(String args[]) throws IOException<br />　　　　{<br />　　　　　MulticastSocket socket=new MulticastSocket(4446); <br />　　　　　//创建4446端口的广播套接字<br />　　　　　InetAddress address=InetAddress.getByName("230.0.0.1"); <br />　　　　　//得到230.0.0.1的地址信息<br />　　　　　socket.joinGroup(address); <br />　　　　　//使用joinGroup()将广播套接字绑定到地址上<br />　　　　　DatagramPacket packet;</p>
		<p>　　　　　for(int i=0;i&lt;5;i++) {<br />　　　　　　　byte[] buf=new byte[256]; <br />　　　　　　　//创建缓冲区<br />　　　　　　　packet=new DatagramPacket(buf,buf.length); <br />　　　　　　　//创建接收数据报<br />　　　　　　　socket.receive(packet); //接收<br />　　　　　　　String received=new String(packet.getData()); <br />　　　　　　　//由接收到的数据报得到字节数组，<br />　　　　　　　//并由此构造一个String对象<br />　　　　　　　System.out.println("Quote of theMoment:"+received); <br />　　　　　　　//打印得到的字符串<br />　　　　　} //循环5次<br />　　　　　socket.leaveGroup(address); <br />　　　　　//把广播套接字从地址上解除绑定<br />　　　　　socket.close(); //关闭广播套接字<br />　　　}<br />　}</p>
		<p>　2. 服务器方程序:MulticastServer.java<br />　　public class MulticastServer{<br />　　　　public static void main(String args[]) throws java.io.IOException <br />　　　　{<br />　　　　　　new MulticastServerThread().start(); <br />　　　　　　//启动一个服务器线程<br />　　　　}<br />　　}</p>
		<p>　3. 程序MulticastServerThread.java<br />　　import java.io.*;<br />　　import java.net.*;<br />　　import java.util.*;<br />　　public class MulticastServerThread extends QuoteServerThread <br />　　//从QuoteServerThread继承得到新的服务器线程类MulticastServerThread<br />　　{<br />　　　　Private long FIVE_SECOND=5000; //定义常量，5秒钟<br />　　　　public MulticastServerThread(String name) throws IOException <br />　　　　{<br />　　　　　　super("MulticastServerThread"); <br />　　　　　　//调用父类，也就是QuoteServerThread的构造函数<br />　　　　}</p>
		<p>　　　　public void run() //重写父类的线程主体<br />　　　　{<br />　　　　　while(moreQuotes) { <br />　　　　　//根据标志变量判断是否继续循环<br />　　　　　　try{<br />　　　　　　　　byte[] buf=new byte[256]; <br />　　　　　　　　//创建缓冲区<br />　　　　　　　　String dString=null;<br />　　　　　　　　if(in==null) dString=new Date().toString(); <br />　　　　　　　　//如果初始化的时候打开文件失败了，<br />　　　　　　　　//则使用日期作为要传送的字符串<br />　　　　　　　　else dString=getNextQuote(); <br />　　　　　　　　//否则调用成员函数从文件中读出字符串<br />　　　　　　　　buf=dString.getByte(); <br />　　　　　　　　//把String转换成字节数组，以便传送send it<br />　　　　　　　　InetAddress group=InetAddress.getByName("230.0.0.1"); <br />　　　　　　　　//得到230.0.0.1的地址信息<br />　　　　　　　　DatagramPacket packet=new DatagramPacket(buf,buf.length,group,4446);<br />　　　　　　　　//根据缓冲区，广播地址，和端口号创建DatagramPacket对象<br />　　　　　　　　socket.send(packet); //发送该Packet<br />　　　　　　　　try{<br />　　　　　　　　　　sleep((long)(Math.random()*FIVE_SECONDS)); <br />　　　　　　　　　　//随机等待一段时间，0～5秒之间<br />　　　　　　　　}catch(InterruptedException e) { } //异常处理<br />　　　　　　}catch(IOException e){ //异常处理<br />　　　　　　　　e.printStackTrace( ); //打印错误栈</p>
		<p>　　　　　　　　moreQuotes=false; //置结束循环标志<br />　　　　　　}<br />　　　　}<br />　　　　socket.close( ); //关闭广播套接口<br />　　　}<br />　}</p>
		<p>【本讲小结】</p>
		<p>本讲主要讲解了Java环境下的网络编程。因为TCP/IP协议是Java网络编程的基础知识，本讲开篇重点介绍了TCP/IP协议中的一些概念，TCP/IP协议本身是一个十分庞大的系统，用几个小节是不可能讲清楚的。所以我们只是联系实际，讲解了一些最基本的概念，帮助学生理解后面的相关内容。重点有一下几个概念：主机名，IP，端口，服务类型，TCP，UDP。<br />　　后续的内容分为两大块，一块是以URL为主线，讲解如何通过URL类和URLConnection类访问WWW网络资源，由于使用URL十分方便直观，尽管功能不是很强，还是值得推荐的一种网络编程方法，尤其是对于初学者特别容易接受。本质上讲，URL网络编程在传输层使用的还是TCP协议。<br />　　另一块是以Socket接口和C/S网络编程模型为主线，依次讲解了如何用Java实现基于TCP的C/S结构，主要用到的类有Socket，ServerSocket。以及如何用Java实现基于UDP的C/S结构，还讨论了一种特殊的传输方式，广播方式，这种方式是UDP所特有的，主要用到的类有DatagramSocket , DatagramPacket, MulticastSocket。这一块在Java网络编程中相对而言是最难的（尽管Java在网络编程这方面已经做的够"傻瓜"了，但是网络编程在其他环境下的却是一件极为头痛的事情，再"傻瓜"还是有一定的难度），也是功能最为强大的一部分,读者应该好好研究，领悟其中的思想。<br />　　最后要强调的是要学好Java网络编程，Java语言，最重要的还是在于多多练习！<br /></p>
<img src ="http://www.blogjava.net/Aisce/aggbug/142806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Aisce/" target="_blank">Aisce</a> 2007-09-05 10:07 <a href="http://www.blogjava.net/Aisce/articles/142806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse警告：不能读取 AppletViewer 的属性文件解决</title><link>http://www.blogjava.net/Aisce/articles/142767.html</link><dc:creator>Aisce</dc:creator><author>Aisce</author><pubDate>Tue, 04 Sep 2007 14:15:00 GMT</pubDate><guid>http://www.blogjava.net/Aisce/articles/142767.html</guid><wfw:comment>http://www.blogjava.net/Aisce/comments/142767.html</wfw:comment><comments>http://www.blogjava.net/Aisce/articles/142767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Aisce/comments/commentRss/142767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Aisce/services/trackbacks/142767.html</trackback:ping><description><![CDATA[
		<p>解决方法：</p>
		<p>   1.打开命令提示窗口<br />2.打入PolicyTool并按Enter<br />3.在PolicyTool对话框中，点击Add Policy Entry按钮（添加规则项目）</p>
		<p>4.点击Add Permission 按钮（添加权限）</p>
		<p>5.点击许可下拉菜单选择 All Permission</p>
		<p>6.点击ok（确认）</p>
		<p>7.点击Done（完成）</p>
		<p>8.从file菜单中选择Save as（文件菜单选择另存为）</p>
		<p>9.在 C:\Documents and Settings\Administrator（当前操作系统用户名）\中保存.java.policy文件（这个要根据情况来 如果没有.java.policy文件开始会弹出个提示说是在什么地方找不到.java.policy 你就把它存在提示的那个目录下面）<br /></p>
<img src ="http://www.blogjava.net/Aisce/aggbug/142767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Aisce/" target="_blank">Aisce</a> 2007-09-04 22:15 <a href="http://www.blogjava.net/Aisce/articles/142767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM(Java 虚拟机)的详细讲解</title><link>http://www.blogjava.net/Aisce/articles/142764.html</link><dc:creator>Aisce</dc:creator><author>Aisce</author><pubDate>Tue, 04 Sep 2007 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/Aisce/articles/142764.html</guid><wfw:comment>http://www.blogjava.net/Aisce/comments/142764.html</wfw:comment><comments>http://www.blogjava.net/Aisce/articles/142764.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/Aisce/comments/commentRss/142764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Aisce/services/trackbacks/142764.html</trackback:ping><description><![CDATA[
		<p align="left">       <img height="20" src="http://www.blogjava.net/Emoticons/QQ/47.gif" width="20" border="0" />可能有很多学习Java的朋友还不知道Java的运行原理、Java虚拟机是怎么工作的，本文将为你详细讲解(JVM)Java 虚拟机。 <br />　　在Java中引入了虚拟机的概念，即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机，生成虚拟机能够理解的代码，然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中，这种供虚拟机理解的代码叫做字节码(ByteCode)，它不面向任何特定的处理器，只面向虚拟机。每一种平台的解释器是不同的，但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码，字节码由虚拟机解释执行，虚拟机将每一条要执行的字节码送给解释器，解释器将其翻译成特定机器上的机器码，然后在特定的机器上运行。</p>
		<p align="left">　　可以说，Java虚拟机是Java语言的基础。它是Java技术的重要组成部分。Java虚拟机是一个抽象的计算机，和实际的计算机一样，它具有一个指令集并使用不同的存储区域。它负责执行指令，还要管理数据、内存和寄存器。Java解释器负责将字节代码翻译成特定机器的机器代码。Java是一种简单的语言。它用到的概念不多，而且多为程序员所熟悉。如果你是一名程序员，掌握Java对你来说是易如反掌的事。即使你没有学过任何编程语言，学习Java也要比学习C++要容易的多。</p>
		<p align="left">　　由于Java最初是为控制电子产品设计的，因此它必须简单明了。为了保证这种简单性，Java去掉了C++中许多复杂的、冗余的、有二义性的概念，例如操作符重载、多继承、数据类型自动转换等。为了将程序员从复杂的内存管理的负担中解脱出来，同时也是为了减少错误，Java使用了自动内存垃圾收集机制，程序员只要在需要的时候申请即可，不需要释放,而由Java自己来收集、释放内存中的无用的块。</p>
		<p align="left">　　与C++相比，Java有着更强的面向对象特性，是一种比较纯粹的面向对象语言。一般我们使用的一些所谓的面向对象的编程语言，如C++，Object Pascal等，实际上都是一种混合型的语言，即在过程式的语言中加上面向对象的扩展。在Java中，几乎万物皆对象，就连一些基本数据类型，如整型、字符型、浮点型等，在Java中都可以作为对象处理。Java的面向对象特性几乎可以与Smalltalk媲美，但是其适用于分布式计算环境的特性却远远超过了Smalltalk。</p>
		<p align="left">　　Java是一种支持分布式操作的程序设计语言。使用Java提供的URL类，用户可以象访问本地文件一样访问网络上的对象，使用非常方便。在客户机/服务器的模式下，Java还可以将运算从服务器端分散到客户端，提高系统的效率，避免了服务器的瓶颈制约。Java的网络类库支持分布式的编程。Socket类提供可靠的流式网络的连接，支持TCP/IP协议。通过编写协议句柄，程序员还可以扩充Java支持的协议集合。 <br /><br />　　Java提供非常有效的安全控制。由于Java应用于网络程序的开发，因而安全性变的至关重要。因为Java小程序需要下载到客户端解释执行，所以，如果没有安全控制，就会给一些网络黑客以可乘之机，这对用户来说是非常危险的。所幸的是，Java的安全机制可以有效的防止病毒程序的产生、下载程序对本地文件系统的破坏，以及网络黑客窃取密码和入侵。</p>
		<p align="left">　　Java是一种非常健壮的语言。因为在Java中使用了以下手段：</p>
		<p align="left">　　不支持指针。在C++程序中，指针的错误使用通常的程序中BUG的元凶。在Java中彻底去掉了指针，杜绝了内存的非法访问，从而保证了程序的可靠性。</p>
		<p align="left">　　强类型语言</p>
		<p align="left">　　自动内存垃圾收集机制。Java自动收集无用的内存单元，进而防止了由于内存泄漏导致的动态内存分配问题。</p>
		<p align="left">　　完善的异常处理机制，既简化了错误处理任务和恢复，也增加了程序的可读性。</p>
		<p align="left">　　Java具有非常好的平台无关性和可移植性。因为Java最初是为对电子产品编程而设计的，所以它具有完美的平台无关性。它使用一种与平台无关的代码──字节码，而不是通常的特定机器上的机器码，由平台上的Java虚拟机中的Java解释器解释执行。Java虚拟机是免费的，在许多平台上都有。<br /> <br />　　Java提供了良好的可移植性。使用Java作为编程语言，只要进行一次程序开发工作，所开发的程序不需要经过任何改动，便能在各种平台上运行。Java使用两种方法使Java的应用程序不依赖与具体的系统：</p>
		<p align="left">　　采用基于国际标准的数据类型。Java的原始数据类型在任何机器上都是一样的，例如整型总是32位，长整型总是64位等。</p>
		<p align="left">　　提供了一个用于访问底层操作系统功能的可扩展类库。</p>
		<p align="left">　　Java是一种高性能的语言。"鱼与熊掌不可兼得"，通常，健壮性、安全性、平台无关性、可移植性等方面的提高总是要以牺牲性能为代价的。Java也不例外，Java的内存管理增加了运行时系统的复杂性，因为Java运行时系统必须内嵌一个内存管理模块;同样，Java程序的解释执行的效率也要低于直接执行编译后的源码的效率。但是Java采用了一些很好的措施来弥补这些性能上的差距： <br /><br />　　生成高效的字节码。Java字节码的设计充分考虑了性能的因素，字节码的格式简单，解释器可以生成高效的机器码。</p>
		<p align="left">　　提供了即时编译和嵌入C代码的可选措施。即时编译是指在运行时把字节码编译成机器码。支持多线程。Java提供了对多线程的语言级的接口，而且Java环境本身就是多线程的。</p>
		<p align="left">　　Java对多线程有良好的支持。多线程技术可以提高程序执行的并发度，提高图形用户界面的交互性能。Java提供了语言内置的多线程控制，简化了多线程应用程序的开发，还支持线程的同步控制。</p>
		<p align="left">　　Java是一种动态的语言。动态特性是面向对象特性的一个延伸，它使得程序能够适应不断变化的执行环境。Java的动态性主要表现在以下几个方面：</p>
		<p align="left">　　Java的类有运行时的表示，这样，即使在运行时刻，程序也能辨别类之间的关系和类型信息，可以动态的从本地或网上把一个类链接到运行系统中去。</p>
		<p align="left">　　Java的类在运行过程中动态的装载，因此，Java可以在分布式的环境中动态的维护应用程序和Java类库之间的一致性。当类库升级后，应用程序无需重新编译，也一样可以利用新类库中新增的功能。</p>
		<p align="left">　　支持动态数据类型和动态协议。通过编写协议句柄，Java可以支持新的、自定义的传输协议，编写内容句柄，可以支持新的数据类型。</p>
<img src ="http://www.blogjava.net/Aisce/aggbug/142764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Aisce/" target="_blank">Aisce</a> 2007-09-04 22:12 <a href="http://www.blogjava.net/Aisce/articles/142764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>