透明 发表于 2015-1-18 11:40:36

JAVA网站制作之Java I/O API之功能剖析 (下)

没有那个大公司会傻了吧唧用.net开发大型项目,开发了,那等于自己一半的生命线被微软握着呢。而.net不行,限制在window系统,又是捆绑,鄙视微软之!功能
4、注册与处置历程详解

  接上去我们要剖析Connection的register()办法。后面我们老是说用Selector注册的毗连,实在这是一种简化的说法。实践上,用Selector注册的是一个java.nio.channels.SocketChannel对象,但只针对特定的I/O操纵。注册以后,有一个java.nio.channels.SelectionKey被前往。这个选择键能够经由过程attach()办法联系关系就任意对象。为了经由过程键取得毗连,这里把Connection对象联系关系到键。如许,我们就能够从Selector直接地取得一个Connection。


  publicvoidregister(Selectorselector)
  throwsIOException{
  key=socketChannel.register(selector,SelectionKey.OP_READ);
  key.attach(this);
  }


  回过火来看ConnectionSelector。select()办法的前往值暗示有几毗连已做好了I/O操纵的筹办。假如前往值是0,则前往;不然,挪用selectedKeys()取得键的汇合(Set),从这些键取得之前联系关系的Connection对象,然后挪用其readRequest()或writeResponse()办法,详细挪用哪个办法由毗连被注册为读取操纵仍是写进操纵决意。

  如今再来看Connection类。Connection类代表着毗连,处置一切协定有关的细节。在机关函数中,经由过程参数传进的SocketChannel被设置成非堵塞形式,这关于服务器来讲是很主要的。别的,机关函数还设置了一些默许值,分派了缓冲区requestLineBuffer。因为分派间接缓冲区价值稍高,且这里的每个毗连都用一个新的缓冲区,因而这里利用java.nio.ByteBuffer.allocate()而不是ByteBuffer.allocateDirect()。假如重用缓冲区,间接缓冲区大概具有更高的效力。


  publicConnection(SocketChannelsocketChannel)
  throwsIOException{
  this.socketChannel=socketChannel;
  ...
  socketChannel.configureBlocking(false);
  requestLineBuffer=ByteBuffer.allocate(512);
  ...
  }


  完成一切初始化事情且SocketChannel做好了读取筹办以后,ConnectionSelector挪用了readRequest()办法,使用socketChannel.read(requestLineBuffer)办法把一切可用的数据读进缓冲区。假如不克不及读取完全的行,则前往收回挪用的ConnectionSelector,同意另外一个毗连进进处置历程;反之,假如乐成地读取了全部行,接上去应当做的是象在Httpd中一样剖析哀求。假如以后的哀求正当,程序为哀求方针文件创立一个java.nio.Channels.FileChannel,并挪用prepareForResponse()办法。


  privatevoidprepareForResponse()throwsIOException{
  StringBufferresponseLine=newStringBuffer(128);
  ...
  responseLineBuffer=ByteBuffer.wrap(
  responseLine.toString().getBytes("ASCII")
  );
  key.interestOps(SelectionKey.OP_WRITE);
  key.selector().wakeup();
  }

