




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java开发培训,2013/02/17,主要内容,一.Java 网络开发,计算机网络分层体系结构 套接字 Java Web开发,1.1计算机网络分层体系结构,计算机以一种非常简单的方式进行相互间的操作和通信。计算机芯片是以 1 和 0 的形式存储并传输数据的开闭转换器的集合。当计算机想共享数据时,它们所需做的全部就是以一致的速度、顺序、定时等等来回传输几百万比特和字节的数据流。每次想在两个应用程序之间进行信息通信时,您怎么会愿意担心那些细节呢? 为免除这些担心,我们需要每次都以相同方式完成该项工作的一组包协议。这将允许我们处理应用程序级的工作,而不必担心低级网络细节。这些成包协议称为协议栈(s
2、tack)。TCP/IP 是当今最常见的协议栈。多数协议栈(包括 TCP/IP)都大致对应于国际标准化组织(International Standards Organization,ISO)的开放系统互连参考模型(Open Systems Interconnect Reference Model,OSIRM)。OSIRM 认为在一个可靠的计算机组网中有七个逻辑层(见图)。各个地方的公司都对这个模型某些层的实现做了一些贡献,从生成电子信号(光脉冲、射频等等)到提供数据给应用程序。TCP/IP 映射到 OSI 模型中的两层的情形如图所示。我们不想涉及层的太多细节,但您应该知道套接字位于什么地方。,
3、物理层:以太网 调制解调器 电力线通信(PLC) SONET/SDH G.709 光导纤维 同轴电缆 双绞线等 数据链路层:Wi-Fi(IEEE 802.11) WiMAX(IEEE 802.16) ARP RARP ATM DTM 令牌环 以太网 FDDI 帧中继 GPRS EVDO HSPA HDLC PPP L2TP PPTP ISDNSTP 等 网络层协议:IP (IPv4 IPv6) ICMP ICMPv6IGMP IS-IS IPsec 等 传输层协议:TCP UDP TLS DCCP SCTP RSVP OSPF 等 应用层协议:DHCP DNS FTP Gopher HTTP
4、IMAP4 IRC NNTP XMPP POP3 SIP SMTP SNMP SSH TELNET RPC RTCP RTP RTSP SDP SOAP GTP STUN NTP SSDP BGP RIP 等,1.1计算机网络协议,1.1 TCP/IP 体系分层,1.1 TCP/IP 体系分层,1. 2.套接字,什么是套接字? 套接字是一种软件抽象,用于表达两台机器之间的连接“终端”。对于一个给定的连接,每台机器上都有一个套接字,您也可以想象它们之间有一条虚拟的“电缆”,“电缆”的每一端都插入到套接字中。当然,机器之间的物理硬件和电缆连接都是完全未知的。抽象的全部目的是使我们无须知道不必知道的
5、细节。,简言之,一台机器上的套接字与另一台机器上的套接字交谈就创建一条通信通道。程序员可以用该通道来在两台机器之间发送数据。当您发送数据时,TCP/IP 协议栈的每一层都会添加适当的报头信息来包装数据。这些报头帮助协议栈把您的数据送到目的地。好消息是 Java 语言通过流为您的代码提供数据,从而隐藏了所有这些细节,这也是为什么它们有时候被做流套接字(streaming socket)的原因。 把套接字想成两端电话上的听筒 我和您通过专用通道在我们的电话听筒上讲话和聆听。直到我们决定挂断电话,对话才会结束(除非我们在使用蜂窝电话)。而且我们各自的电话线路都占线,直到我们挂断电话。,1. 2.套接
6、字,套接字的类型 一般而言,Java 语言中的套接字有以下两种形式: TCP 套接字(由 Socket 类实现) UDP 套接字(由 DatagramSocket 类实现) TCP 和 UDP 扮演相同角色,但做法不同。两者都接收传输协议数据包并将其内容向前传送到表示层。TCP 把消息分解成数据包(数据报,datagrams)并在接收端以正确的顺序把它们重新装配起来。TCP 还处理对遗失数据包的重传请求。有了 TCP,位于上层的层要担心的事情就少多了。UDP 不提供装配和重传请求这些功能。它只是向前传送信息包。位于上层的层必须确保消息是完整的并且是以正确的顺序装配的。 与TCP协议不同,用户数
7、据报协议(UDP)则是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。 一般而言,UDP 强加给您的应用程序的性能开销更小,但只在应用程序不会突然交换大量数据并且不必装配大量数据报以完成一条消息的时候。否则,TCP 才是最简单或许也是最高效的选择。,1. 2.套接字,java平台套接字实现,URLConnection Socket
8、ServerSocket,1.3JavaWeb应用的概念,在Sun的Java Servlet规范中,对Java Web应用作了这样定义:“Java Web应用由一组Servlet、HTML页、类、以及其它可以被绑定的资源构成。它可以在各种供应商提供的实现Servlet规范的Servlet容器中运行。” Java Web应用中可以包含如下内容: Servlet JSP java实用类 javabean 静态文档如HTML、图片等 客户端类(如Applet) 描述Web应用的信息(web.xml),1.3.Servlet容器的概念,Servlet容器为Java Web应用提供运行时环境,它负责管理
9、Servlet和JSP的生命周期,以及管理它们的共享数据。 Servlet容器也称为Java Web应用容器,或者Servlet/JSP容器。后文均采用Servlet容器的提法。 目前最流行的Servlet容器软件包括: Tomcat JBoss J2EE服务器(如Weblogic)中也提供了内置的Servlet容器,1.3. Servlet容器响应客户请求的过程,http:/localhost:8080/szhhxh/hello?clientName=浩瀚,客户,Servlet容器,Servlet,请求,HttpServletRequest,HttpServletResponse,响应,1.
10、3. Servlet容器响应客户请求的过程,当客户请求访问某个Servlet时,Servlet容器将创建一个ServletRequest对象和ServletResponse对象。 在ServletRequest对象中封装了客户请求信息,然后Servlet容器把ServletRequest对象和ServletResponse对象传给客户所请求的Servlet。 Servlet把响应结果写到ServletResponse中,然后由Servlet容器把响应结果传给客户。,以下将简单介绍Java网络开发的原理及应用,1.3HTTPWatch,1.3.Tomcat原理,一个web服务器也叫做HTTP服务
11、器,因为它使用HTTP协议同客户端(即浏览器)通信。一个基于Java的web服务器用到的两个重要 类:.Socket和.ServerSocket,通信协议采用HTTP。因此,很自然的接下来我们就以HTTP和 java的这两个类来谈谈web服务器。随后我们再介绍一个简单的web服务器应用。,1.3.Tomcat原理,Http是允许web服务端和浏览器之间通过Internet发送/接收的协议,它是一个请求/响应的协议。浏览器请求一个文件,服务器会响应这个请求。 Http用Tcp连接方式-默认端口是80.Http的第一个发布版本是Http/0.9,目前一般用的是Http1.1. 通过Http协议,通
12、常是浏览器通过建立连接并且发送请求来发起一个会话事务,服务器端会响应或者给浏览器一个响应的连接,浏览器端或者服务器端可以在会 话中提前终止一个连接。例如,当用一个浏览器作为客户端,可以点击停止按钮就可以终止正在下载的文件,从而有效的关闭与web服务器端的Http连接。,1.3.Tomcat原理,一个Http请求包含以下3个部分: Method-URI-Protocal/Version Request headers Entity body一个HTTP请求的例子如下: POST /examples/default.jsp HTTP/1.1 Accept:text/plain;text/html
13、Accept-Language:en-gb Connection:Keep-Alive Host:localhost User-Agent:Mozilla/4.0(compatible;MSIE 4.01;windows 98) Content-Length:33 Content-Type:application/x-www-form-urlencoded Accept-Encoding:gzip,deflate lastName=Franks 优点: 1.名字可不与类名相同,可以采用更易理解的名称。 2.不必在每次调用的时候都创建一个新的对象。 3.可以返回子类型。 缺点: 1.无法被继承。
14、 2.和其它static方法无法区分。,应用场景: 沿海地产财务凭证WebService接口开发,该财务接口高峰时每秒调用610次。 问题描述: 生产机服务器每隔两到三天凭证接口调用就开始超时,查看服务器没有内存溢出,高峰值内存占用为7080%,后台没有抱错,服务器实例必须重启后才能使用。 部分代码具体: 修改前: public calss VoucherServiceImpl public static void createVoucher(String xml,Context ctx) IYHVoucherFacade iYHVoucherFacade = YHVoucherFacadeF
15、actory.getLocalInstance(ctx); VoucherInfo voucherInfo = new VoucherInfo(); /业务逻辑处理 iYHVoucherFacade.save(voucherInfo); ,4.1考虑用静态工厂方法替代构造器,修改后: public calss VoucherServiceImpl private IYHVoucherFacade iYHVoucherFacade = null; static iYHVoucherFacade =YHVoucherFacadeFactory.getLocalInstance(ctx); publ
16、ic static void createVoucher(String xml,Context ctx) VoucherInfo voucherInfo = new VoucherInfo(); /业务逻辑处理 iYHVoucherFacade.save(voucherInfo); ,4.1考虑用静态工厂方法替代构造器,4.2遇到多个构造器参数时要考虑用构造器,2.1重叠构造器 NutritionFacts CocaCola = new NutritionFacts (240,8,100, 35,27); 缺点:当有许多参数的时候,客户端代码会很难写。 2.2JavaBean模式 Nutrit
17、ionFacts CocaCola = new NutritionFacts (); CocaCola.setServingSize(240); 缺点:构造过程被分解到几个调用过程中,在构造过程中JavaBean可能存于不一致的状态。,4.2遇到多个构造器参数时要考虑用构造器,2.3Builder模式 public static NutritionFacts private final int servingSize; public static class Builder private final int servingSize; private final int servings; p
18、rivate int calories = 0; public Builder(int servingSize,int servings) this.servingSize = servingSize; this.servings = servings; public Builder calories(int val) calories = val; return this; public public NutritionFacts build() return new NutritionFacts(this); private NutritionFacts(Builder builder)
19、servingSize = builder. servingSize; 调用: NutritionFacts cocaCola = new NutritionFacts.Builder(240,8).calories(100); 优点:可以有多个可变(varargs)参数。 缺点:为了创建对象,必须先创建它的构造器,可能存在一定性能问题,必须先初始化。,4.3用私有构造器或者枚举类型强化Singleton属性,3.1公有静态成员是个final域: public class Hello public static final Hello Instance = new Hell(); privat
20、e Hello() 3.2公有的成员是个静态工厂方法: public class Hello private static final Hello Instance = new Hell(); private Hello() public static Hello getInstance() /可以方便改变 return Instance; private Object readResolve()/防止反序列话时创建一个新的实例 return INSTANCE; 如果想让singleton类成为serializable,除了implements Serializable外,还要提供readRe
21、solve()方法返回该单例。,4.4避免创建不必要的对象,尤其是创建比较昂贵的。 对不可修改的对象尽量进行复用,这样效率和性能都会提高。例如如果循环100次String s = new String(hello)将创建100个对象 循环100次String s = hello;则只创建了一个对象。很好的进行了复用。 以下代码是否有问题,为什么。 public static void main(String args) Long sum = 0L; for(long i = 0 ; i Integer.MAX_VALUE ; i+) sum += I ; System.out.println(
22、sum); ,4.5消除过期的对象引用,内存泄漏,在cache里易发生。以下两个代码之间有什么问题: public Object pop() if(size = 0) return elementssize-; public Object pop() if(size = 0) Object obj = elements-size; elementssize = null; /但是不要滥用,不要每个对象使用后都用NULL return obj; 如果一个栈显示增长,然后再收缩,那么,从堆栈中弹出来的对象将不会被当作垃圾回收,即使使用栈的程序不在引用这些对象,他们也不会被回收。这是因为栈内部维护着
23、对这些对象的过期引用。过期引用是指永远也不会再被解除的引用。,4.6使类和成员的可访问范围降到最低,好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块之间的耦合程度降到最低。开发得以并行,无疑这将加快开发的速度,便于系统地维护。Java中通过访问控制符来解决这个问题。 public表示这个类在任何范围都可用。 Protected表示只有子类和包内的类可以使用 private-package(default)表示在包内可用 private表示只有类内才可以用 你在设计一个类的时候应该尽量的按照4321得顺序设计。假如一个类只是被另一个类使用,那么应该考虑把它设计成这个类的内部类。通常
24、public 的类不应该有public得字段,不过我们通常会用一个类来定义所有的常量,这是答应的。不过必须保证这些字段要么是基本数据类型要么引用指向的对象是不 可修改的。不然他们将可能被修改。例如下面的定义中data就是不合理的,后面两个没有问题。public class Conpublic static final int data = 1,2,3;/ it is badpublic static final String hello = world;public static final int i = 1;,4.7在公有类中使用访问方法而非公有域,class point public d
25、ouble x; public double y; 该类的数据域是可以被直接访问的,这些类没有提供封装,如果不改变API,就无法改变它的数据表示法,也无法强加任何约束直接条件,当域被访问的时候,无法采取任何辅助的行动。 所以应该改为: class point private double x; private double y; public void setX (double x) this.x = x; 总之,公有类永远都不应该暴漏可变的域。虽然还是有几个问题,但是让公有类暴漏不可变的域,起危害比较小。但是,有时候需要会用到包级私有的或者私有的嵌套类来暴漏域,无论这个类是可变还是不可变。,
26、4.8不要忽略异常,Exception处理的最佳实现:1 选择Checked还是Unchecked的几个经典依据 (如果你希望强制你的类调用者来处理异常,那么就用Checked Exception ;如果你不希望强制你的类调用者来处理异常,就用UnChecked。) 2 Exception的封装问题 3 如无必要不要创建自己得Exception 4 不要用Exception来作流程控制 5 不要轻易的忽略捕获的Exception 6 不要简单地捕获顶层的Exception”,4.9努力使失败保持原子性,一个失败的方法调用,应该是对象保持“它在被调用之前的状态”。具有这种属性的方法,被称为具有失
27、败原子性。 获得这种效果的方法: 1. 设计一个非可变对象。 2. 对于可变对象,在操作之前检查参数的有效性,在对象状态改变之前,适当的抛出异常。与此类似,对计算处理过程顺序调整,使得任何肯能会失败的计算部分都发生在对象状态被修改之前。 3. 编写恢复代码(用于永久性的数据结构)。 4. 在对象的临时拷贝上执行操作,操作完成后,再把临时拷贝中的结果,复制给原来的对象。 总结:失败原子性是期望目标,但不总是能做到。对于某些操作,他会显著的增加开销和复杂性。总结一条规则:作为方法规范的一部分,任何一个异常,都不应该改变对象在调用这个方法之前的状态。如果被改变,就该在API文档中指明对象将处于什么样
28、的状态。,4.10遵守普遍接受的命名惯例,java的命名惯例分为两大类:字面的和语法的。字面命名惯例涉及包、类、接口、方法和域。 包的名字是层次结构的,用句号分隔第一部分。每一部分的长度不要超过8,由小写字母和数字组成(数字少见用),鼓励使用有意义的缩写。除了java和javax外,一般以域名做开头,顺序是顶级域名放在最前面。 类和接口的名字应至少1至多个单词,每个单词的首字母大写(驼峰试),尽量避免缩写。 方法和域的名字与类和接口的名字遵守相同的字面惯例,只是第一个首字母要小写。常量域要全部字母都大写,词之间通过下划线区分。 语法命名惯例比字面惯例更灵活。 类通常用一个名词或名词短语,接口或
29、者与类相同,或者以-able或-ible结尾的形容词。 执行某个动作的方法,常用一个动词或动词短语, 对于返回boolean类型的方法,名字常以“is开头后加一个名词或形容词或短语, 如果返回的不是boolean,则常用一个名词/短语,或以get开头的动词短语。 如果一方法所在的类是一个Bean,则强制要求以get开头。 如果类包含对属性操作,常用setAttribute或getAttribute格式命名。 转换对象类型的方法,如果返回不同类型的独立的对象,则称为toType ,个视图,则用asType,如果返回与被调用对象同值的原语类型,称为typeValue ,静态工厂的方法,常用valu
30、eOf或getInstance.,4.11接口优先于反射机制,反射机制java.lang.reflect,提供了“通过程序来访问关于已装载的类的信息”的能力。这些对象提供了“通过程序来访问类的成员名字、域类型、方法原型等信息”的能力。而且,Contructor、Method和Field实例使你能够维护它们的底层对等体(“反射到底层”):通过调用Constructor、Method和Field实例上的方法,你可以构造底层类的实例、调用底层类的方法、访问底层类中的域。反射机制允许一个类使用另一个类,即使当前者被编译的时候后者还根本不存在。然而,这种能力也需要付出代价:1、你损失了编译时类型检查的好
31、处,也包括异常检查。如果一个程序企图用反射方式调用一个不存在的方法,或者一个不可访问的方法,那么在运行时刻它将会失败,除非你采取了特别的预防措施。2、要求执行映像访问的代码非常笨拙和冗长。编写这样的代码非常乏味,阅读这样的代码也很困难。3、性能损失。通常,普通应用在运行时不应该以反射方式访问对象。如果只是在很有限的情况下使用反射机制,那么虽然也会付出少许代价,但你可以获得许多好处。对于有些程序,它们用到的类在编译时刻是不可用的,但是在编译时刻存在适当的接口或者超类,通过它们可以引用到这些类。如果是这种情况,那么你可以以反射方式创建实例,然后通过它们的接口或者超类,以正常方式访问这些实例。如果存在适当的构造函数不带参数,那么你甚至根本不需要使用java.lang.reflect包;Class.newInstance方法就已经提供了所需要的功能。一种合法使用反射的做法是,打破一个类对于其他类、方法或者域(它们在运行时刻可能不存在)的依赖性。如果你要编写一个包,它运行的时候需要依赖其他某个包的多个版本,那
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度绿色制造园区厂房场地租赁服务条款
- 2025版车辆抵押贷款担保经营合同
- 2025版新型城镇化安置房购买合同范本
- 二零二五年碧桂园酒店管理服务合同标准文本
- 二零二五版汽车广告宣传与赞助合作合同
- 农行信贷基础知识课件
- 二零二五年度安置房房票买卖合同备案登记服务协议
- 二零二五年高新技术企业常年法律顾问聘请合同范本
- 2025版个人汽车贷款合同模板(含二手车)
- 2025版摩托车抵押担保租赁合同
- 公选副科考试试题及答案
- 2025至2030高压氧舱行业市场深度调研及发展前景趋势与投融资报告
- 热控专业考试题库及答案
- 高龄卧床高危静脉血栓栓塞症防治中国专家共识解读 2
- 2025年中远海运集团招聘笔试备考题库(带答案详解)
- 2025至2030儿童安全椅市场发展趋势分析与未来投资战略咨询研究报告
- 酒精所致精神障碍护理查房
- 长期卧床患者的并发症与护理
- 水淹车培训课件
- 公路施工组织与概预算教学课件汇总整本书电子教案全套教学教程完整版电子教案(最新)
- 0上海市康复治疗质量控制中心推荐病史及记录单
评论
0/150
提交评论