<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>lcllcl987</title>
    <description>热爱java，热爱J2EE</description>
    <link>http://lcllcl987.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>EJB2.1 &amp; EJB3.0: Timer Service三部曲</title>
        <author>lcllcl987</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lcllcl987.javaeye.com">lcllcl987</a>&nbsp;
          链接：<a href="http://lcllcl987.javaeye.com/blog/147827" style="color:red;">http://lcllcl987.javaeye.com/blog/147827</a>&nbsp;
          发表时间: 2007年12月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">对于J2EE中的调度任务, 在ejb2.1推出前, 似乎只能采用一些非常途径:比如在servlet中new一个Timer.<br />
我们急切的需要EJB的标准实现.<br />
最近我们就遇到了这样的需求. 还好websphere升级到了6.0, 支持ejb2.1规范,在ejb2.1标准中, 提供了一个Timer Service的标准实现.<br />
要实现Timer Service, 通常的做法就是让一个无状态sessionbean实现TimedObject接口.</font><font face="Arial"></font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">interface</span><span>&nbsp;TimedObject{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbTimeout(Timer&nbsp;timer); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>一个最简单的Timer Service如下(由一个无状态sessionbean实现, home和local接口省略)<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DemoTimerServiceBean&nbsp;</span><span class="keyword">implements</span><span>&nbsp;javax.ejb.SessionBean,&nbsp;TimedObject&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;javax.ejb.SessionContext&nbsp;mySessionCtx; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;getSessionContext </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;javax.ejb.SessionContext&nbsp;getSessionContext()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;mySessionCtx; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;setSessionContext </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setSessionContext(javax.ejb.SessionContext&nbsp;ctx)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;mySessionCtx&nbsp;=&nbsp;ctx; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbCreate </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbCreate()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;javax.ejb.CreateException&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbActivate </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbActivate()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbPassivate </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbPassivate()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbRemove </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbRemove()&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startTimer() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;TimerService&nbsp;ts=</span><span class="keyword">this</span><span>.getSessionContext().getTimerService(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;ts.createTimer(</span><span class="keyword">new</span><span>&nbsp;Date(),&nbsp;</span><span class="number">1000</span><span>,&nbsp;</span><span class="string">&quot;timerInfo&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/*&nbsp;(non-Javadoc) </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;@see&nbsp;javax.ejb.TimedObject#ejbTimeout(javax.ejb.Timer) </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbTimeout(Timer&nbsp;arg0)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;implements&nbsp;your&nbsp;business&nbsp;logic. </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;process&nbsp;your&nbsp;business&nbsp;logic&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;TaskHandler.process(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>其中startTimer()用来启动一个调度任务,当调度任务的timeout时间到来时, ejb容器回调ejbTimeout()方法.以上示例子每隔一秒执行一次ejbTimeout()方法.<br />
需要注意的是, timer service的启动需要客户调用startTimer()方法; 并且timer service具有持久化特性, 也就是说: 如果一个timer service已经启动, 如果<br />
服务器重新启动了, 这个timer service会继续执行(无须再次调用startTimer()方法).<br />
其实我们可以把startTimer()方法放在ejbCreate(), 当ejb实例化的时候就启动调度. 但这需要修改一下启动调度的策略. 因为容器会根据需要调用sessionbean的<br />
create()方法, 如果每实例化一个sessionbean,就产生一个新调度, 这显然不是我们需要的.<br />
所以,修改的策略为:<br />
如果已经有一个同名的timer service了, 就放弃, 否则产生一个新timer service.<br />
</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startTimer() &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;TimerService&nbsp;ts=</span><span class="keyword">this</span><span>.getSessionContext().getTimerService(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;Iterator&nbsp;timers&nbsp;=&nbsp;ts.getTimers().iterator(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">while</span><span>(timers.hasNext()) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;(Timer)timers.next(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;String&nbsp;info&nbsp;=&nbsp;(String)timer.getInfo(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;timer&nbsp;info&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;info); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(info.equals(</span><span class="string">&quot;timerInfo&quot;</span><span>)) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;there&nbsp;is&nbsp;already&nbsp;a&nbsp;timer&nbsp;=&nbsp;timerInfo,&nbsp;so&nbsp;return&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;ts.createTimer(</span><span class="keyword">new</span><span>&nbsp;Date(),&nbsp;</span><span class="number">1000</span><span>,&nbsp;</span><span class="string">&quot;timerInfo&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>贴一个完整的timer service实现供有需要的人参考, 包括启动, 停止timer service(由一个无状态sessionbean实现, home和local接口省略)</p>
<div class="code_title">java 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;DemoTimerServiceBean&nbsp;</span><span class="keyword">implements</span><span>&nbsp;javax.ejb.SessionBean,&nbsp;TimedObject&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;CONGIG_BEAN_NAME&nbsp;=&nbsp;</span><span class="string">&quot;configBean&quot;</span><span>;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;javax.ejb.SessionContext&nbsp;mySessionCtx; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;getSessionContext </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;javax.ejb.SessionContext&nbsp;getSessionContext()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;mySessionCtx; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;setSessionContext </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setSessionContext(javax.ejb.SessionContext&nbsp;ctx)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;mySessionCtx&nbsp;=&nbsp;ctx; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbCreate </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbCreate()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;javax.ejb.CreateException&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbActivate </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbActivate()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbPassivate </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbPassivate()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;ejbRemove </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbRemove()&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;stopAllTimer() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;TimerService&nbsp;ts=</span><span class="keyword">this</span><span>.getSessionContext().getTimerService(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;Iterator&nbsp;timers&nbsp;=&nbsp;ts.getTimers().iterator(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">while</span><span>(timers.hasNext()) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;(Timer)timers.next(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;timer.cancel(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;stopTimer(String&nbsp;timerName) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;TimerService&nbsp;ts=</span><span class="keyword">this</span><span>.getSessionContext().getTimerService(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;Iterator&nbsp;timers&nbsp;=&nbsp;ts.getTimers().iterator(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">while</span><span>(timers.hasNext()) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;(Timer)timers.next(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;String&nbsp;info&nbsp;=&nbsp;(String)timer.getInfo(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;timer&nbsp;info&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;info); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(info.equals(timerName)) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;there&nbsp;is&nbsp;already&nbsp;a&nbsp;timer&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;timerName&nbsp;+&nbsp;</span><span class="string">&quot;,&nbsp;so&nbsp;we&nbsp;cancel&nbsp;it!&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;timer.cancel(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;ArrayList&nbsp;getAllTimerInfo() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;ArrayList&nbsp;timerList&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;TimerService&nbsp;ts=</span><span class="keyword">this</span><span>.getSessionContext().getTimerService(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;Iterator&nbsp;timers&nbsp;=&nbsp;ts.getTimers().iterator(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">while</span><span>(timers.hasNext()) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;(Timer)timers.next(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;String&nbsp;info&nbsp;=&nbsp;(String)timer.getInfo(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;timerList.add(info);&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;timerList; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;startTimer() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;Object&nbsp;configobj&nbsp;=&nbsp;MyBeanFactory.instance().getBean(CONGIG_BEAN_NAME); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(configobj&nbsp;==&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Can't&nbsp;get&nbsp;configBean&nbsp;from&nbsp;spring&nbsp;config&nbsp;file.&nbsp;config&nbsp;==&nbsp;null&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;Config&nbsp;config&nbsp;=&nbsp;(Config)configobj; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;interval&nbsp;=&nbsp;config.getInterval(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;String&nbsp;timerInfo&nbsp;=&nbsp;config.getTimerInfo(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">this</span><span>.stopTimer(timerInfo); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;start&nbsp;a&nbsp;timer&nbsp;and&nbsp;info&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;timerInfo&nbsp;+&nbsp;</span><span class="string">&quot;,&nbsp;interval&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;interval); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;TimerService&nbsp;ts=</span><span class="keyword">this</span><span>.getSessionContext().getTimerService(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;Timer&nbsp;timer&nbsp;=&nbsp;ts.createTimer(</span><span class="keyword">new</span><span>&nbsp;Date(),&nbsp;interval,&nbsp;timerInfo);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/*&nbsp;(non-Javadoc) </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;@see&nbsp;javax.ejb.TimedObject#ejbTimeout(javax.ejb.Timer) </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;ejbTimeout(Timer&nbsp;arg0)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;in&nbsp;ejbTimeout&nbsp;now.&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;TaskHandler.process(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
<p><font face="Arial"></font>&nbsp;</p>
<p><font face="Arial"></font>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lcllcl987.javaeye.com/blog/147827#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 12 Dec 2007 15:39:19 +0800</pubDate>
        <link>http://lcllcl987.javaeye.com/blog/147827</link>
        <guid>http://lcllcl987.javaeye.com/blog/147827</guid>
      </item>
      <item>
        <title>纯java 的javascript引擎：rhino </title>
        <author>lcllcl987</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lcllcl987.javaeye.com">lcllcl987</a>&nbsp;
          链接：<a href="http://lcllcl987.javaeye.com/blog/87423" style="color:red;">http://lcllcl987.javaeye.com/blog/87423</a>&nbsp;
          发表时间: 2007年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">前段时间，在浏览javaeye论坛，看见有人征集如何在java中运行数学表达式。<br />
结果方案五花八门：<br />
1.jakarta commons JEXL. <br />
2.Beanshell<br />
3.Java Math Expression Parser jep <br />
4.parse combinator jparsec <br />
5.jdk 6.0的 script<br />
6.利用SQL <br />
7.自己写语法分析<br />
如果自己写语法分析，没有个2000行估计搞不定。有人用sql来运行数学表达式，比较另类。<br />
不过由于前段时间较深入的学习了一些java的javascript引擎，我给出的方案就是用javascript来计算了。<br />
java中比较著名的js引擎当属mozilla开源的rhino，不过jdk6已经把它收归帐下，成了正规军。<br />
</font><font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MathEval &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;cx&nbsp;=&nbsp;Context.enter(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scriptable&nbsp;scope&nbsp;=&nbsp;cx.initStandardObjects(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;</span><span class="string">&quot;9*(1+2)&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;cx.evaluateString(scope,&nbsp;str,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;</span><span class="number">1</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">double</span><span>&nbsp;res&nbsp;=&nbsp;Context.toNumber(result); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(res); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">finally</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context.exit(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>下面总结一下前段时间学习rhino的心得（给自己的程序添加脚本功能，其实是很酷的）：</p>
<p><font face="Arial">一：环境配置及运行js脚本：<br />
在 http://www.mozilla.org/rhino/ 下载rhino：<br />
把js.jar加入系统CLASSPATH中<br />
可以以交互模式调用js解释器：<br />
java org.mozilla.javascript.tools.shell.Main<br />
然后您应该会看到解释器的版本号，后面跟着提示符 js&gt; <br />
用法如下：<br />
比如：有一个js文件：<br />
D:\eclipse-workshop\rhinoExample\src\isPrime.js<br />
内容如下：<br />
</font></p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;isPrime&nbsp;(num) &nbsp;&nbsp;</span></span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(num&nbsp;&lt;=&nbsp;1)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(</span><span class="string">&quot;Please&nbsp;enter&nbsp;a&nbsp;positive&nbsp;integer&nbsp;&gt;=&nbsp;2.&quot;</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;prime&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;sqrRoot&nbsp;=&nbsp;Math.round(Math.sqrt(num)) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;n&nbsp;=&nbsp;2;&nbsp;prime&nbsp;&amp;&nbsp;n&nbsp;&lt;=&nbsp;sqrRoot;&nbsp;++n)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prime&nbsp;=&nbsp;(num&nbsp;%&nbsp;n&nbsp;!=&nbsp;0) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;prime &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><br />
如何运行呢：<br />
1：在命令行下键入：<br />
java org.mozilla.javascript.tools.shell.Main<br />
2：在js〉下键入：<br />
load(&quot;D:/eclipse-workshop/rhinoExample/src/isPrime.js&quot;);<br />
注意：是&ldquo;/&rdquo;而不是&ldquo;\&rdquo;<br />
3:键入：<br />
isPrime(77);<br />
可看见返回结果为false。<br />
键入：<br />
isPrime(71);返回true</p>
<p><font face="Arial">再给个例子，脚本如下：</font><font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>person&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;name:</span><span class="string">&quot;Mike&nbsp;Squillace&quot;</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;age:37, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;position:</span><span class="string">&quot;software&nbsp;engineer&quot;</span><span>, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;getFirstName:</span><span class="keyword">function</span><span>&nbsp;()&nbsp;{</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.name.split(</span><span class="string">&quot;&nbsp;&quot;</span><span>)[0]} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>person.getFirstName()&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>js产生swing的例子：<br />
load(&quot;D:/eclipse-workshop/rhinoExample/src/SwingApplication.js&quot;);<br />
怎么样？看见效果没？是不是很强悍？其中SwingApplication.js是rhnio自带的例子。</p>
<font face="Arial">
<p><br />
Rhino还有一个js脚本的调试器：<br />
Rhino JavaScript Debugger:<br />
java org.mozilla.javascript.tools.debugger.Main [options] [filename.js] [script-arguments]</p>
<p>只须运行java org.mozilla.javascript.tools.debugger.Main，就可以看到调试器的界面了。</p>
<p><br />
为了加快js文件运行的速度，可以把它编译为class文件：<br />
compile:<br />
java org.mozilla.javascript.tools.jsc.Main D:/eclipse-workshop/rhinoExample/src/FirstCompile.js<br />
编译产生FirstCompile.class文件<br />
在D:/eclipse-workshop/rhinoExample/src/下运行该class文件：<br />
java FirstCompile</p>
<p>二：在实际应用中不可避免的需要遇到java代码如何和javascript脚本相互访问的问题：<br />
这是一个最简单的例子：(liveConnect.js是rhnio自带的例子)：<br />
load(&quot;D:/eclipse-workshop/rhinoExample/src/liveConnect.js&quot;);</p>
<p>在给个复杂点的例子, 没有什么逻辑，纯技术展示，呵呵：<br />
JSFunction.java:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;co.test; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.mozilla.javascript.Function; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;JSFunction&nbsp;&nbsp;</span><span class="comment">//extends&nbsp;ScriptableObject </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;name;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">private</span><span>&nbsp;Function&nbsp;handle; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setHandler(Function&nbsp;func) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">this</span><span>.handle&nbsp;=&nbsp;func; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;Function&nbsp;getHandler() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">this</span><span>.handle; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;JSFunction(String&nbsp;s) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name&nbsp;=&nbsp;s; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;print(String&nbsp;s) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;System.out.println(s); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setName(String&nbsp;name)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name&nbsp;=&nbsp;name; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>JSExploration.java:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;co.test; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.FileReader; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.LineNumberReader; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.mozilla.javascript.Context; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;org.mozilla.javascript.Function; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;org.mozilla.javascript.Scriptable; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;JSExploration &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Context&nbsp;cx; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Scriptable&nbsp;scope; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;JSExploration() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.cx&nbsp;=&nbsp;Context.enter(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.scope&nbsp;=&nbsp;cx.initStandardObjects(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Object&nbsp;runJavaScript(String&nbsp;filename) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;jsContent&nbsp;=&nbsp;</span><span class="keyword">this</span><span>.getJsContent(filename); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;cx.evaluateString(scope,&nbsp;jsContent,&nbsp;filename,&nbsp;</span><span class="number">1</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;result; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;getJsContent(String&nbsp;filename) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LineNumberReader&nbsp;reader; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;LineNumberReader(</span><span class="keyword">new</span><span>&nbsp;FileReader(filename)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;s&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;((s&nbsp;=&nbsp;reader.readLine())&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(s).append(</span><span class="string">&quot;\n&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;sb.toString(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Scriptable&nbsp;getScope() &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;scope; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filename&nbsp;=&nbsp;System.getProperty(</span><span class="string">&quot;user.dir&quot;</span><span>)&nbsp;+&nbsp;</span><span class="string">&quot;/jsmap.js&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSExploration&nbsp;jsExploration&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;JSExploration(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;=&nbsp;jsExploration.runJavaScript(filename); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scriptable&nbsp;scope&nbsp;=&nbsp;jsExploration.getScope(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scriptable&nbsp;obj&nbsp;=&nbsp;(Scriptable)&nbsp;scope.get(</span><span class="string">&quot;obj&quot;</span><span>,&nbsp;scope); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;obj.a&nbsp;==&nbsp;&quot;</span><span>&nbsp;+&nbsp;obj.get(</span><span class="string">&quot;a&quot;</span><span>,&nbsp;obj)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scriptable&nbsp;b&nbsp;=&nbsp;(Scriptable)&nbsp;obj.get(</span><span class="string">&quot;b&quot;</span><span>,&nbsp;obj); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;b[0]&nbsp;==&nbsp;&quot;</span><span>&nbsp;+&nbsp;b.get(</span><span class="number">0</span><span>,&nbsp;b)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean&nbsp;flag&nbsp;=&nbsp;(Boolean)&nbsp;scope.get(</span><span class="string">&quot;flag&quot;</span><span>,&nbsp;scope); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(flag); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scriptable&nbsp;myobj&nbsp;=&nbsp;(Scriptable)&nbsp;scope.get(</span><span class="string">&quot;obj&quot;</span><span>,&nbsp;scope); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Boolean&nbsp;myflag&nbsp;=&nbsp;(Boolean)&nbsp;scope.get(</span><span class="string">&quot;flag&quot;</span><span>,&nbsp;scope); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(myflag); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Scriptable&nbsp;jsFunction&nbsp;=&nbsp;(Scriptable)&nbsp;scope.get(</span><span class="string">&quot;jsFunction&quot;</span><span>,&nbsp;scope); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function&nbsp;fc&nbsp;=&nbsp;(Function)&nbsp;jsFunction.get(</span><span class="string">&quot;handler&quot;</span><span>,&nbsp;jsFunction); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;isPrime&nbsp;=&nbsp;fc.call(Context.getCurrentContext(),&nbsp;jsFunction,&nbsp;fc,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Object[]&nbsp;{&nbsp;</span><span class="string">&quot;this&nbsp;is&nbsp;my&nbsp;test&quot;</span><span>&nbsp;}); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>js脚本：jsmap.js</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;swingNames&nbsp;=&nbsp;JavaImporter(); &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>swingNames.importPackage(Packages.java.lang); &nbsp;&nbsp;</span></li>
    <li class=""><span>swingNames.importPackage(Packages.co.test); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>obj&nbsp;=&nbsp;{a:1,&nbsp;b:['x','y']} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>next&nbsp;=&nbsp;isPrime &nbsp;&nbsp;</span></li>
    <li class=""><span>flag&nbsp;=&nbsp;isPrime(5) &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">with</span><span>&nbsp;(swingNames)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;System.out.println(</span><span class="string">&quot;in&nbsp;javascript&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;JSFunction.print(</span><span class="string">&quot;in&nbsp;JSFunction&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;jsFunction&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;JSFunction(</span><span class="string">&quot;lichunlei&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">var</span><span>&nbsp;name&nbsp;=&nbsp;jsFunction.getName(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;System.out.println(</span><span class="string">&quot;get&nbsp;name&nbsp;from&nbsp;java&nbsp;source:&nbsp;&quot;</span><span>&nbsp;+&nbsp;name); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;jsFunction.setHandler(log);&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>java.lang.System.out.println(</span><span class="string">&quot;not&nbsp;use&nbsp;swingNames&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">function</span><span>&nbsp;isPrime&nbsp;(num) &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;java.lang.System.out.println(</span><span class="string">&quot;in&nbsp;isPrime(num)&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(num&nbsp;&lt;=&nbsp;1)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.lang.System.out.println(</span><span class="string">&quot;Please&nbsp;enter&nbsp;a&nbsp;positive&nbsp;integer&nbsp;&gt;=&nbsp;2.&quot;</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;prime&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;sqrRoot&nbsp;=&nbsp;Math.round(Math.sqrt(num)) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">var</span><span>&nbsp;n&nbsp;=&nbsp;2;&nbsp;prime&nbsp;&amp;&nbsp;n&nbsp;&lt;=&nbsp;sqrRoot;&nbsp;++n)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prime&nbsp;=&nbsp;(num&nbsp;%&nbsp;n&nbsp;!=&nbsp;0) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;prime &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">function</span><span>&nbsp;log(msg) &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;java.lang.System.out.println(</span><span class="string">&quot;in&nbsp;function&nbsp;log:&nbsp;&quot;</span><span>&nbsp;+&nbsp;msg); &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
</font></font></p>
<div class="code_title">js 代码</div>
</font></p>
<div class="code_title">java 代码</div>
          <br/>
          <span style="color:red;">
            <a href="http://lcllcl987.javaeye.com/blog/87423#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 06 Jun 2007 17:53:38 +0800</pubDate>
        <link>http://lcllcl987.javaeye.com/blog/87423</link>
        <guid>http://lcllcl987.javaeye.com/blog/87423</guid>
      </item>
      <item>
        <title>采用 ajax + vml 生成柱状图报表</title>
        <author>lcllcl987</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lcllcl987.javaeye.com">lcllcl987</a>&nbsp;
          链接：<a href="http://lcllcl987.javaeye.com/blog/80629" style="color:red;">http://lcllcl987.javaeye.com/blog/80629</a>&nbsp;
          发表时间: 2007年05月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">备份一个有意思的小东西：动态柱状图,采用ajax + vml。<br />
vml是微软在IE5中就支持的矢量图技术。采用xml的格式来生成矢量图，这为我们在页面上生成高质量的图像提供了<br />
很好的支持。另：虽然SVG很好，但IE不支持（不安装插件的话）。<br />
程序很简单：<br />
一个servlet：采集数据（仅仅随机产生一个数组）。<br />
一个html页面：采用ajax从servlet得到数据，然后用vml生成图表。由于采用了ajax，页面是不刷新的实时得到数据。</font></p>
<p><font face="Arial">1: servlet：PingServlet.java</font><font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">package</span><span>&nbsp;co.vml.servlet; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.PrintWriter; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.ServletException; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServlet; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletRequest; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;javax.servlet.http.HttpServletResponse; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;@version&nbsp;&nbsp;1.0 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@author </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;PingServlet&nbsp;</span><span class="keyword">extends</span><span>&nbsp;HttpServlet &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/**&nbsp;Handles&nbsp;the&nbsp;HTTP&nbsp;&lt;code&gt;GET&lt;/code&gt;&nbsp;method. </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;@param&nbsp;request&nbsp;servlet&nbsp;request </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;@param&nbsp;response&nbsp;servlet&nbsp;response </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException,&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;String&nbsp;task&nbsp;=&nbsp;request.getParameter(</span><span class="string">&quot;task&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;StringBuffer&nbsp;resBuf&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(task.equals(</span><span class="string">&quot;poll&quot;</span><span>))&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;</span><span class="number">6</span><span>;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">long</span><span>&nbsp;counter&nbsp;=&nbsp;Math.round(Math.random()*</span><span class="number">10</span><span>)&nbsp;+&nbsp;</span><span class="number">1</span><span>;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;System.out.println(i&nbsp;+&nbsp;</span><span class="string">&quot;--&quot;</span><span>&nbsp;+&nbsp;counter); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;resBuf.append(</span><span class="string">&quot;&lt;percent&gt;&quot;</span><span>&nbsp;+&nbsp;counter&nbsp;+&nbsp;</span><span class="string">&quot;&lt;/percent&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;=&nbsp;response.getWriter(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;response.setContentType(</span><span class="string">&quot;text/xml&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;response.setHeader(</span><span class="string">&quot;Cache-Control&quot;</span><span>,&nbsp;</span><span class="string">&quot;no-cache&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;out.println(</span><span class="string">&quot;&lt;response&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;out.println(resBuf.toString()); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;out.println(</span><span class="string">&quot;&lt;/response&gt;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;out.close(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="comment">/**&nbsp;Handles&nbsp;the&nbsp;HTTP&nbsp;&lt;code&gt;POST&lt;/code&gt;&nbsp;method. </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*&nbsp;@param&nbsp;request&nbsp;servlet&nbsp;request </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*&nbsp;@param&nbsp;response&nbsp;servlet&nbsp;response </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">protected</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;doPost(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">throws</span><span>&nbsp;ServletException,&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;doGet(request,&nbsp;response); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="comment">/**&nbsp;Returns&nbsp;a&nbsp;short&nbsp;description&nbsp;of&nbsp;the&nbsp;servlet. </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getServletInfo()&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;</span><span class="string">&quot;Short&nbsp;description&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>2: html页面(ajax + vml)</p>
<div class="code_title">js 代码</div>
</font><font face="Arial">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;HTML&nbsp;xmlns:v&gt; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&lt;HEAD&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;META&nbsp;http-equiv=</span><span class="string">&quot;Content-Type&quot;</span><span>&nbsp;content=</span><span class="string">&quot;text/html;&nbsp;Charset=gb2312&quot;</span><span>&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;STYLE&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>td&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;font-size:&nbsp;12px &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>body&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;font-size:&nbsp;12px &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>v\:&nbsp;*{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;behavior:&nbsp;url(#</span><span class="keyword">default</span><span>#VML); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;/STYLE&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;/HEAD&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;script&gt;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">var</span><span>&nbsp;xmlHttp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">function</span><span>&nbsp;createXMLHttpRequest()&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(window.ActiveXObject)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHttp&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActiveXObject(</span><span class="string">&quot;Microsoft.XMLHTTP&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(window.XMLHttpRequest)&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlHttp&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;XMLHttpRequest();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">function</span><span>&nbsp;go()&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;setTimeout(</span><span class="string">&quot;pollServer()&quot;</span><span>,&nbsp;2000); &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">function</span><span>&nbsp;pollServer()&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;createXMLHttpRequest(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;url&nbsp;=&nbsp;</span><span class="string">&quot;../PingServlet?task=poll&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;xmlHttp.open(</span><span class="string">&quot;GET&quot;</span><span>,&nbsp;url,&nbsp;</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;xmlHttp.onreadystatechange&nbsp;=&nbsp;pollCallback; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;xmlHttp.send(</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">function</span><span>&nbsp;pollCallback()&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(xmlHttp.readyState&nbsp;==&nbsp;4)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(xmlHttp.status&nbsp;==&nbsp;200)&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;array1&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Array(6); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(i&nbsp;=&nbsp;0;i&nbsp;&lt;&nbsp;6;i++) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;array1[i]&nbsp;=&nbsp;parseInt(xmlHttp.responseXML.getElementsByTagName(</span><span class="string">&quot;percent&quot;</span><span>)[i].firstChild.data); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;array2=</span><span class="keyword">new</span><span>&nbsp;Array(16,14,10,16,5,8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;draw(array1); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;setTimeout(</span><span class="string">&quot;pollServer()&quot;</span><span>,&nbsp;2000);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">function</span><span>&nbsp;draw(array1) &nbsp;&nbsp;</span></li>
    <li class=""><span>{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;allstr=array1[0]&nbsp;+&nbsp;array1[1]&nbsp;+&nbsp;array1[2]&nbsp;+&nbsp;array1[3]&nbsp;+&nbsp;array1[4]&nbsp;+&nbsp;array1[5]; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;</span><span class="keyword">var</span><span>&nbsp;str&nbsp;=&nbsp;</span><span class="string">&quot;&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">for</span><span>(i=0;i&lt;=5;i++) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;{&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;mathstr=Math.round(100/(allstr/array1[i])) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;str&nbsp;=&nbsp;str&nbsp;+&nbsp;</span><span class="string">&quot;&lt;v:rect&nbsp;fillcolor='lime'&nbsp;style='width:20;color:navy;height:&quot;</span><span>&nbsp;+&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5000/(1000/mathstr)+</span><span class="string">&quot;'&gt;&lt;br&gt;&amp;nbsp;%&quot;</span><span>&nbsp;+ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mathstr&nbsp;+&nbsp;</span><span class="string">&quot;&lt;br&gt;&quot;</span><span>&nbsp;+&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array1[i]+</span><span class="string">&quot;&lt;v:Extrusion&nbsp;backdepth='15pt'&nbsp;on='true'/&gt;&lt;/v:rect&gt;&quot;</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;}&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;</span><span class="keyword">var</span><span>&nbsp;myDraw&nbsp;=&nbsp;document.getElementById(</span><span class="string">&quot;mydiv&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;myDraw.innerHTML&nbsp;=&nbsp;str; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;/script&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;body&nbsp;bgcolor=eeeeee&nbsp;style='border:&nbsp;0&nbsp;solid&nbsp;eeeeee'&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;input&nbsp;id&nbsp;=&nbsp;</span><span class="string">&quot;go&quot;</span><span>&nbsp;name=</span><span class="string">&quot;run&quot;</span><span>&nbsp;type=</span><span class="string">&quot;button&quot;</span><span>&nbsp;value=</span><span class="string">&quot;run&quot;</span><span>&nbsp;onClick=</span><span class="string">&quot;go();&quot;</span><span>&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;div&nbsp;width=</span><span class="string">&quot;900&quot;</span><span>&nbsp;id&nbsp;=&nbsp;</span><span class="string">&quot;mydiv&quot;</span><span>&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;/div&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;/BODY&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;/HTML&gt; &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>&nbsp;</p>
</font>&nbsp;</p>
<div class="code_title">java 代码</div>
          <br/>
          <span style="color:red;">
            <a href="http://lcllcl987.javaeye.com/blog/80629#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 17 May 2007 16:28:35 +0800</pubDate>
        <link>http://lcllcl987.javaeye.com/blog/80629</link>
        <guid>http://lcllcl987.javaeye.com/blog/80629</guid>
      </item>
      <item>
        <title>nio socket 及其开源框架MINA学习总结(二)</title>
        <author>lcllcl987</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lcllcl987.javaeye.com">lcllcl987</a>&nbsp;
          链接：<a href="http://lcllcl987.javaeye.com/blog/70708" style="color:red;">http://lcllcl987.javaeye.com/blog/70708</a>&nbsp;
          发表时间: 2007年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><strong>3：Socket网络框架 MINA</strong><br />
MINA是一个网络应用框架，在不牺牲性能和可扩展性的前提下用于解决如下问题：<br />
1：快速开发自己的英勇。<br />
2：高可维护性，高可复用性：网络I/O编码，消息的编/解码，业务逻辑互相分离。<br />
3：相对容易的进行单元测试。</font></p>
<p><font face="Arial">3.1 IoFilters：<br />
IoFilter为MINA的功能扩展提供了接口。它拦截所有的IO事件进行事件的预处理和后处理(AOP)。我们可以把它想象成<br />
Servlet的filters。<br />
IoFilter能够实现以下几种目的：<br />
事件日志<br />
性能检测<br />
数据转换(e.g. SSL support)，codec<br />
防火墙&hellip;等等 </font></p>
<p><font face="Arial">3.2 codec: ProtocolCodecFactory<br />
MINA提供了方便的Protocol支持。如上说讲，codec在IoFilters中设置。<br />
通过它的Encoder和Decoder，可以方便的扩展并支持各种基于Socket的网络协议，比如HTTP服务器、FTP服务器、Telnet服务器等等。</font></p>
<p><font face="Arial">要实现自己的编码/解码器(codec)只需要实现interface: ProtocolCodecFactory即可.<br />
在MINA 1.0版本，MINA已经实现了几个常用的(codec factory):</font></p>
<p><font face="Arial">DemuxingProtocolCodecFactory, <br />
NettyCodecFactory, <br />
ObjectSerializationCodecFactory, <br />
TextLineCodecFactory<br />
&nbsp;<br />
其中：<br />
TextLineCodecFactory:<br />
&nbsp;A ProtocolCodecFactory that performs encoding and decoding between a text line data and a Java <br />
&nbsp;string object. This codec is useful especially when you work with a text-based protocols such as SMTP and IMAP.</font></p>
<p><font face="Arial">ObjectSerializationCodecFactory:<br />
A ProtocolCodecFactory that serializes and deserializes Java objects. This codec is very useful when <br />
you have to prototype your application rapidly without any specific codec. </font></p>
<p><font face="Arial">DemuxingProtocolCodecFactory：<br />
A composite ProtocolCodecFactory that consists of multiple MessageEncoders and MessageDecoders. ProtocolEncoder<br />
and ProtocolDecoder this factory returns demultiplex incoming messages and buffers to appropriate MessageEncoders <br />
and MessageDecoders.</font></p>
<p><font face="Arial">NettyCodecFactory:<br />
A MINA ProtocolCodecFactory that provides encoder and decoder for Netty2 Messages and MessageRecognizers.</font></p>
<p><font face="Arial">3.3 business logic: IoHandler</font></p>
<p><font face="Arial">MINA中，所有的业务逻辑都有实现了IoHandler的class完成<br />
interfaceHandles:<br />
&nbsp;all protocol events fired by MINA. There are 6 event handler methods, and they are all invoked by MINA automatically. <br />
&nbsp;当事件发生时，将触发IoHandler中的方法:<br />
&nbsp;<font face="Arial">sessionCreated(), <br />
sessionOpened(), <br />
sessionClosed(), <br />
sessionIdle(), <br />
exceptionCaught(), <br />
messageReceived(), <br />
messageSent()</font></font></p>
<p><font face="Arial"><br />
MINA 1.O中，IoHandler的实现类：<br />
<font face="Arial">ChainedIoHandler, <br />
DemuxingIoHandler, <br />
IoHandlerAdapter, <br />
SingleSessionIoHandlerDelegate, <br />
StreamIoHandler </font><br />
具体细节可参考javadoc。</font></p>
<p><font face="Arial">3.4&nbsp; &nbsp;MINA的高级主题：线程模式<br />
MINA通过它灵活的filter机制来提供多种线程模型。<br />
没有线程池过滤器被使用时MINA运行在一个单线程模式。<br />
如果添加了一个IoThreadPoolFilter到IoAcceptor，将得到一个leader-follower模式的线程池。<br />
如果再添加一个ProtocolThreadPoolFilter，server将有两个线程池；<br />
一个(IoThreadPoolFilter)被用于对message对象进行转换，另外一个(ProtocolThreadPoolFilter)被用于处理业务逻辑。 <br />
SimpleServiceRegistry加上IoThreadPoolFilter和ProtocolThreadPoolFilter的缺省实现即可适用于需<br />
要高伸缩性的应用。如果想使用自己的线程模型，请参考SimpleServiceRegistry的源代码，并且自己</font></p>
<p><font face="Arial">初始化Acceptor。</font><font face="Arial"></font></p>
<div class="code_title">java 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>IoThreadPoolFilter&nbsp;threadPool&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IoThreadPoolFilter();threadPool.start(); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>IoAcceptor&nbsp;acceptor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketAcceptor(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>acceptor.getFilterChain().addLast(&nbsp;</span><span class="string">&quot;threadPool&quot;</span><span>,&nbsp;threadPool); &nbsp;&nbsp;</span> </li>
    <li class=""><span>ProtocolThreadPoolFilter&nbsp;threadPool2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProtocolThreadPoolFilter(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>threadPool2.start(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>ProtocolAcceptor&nbsp;acceptor2&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;IoProtocolAcceptor(&nbsp;acceptor&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>acceptor2.getFilterChain().addLast(&nbsp;</span><span class="string">&quot;threadPool&quot;</span><span>,&nbsp;threadPool2&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>... &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>threadPool2.stop(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>threadPool.stop();&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
3.5 采用MINA进行socket开发，一般步骤如下：<br />
1：</p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>IoAcceptor&nbsp;acceptor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketAcceptor();&nbsp;</span><span class="comment">//建立client接收器 </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>or&nbsp;client: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>SocketConnector&nbsp;connector&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketConnector();&nbsp;&nbsp;</span><span class="comment">//建立一个连接器</span><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
2：server的属性配置：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>SocketAcceptorConfig&nbsp;cfg&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketAcceptorConfig(); &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>cfg.setReuseAddress(</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>cfg.getFilterChain().addLast( &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;codec&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProtocolCodecFilter(&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectSerializationCodecFactory()&nbsp;)&nbsp;);&nbsp;</span><span class="comment">//对象序列化&nbsp;codec&nbsp;factory </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>cfg.getFilterChain().addLast(&nbsp;</span><span class="string">&quot;logger&quot;</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;LoggingFilter()&nbsp;);&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
3：绑定address和business logic<br />
server:</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>acceptor.bind( &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;InetSocketAddress(&nbsp;SERVER_PORT&nbsp;), &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServerSessionHandler(&nbsp;),&nbsp;cfg&nbsp;);&nbsp;</span><span class="comment">//&nbsp;绑定address和handler </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>connector.connect(</span><span class="keyword">new</span><span>&nbsp;InetSocketAddress(&nbsp;HOSTNAME,&nbsp;PORT&nbsp;), &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ClientSessionHandler(msg),&nbsp;cfg&nbsp;); &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>下面的这个简单的example演示client和server传递object的过程：<br />
Message.java</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Message&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Serializable&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;type; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;status; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;String&nbsp;msgBody; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;Message(</span><span class="keyword">int</span><span>&nbsp;type,&nbsp;</span><span class="keyword">int</span><span>&nbsp;status,&nbsp;String&nbsp;msgBody) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.type&nbsp;=&nbsp;type; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.status&nbsp;=&nbsp;status; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.msgBody&nbsp;=&nbsp;msgBody; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getMsgBody()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;msgBody; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setMsgBody(String&nbsp;msgBody)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.msgBody&nbsp;=&nbsp;msgBody; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getStatus()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;status; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setStatus(</span><span class="keyword">int</span><span>&nbsp;status)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.status&nbsp;=&nbsp;status; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;getType()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;type; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setType(</span><span class="keyword">int</span><span>&nbsp;type)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.type&nbsp;=&nbsp;type; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
Client.java</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Client &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;HOSTNAME&nbsp;=&nbsp;</span><span class="string">&quot;localhost&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;PORT&nbsp;=&nbsp;</span><span class="number">8080</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;CONNECT_TIMEOUT&nbsp;=&nbsp;</span><span class="number">30</span><span>;&nbsp;</span><span class="comment">//&nbsp;seconds </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketConnector&nbsp;connector&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketConnector();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Configure&nbsp;the&nbsp;service. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketConnectorConfig&nbsp;cfg&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketConnectorConfig(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.setConnectTimeout(&nbsp;CONNECT_TIMEOUT&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.getFilterChain().addLast( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;codec&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProtocolCodecFilter(&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectSerializationCodecFactory()&nbsp;)&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.getFilterChain().addLast(&nbsp;</span><span class="string">&quot;logger&quot;</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;LoggingFilter()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoSession&nbsp;session; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;msg&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Message(</span><span class="number">0</span><span>,</span><span class="number">1</span><span>,</span><span class="string">&quot;hello&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connector.connect(</span><span class="keyword">new</span><span>&nbsp;InetSocketAddress(&nbsp;HOSTNAME,&nbsp;PORT&nbsp;), &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ClientSessionHandler(msg),&nbsp;cfg&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>ClientSessionHandler.java</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ClientSessionHandler&nbsp;</span><span class="keyword">extends</span><span>&nbsp;IoHandlerAdapter &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Object&nbsp;msg; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ClientSessionHandler(Object&nbsp;msg) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.msg&nbsp;=&nbsp;msg; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionOpened(&nbsp;IoSession&nbsp;session&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.write(</span><span class="keyword">this</span><span>.msg); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;messageReceived(&nbsp;IoSession&nbsp;session,&nbsp;Object&nbsp;message&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;in&nbsp;messageReceived!&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;rm&nbsp;=&nbsp;(Message&nbsp;)&nbsp;message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionLog.debug(session,&nbsp;rm.getMsgBody()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;message&nbsp;is:&nbsp;&quot;</span><span>&nbsp;+&nbsp;rm.getMsgBody()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.write(rm); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;exceptionCaught(&nbsp;IoSession&nbsp;session,&nbsp;Throwable&nbsp;cause&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
Server.java</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Server &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;</span><span class="keyword">int</span><span>&nbsp;SERVER_PORT&nbsp;=&nbsp;</span><span class="number">8080</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(&nbsp;String[]&nbsp;args&nbsp;)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Throwable &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoAcceptor&nbsp;acceptor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketAcceptor(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;Prepare&nbsp;the&nbsp;service&nbsp;configuration. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketAcceptorConfig&nbsp;cfg&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SocketAcceptorConfig(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.setReuseAddress(&nbsp;</span><span class="keyword">true</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.getFilterChain().addLast( &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="string">&quot;codec&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ProtocolCodecFilter(&nbsp;</span><span class="keyword">new</span><span>&nbsp;ObjectSerializationCodecFactory()&nbsp;)&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cfg.getFilterChain().addLast(&nbsp;</span><span class="string">&quot;logger&quot;</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;LoggingFilter()&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acceptor.bind( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;InetSocketAddress(&nbsp;SERVER_PORT&nbsp;), &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServerSessionHandler(&nbsp;),&nbsp;cfg&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span class="string">&quot;The&nbsp;server&nbsp;Listening&nbsp;on&nbsp;port&nbsp;&quot;</span><span>&nbsp;+&nbsp;SERVER_PORT&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
ServerSessionHandler.java</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;ServerSessionHandler&nbsp;</span><span class="keyword">extends</span><span>&nbsp;IoHandlerAdapter &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionOpened(&nbsp;IoSession&nbsp;session&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;set&nbsp;idle&nbsp;time&nbsp;to&nbsp;60&nbsp;seconds </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setIdleTime(&nbsp;IdleStatus.BOTH_IDLE,&nbsp;</span><span class="number">60</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span class="string">&quot;times&quot;</span><span>,</span><span class="keyword">new</span><span>&nbsp;Integer(</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;messageReceived(&nbsp;IoSession&nbsp;session,&nbsp;Object&nbsp;message&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;in&nbsp;messageReceived&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;times&nbsp;=&nbsp;((Integer)(session.getAttribute(</span><span class="string">&quot;times&quot;</span><span>))).intValue(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;tiems&nbsp;=&nbsp;&quot;</span><span>&nbsp;+&nbsp;times); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;communicate&nbsp;30&nbsp;times,then&nbsp;close&nbsp;the&nbsp;session. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(times&nbsp;&lt;&nbsp;</span><span class="number">30</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;times++; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.setAttribute(</span><span class="string">&quot;times&quot;</span><span>,&nbsp;</span><span class="keyword">new</span><span>&nbsp;Integer(times));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Message&nbsp;msg; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg&nbsp;=&nbsp;(Message)&nbsp;message; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;msg.setMsgBody(</span><span class="string">&quot;in&nbsp;server&nbsp;side:&nbsp;&quot;</span><span>&nbsp;+&nbsp;msg.getMsgBody());&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;begin&nbsp;send&nbsp;msg:&nbsp;&quot;</span><span>&nbsp;+&nbsp;msg.getMsgBody()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.write(msg); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;sessionIdle(&nbsp;IoSession&nbsp;session,&nbsp;IdleStatus&nbsp;status&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionLog.info(&nbsp;session,&nbsp;</span><span class="string">&quot;Disconnecting&nbsp;the&nbsp;idle.&quot;</span><span>&nbsp;); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;disconnect&nbsp;an&nbsp;idle&nbsp;client </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;exceptionCaught(&nbsp;IoSession&nbsp;session,&nbsp;Throwable&nbsp;cause&nbsp;) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;close&nbsp;the&nbsp;connection&nbsp;on&nbsp;exceptional&nbsp;situation </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><br />
MINA自己附带的Demo已经很好的说明了它的运用。<br />
值得一提的是它的SumUp：客户端发送几个数字，服务端求和后并返回结果。这个简单的程序演示了如何自己实现CODEC。</p>
<p>补充提示：<br />
下载并运行MINA的demo程序还颇非周折:<br />
运行MINA demo appli擦tion：<br />
1:在JDK5<br />
产生错误:<br />
Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Executor<br />
&nbsp;at org.apache.mina.example.reverser.Main.main(Main.java:44)<br />
&nbsp;<br />
察看mina的QA email:<br />
&nbsp;<a href="http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html">http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html</a></p>
<p>原来需要下载:backport-util-concurrent.jar并加入classpath<br />
<a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent">http://dcl.mathcs.emory.edu/util/backport-util-concurrent</a></p>
<p>继续运行还是报错:<br />
Exception in thread &quot;main&quot; java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory</p>
<p>原来MINA采用了slf4j项目作为log，继续下载<br />
slf4j-simple.jar等，并加入classpath:<br />
<a href="http://www.slf4j.org/download.html">http://www.slf4j.org/download.html</a></p>
<p><font face="Arial">附件是mina demo的eclipse工程。导入就可运行，所有的相关jar包在bin目录下</font><br />
</p>
          <br/>
          <span style="color:red;">
            <a href="http://lcllcl987.javaeye.com/blog/70708#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 13 Apr 2007 18:20:41 +0800</pubDate>
        <link>http://lcllcl987.javaeye.com/blog/70708</link>
        <guid>http://lcllcl987.javaeye.com/blog/70708</guid>
      </item>
      <item>
        <title>nio socket 及其开源框架MINA学习总结(一)</title>
        <author>lcllcl987</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lcllcl987.javaeye.com">lcllcl987</a>&nbsp;
          链接：<a href="http://lcllcl987.javaeye.com/blog/70703" style="color:red;">http://lcllcl987.javaeye.com/blog/70703</a>&nbsp;
          发表时间: 2007年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">最近花了点时间研究了一下nio，及其开源框架MINA，现把心得总结如下：</font></p>
<p><font face="Arial"><strong>1：传统socket:阻塞式通信</strong></font></p>
<p><font face="Arial">每建立一个Socket连接时，同时创建一个新线程对该Socket进行单独通信（采用阻塞的方式通信）。这种方式具有很高的响应速度，并且控制起来也很简单，在连接数较少的时候非常有效，但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费，如果连接数较多将会出现资源不足的情况。</font></p>
<p><font face="Arial">example:<br />
server code:</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;MultiUserServer&nbsp;</span><span class="keyword">extends</span><span>&nbsp;Thread&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">private</span><span>&nbsp;Socket&nbsp;client; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;MultiUserServer(Socket&nbsp;c)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.client&nbsp;=&nbsp;c; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(client &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream())); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PrintWriter(client.getOutputStream()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;&nbsp;Mutil&nbsp;User&nbsp;but&nbsp;can't&nbsp;parallel </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;=&nbsp;in.readLine(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketLog.debug(</span><span class="string">&quot;receive&nbsp;message:&nbsp;&quot;</span><span>&nbsp;+&nbsp;str); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span class="string">&quot;has&nbsp;receive....&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(str.equals(</span><span class="string">&quot;end&quot;</span><span>)) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;client.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;ex)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;port&nbsp;=&nbsp;</span><span class="number">5678</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(args.length&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port&nbsp;=&nbsp;Integer.parseInt(args[</span><span class="number">0</span><span>]); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocket&nbsp;server&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServerSocket(port); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SocketLog.debug(</span><span class="string">&quot;the&nbsp;server&nbsp;socket&nbsp;application&nbsp;is&nbsp;created!&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</span><span>)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;&nbsp;transfer&nbsp;location&nbsp;change&nbsp;Single&nbsp;User&nbsp;or&nbsp;Multi&nbsp;User </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiUserServer&nbsp;mu&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;MultiUserServer(server.accept()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mu.start(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>client code：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Client&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">static</span><span>&nbsp;Socket&nbsp;server; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//set&nbsp;socket&nbsp;proxy. </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;proxyHost&nbsp;=&nbsp;</span><span class="string">&quot;192.16.24.12&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;proxyPort&nbsp;=&nbsp;</span><span class="string">&quot;1080&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperties().put(</span><span class="string">&quot;socksProxySet&quot;</span><span>,</span><span class="string">&quot;true&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperties().put(</span><span class="string">&quot;socksProxyHost&quot;</span><span>,proxyHost); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.getProperties().put(</span><span class="string">&quot;socksProxyPort&quot;</span><span>,proxyPort);&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;host&nbsp;=&nbsp;</span><span class="string">&quot;12.201.29.10&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;port&nbsp;=&nbsp;</span><span class="number">10086</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(args.length&nbsp;&gt;&nbsp;</span><span class="number">1</span><span>) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{