prepareForResponse()办法机关出缓冲区responseLine和(假如需要的话)应对头或毛病信息,并把这些数据写进responseLineBuffer。这个ByteBuffer是一个byte数组的复杂的封装器。天生待输入的数据以后,我们还要关照ConnectionSelector:从如今入手下手不再读取数据,而是要写进数据了。这个关照经由过程挪用选择键的interestedOps(SelectionKey.OP_WRITE)办法完成。为了包管选择器可以敏捷熟悉到毗连操纵形态的变更,接着还要挪用wakeup()办法。接上去ConnectionSelector挪用毗连的writeResponse()办法。起首,responseLineBuffer被写进到Socket管道。假如缓冲区的内容全体被写进,并且另有被哀求的文件必要发送,接着挪用后面翻开的FileChannel的transferTo()办法。transferTo()办法一般可以高效地把数据从文件传输到管道,但实践的传输效力依附于底层的操纵体系。任什么时候候,被传输的数据量最多相称于在无堵塞的情形下可写进方针管道的数据量。为平安和确保各个毗连之间的公允起见,这里把下限设置成64KB。

  假如一切数据都已传输终了,close()实行清算事情。作废Connection的注册是这里的次要义务,详细经由过程挪用键的cancel()办法完成。


  publicvoidclose(){
  ...
  if(key!=null)key.cancel();
  ...
  }


  这个新的计划功能怎样呢?谜底是一定的。从道理上看,一个Acceptor和一个ConnectionSelector足以撑持恣意数目的翻开的毗连。因而,新的完成计划在可伸缩性方面占据上风。可是,因为两个线程必需经由过程同步的queue()办法通讯,它们大概相互堵塞对方。办理这个成绩有两种路子:

  ・改善完成行列的办法
  ・接纳多个Acceptor/ConnectionSelector对

  与Httpd比拟,NIOHttpd的一个弱点是,关于每个哀求,就有一个新的带缓冲的Connection对象被创立。这就招致了渣滓搜集器发生的分外的CPU占用,这部分附加价值的详细水平又与VM的范例有关。但是,Sun诲人不倦地夸大说,有了Hotspot,短时间保存的对象不再成为成绩。

  5、可伸缩性的定量剖析和对照

  在可伸缩性方面,NIOHttpd究竟比Httpd很多多少少?上面我们来看看详细的数字。起首要声明的是,这里的数字具有大批的推想成份,一些主要的情况要素,比方线程同步、高低文切换、换页、硬盘速率弛缓冲等,都没有思索到。起首评价处置r个并发的哀求必要几工夫,假定被哀求的文件巨细是s字节,客户真个带宽是b字节/秒。关于Httpd,这个工夫明显间接依附于线程的数目t,由于统一时候只能处置t个哀求。以是Httpd的处置工夫能够从公式一失掉,个中c是实行哀求剖析之类操纵的开支常量,这个值关于每个哀求来讲都是一样的。别的,这里假定从磁盘读取数据的速率老是快于写进Socket的速率,服务器带宽老是年夜于客户机带宽之和,且CPU未满载。因而,服务器真个带宽、缓冲和硬盘速率等要素都不用在该公式中思索。


但是,NIOHttpd的处置工夫不再依附于t。关于NIOHttpd,传输工夫l在很年夜水平上依附于客户真个带宽b、文件巨细s和后面提到的常数c。由此能够得出公式二,从该公式能够失掉NIOHttpd的最小传输工夫。

注重公式三的比值d,它器度了NIOHttpd和Httpd的功能对照干系。

进一步的剖析标明,假如s、b、t和c是常数,r趋势无量时d的增加趋势于一个极限,从公式四能够便利地盘算出这个极限。

因而,除线程的数目和常量性的开支,毗连的时长s/b对d具有极度主要的影响。毗连延续的工夫越长,d值越小,NIOHttpd对照Httpd的上风也就越高。表一显现出,当c=10ms,t=100,s=1mb,b=8kb/s时,NIOHttpd要比Httpd快126倍。假如毗连延续了很长一段工夫,NIOHttpd体现出伟大的上风。当毗连工夫较短时,比方在100Mb的局域网内,假如文件较年夜,NIOHttpd体现出10%的上风;假如文件较小,上风不分明。


你总不能说你写框架吧,那无疑会加大工作量,现在大多企业采取的是折中的办法,就是改别人写好的框架,可要改框架,前提是你对这个框架足够的了解,这就更难了。

灵魂腐蚀 发表于 2015-1-21 12:35:13

接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。

分手快乐 发表于 2015-1-26 05:05:46

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

若相依 发表于 2015-1-29 19:43:00

自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。

精灵巫婆 发表于 2015-2-1 05:12:28

是一种将安全性(Security)列为第一优先考虑的语言

海妖 发表于 2015-2-3 17:38:47

任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言

乐观 发表于 2015-2-5 04:38:33

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

小女巫 发表于 2015-2-5 20:00:12

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

再见西城 发表于 2015-2-7 09:30:51

《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。

admin 发表于 2015-2-21 11:09:55

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

只想知道 发表于 2015-3-3 04:08:49

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

老尸 发表于 2015-3-11 06:12:22

如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。

山那边是海 发表于 2015-3-17 22:09:26

不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。

小魔女 发表于 2015-3-24 11:18:53

还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。

飘飘悠悠 发表于 2015-4-20 20:14:41

一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从

再现理想 发表于 2015-5-1 17:12:01

Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。

莫相离 发表于 2015-6-6 19:37:39

Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)

冷月葬花魂 发表于 2015-6-11 15:32:53

是一种使网页(Web Page)产生生动活泼画面的语言

仓酷云 发表于 2015-6-12 05:04:59

Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台

简单生活 发表于 2015-6-28 21:13:03

你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
页: [1]
查看完整版本: JAVA网站制作之Java I/O API之功能剖析 (下)