当前位置:首页 » 软件开发
开发技术指南» 文章正文
    引言: 从Java 1.4开始提供的NIO APIMILY:
 

 

    摘要://求出e=1+1/1!+1/2!+1/3!+……+1/n!+……的近似值,要求误差小于0.0001import java.applet.*;import java.awt.*;import java.awt.event.*;public class at1_1 extends applet implements actionlistener......
    摘要:内容:java/j-integrate/#1">jsf 简介java/j-integrate/#2">为什么将这三者集成为一体?java/j-integrate/#3">将 struts 和 jsf 与 struts-faces 集成java/j-integrate/#4">将struts 应用程序移植到 jsfjava/j-integrate/#5">集成 struts-faces 和 tile......


Java网络服务器编程(NIO版)
从java 1.4开始提供的nio api常用于开发高性能网络服务器,本文演示了如何用这个api开发一个tcp echo server.

  【程序编程相关:static与final变量

【推荐阅读:J2se5.0 generis新特性

aspx">java网络服务器编程 一文演示了如何使用java的socket api编写一个简单的tcp echo server.其阻塞式io的处理方式虽然简单,但每个客户端都需要一个单独的thread来处理,当服务器需要同时处理大量客户端时,这种做法不再可行.使用nio api可以让一个或有限的几个thread同时处理连接到服务器上的所有客户端.(关于nio api的一些介绍,可以在aspx">java nio api详解一文中找到.)

【扩展信息:return和finally使用

 

nio api允许一个线程通过selector对象同时监控多个selectablechannel来处理多路io,nio应用程序一般按下图所示工作:

figure 1

 

如figure 1 所示,client一直在循环地进行select操作,每次select()返回以后,通过selectedkeys()可以得到需要处理的selectablechannel并对其一一处理.

 

这样做虽然简单但也有个问题,当有不同类型的selectablechannel需要做不同的io处理时,在图中client的代码就需要判断channel的类型然后再作相应的操作,这往往意味着一连串的if else.更糟糕的是,每增加一种新的channel,不但需要增加相应的处理代码,还需要对这一串if else进行维护.(在本文的这个例子中,我们有serversocketchannel与socketchannel这两种channel需要分别被处理.)

 

如果考虑将channel及其需要的io处理进行封装,抽象出一个统一的接口,就可以解决这一问题.在listing 1中的niosession就是这个接口.

 

niosession的channel()方法返回其封装的selectablechannel对象,interestops()返回用于这个channel注册的interestops.registered()是当selectablechannel被注册后调用的回调函数,通过这个回调函数,niosession可以得到channel注册后的selectionkey.process()函数则是niosession接口的核心,这个方法抽象了封装的selectablechannel所需的io处理逻辑.

 

listing 1:

public interface niosession {

 

    public selectablechannel channel();

   

    public int interestops();

   

    public void registered(selectionkey key);

   

    public void process();  

}

 

与niosession一起工作的是nioworker这个类(listing 2),它是niosession的调用者,封装了一个selector对象与figure 1中循环select操作的逻辑.理解这个类可以帮助我们了解该如何使用niosession这个接口.

 

nioworker实现了runnable接口,循环select操作的逻辑就在run()方法中.在nioworker – niosession这个框架中,niosession在channel注册的时候会被作为attachment送入register函数,这样,在每次select()操作的循环中,对于selectedkeys()中的每一个selectionkey,我们都可以通过attachment拿到其相对应的niosession然后调用其process()方法.

 

每次select()循环还有一个任务,就是将通过add()方法加入到这个nioworker的niosession注册到selector上.在listing 2的代码中可以看出,niosession中的channel()被取出并注册在selector上,注册所需的interestops从niosession中取出,niosession本身则作为attachment送入register()函数.注册成功后,niosession的registered()回调函数会被调用.

 

nioworker的add()方法的作用是将一个niosession加入到该nioworker中,并wakeup当前的select操作,这样在下一次的select()调用之前,这个niosession会被注册.stop()方法则是让一个正在run()的nioworker停止.closeallchannels()会关闭当前注册的所有channel,这个方法可在nioworker不再使用时用来释放io资源.

 

listing 2:

public class nioworker implements runnable {

   

    public nioworker(selector sel) {

       _sel = sel;


...   下一页
    摘要:使用junit进行测试junit是与eclipse一起提供的一个开源测试框架。在同一个project中,可以创建与其它class无异的“基于junit”的class,并使用此junit代码去测试project中的其它class。junit的此种使用方式能够为每位在此应用程序上工作的人员构建一组标准的测试。如果当更改了应用程序代码以后,他们所需做的工作仅仅是点击几下按钮来验证......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE