<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>duker</title>
    <description>从2000年起即开始在java 平台上进行开发工作,有丰富的java 平台的开发使用经验.对面向对象的分析和设计有比较深入的理解和领会.
开发工作多数是在j2ee环境下进行,对j2ee的体系结构
理解比较透彻.能够熟练使用spring,hibernate,struts等开源组件设计和开发j2ee应用程序.此外我对java 的nio,apache mina 框架,多线程,swing等均进行过一定程度的研究对它们的使用也比较熟悉.
我对新技术的理解把握能力较强,在2007年接触ria,flex后,对flex的技术体系进行过深入的了解和学习.目前熟悉as3 平台与java 服务器通信的各种机制,能够使用flex,as3,flash media server,open red5等进行开发</description>
    <link>http://duker.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>使用flash的Socket类连接服务器的任意端口</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/209040" style="color:red;">http://duker.javaeye.com/blog/209040</a>&nbsp;
          发表时间: 2008年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small;">Flash中有两个提供低层网络通信功能的类,Socket,XMLSocket . XMLSocket传输的是文本形式的xml字符串数据,每个数据单元以 0 结束. Socket可以传输任意类型的数据.<br />
Flash 的安全模型下,缺省情况下,Socket 和XMLSocket只能连接到和swf文件同一个域上的大于1024的端口,但有些应用需要访问webserver之外的服务器上的端口,或者访问小于1024的端口,为了达到这种目的,需要使用安全策略文件,并在服务器端使用XMLSocket的协议提供这个安全策略文件.flash 在连接目标端口之前会先向策略服务端口发送一个请求:<br />
&ldquo;&lt;policy-file-request/&gt;&rdquo;,策略服务接收到这个请求后需要返回一个策略文档,最后以0结束,当flash接收到 0时,会自动切断与策略服务的连接,并根据策略文件中的规则决定是否允许与目标端口连接.安全策略文件是一个xml格式的文档,例如:&nbsp;</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<pre name="code" class="xml"><span style="font-size: small;">&lt;cross-domain-policy&gt; 
   &lt;allow-access-from domain=&quot;*&quot; to-ports=&quot;507&quot; /&gt; 
   &lt;allow-access-from domain=&quot;*.example.com&quot; to-ports=&quot;507,516&quot; /&gt; 
   &lt;allow-access-from domain=&quot;*.example.org&quot; to-ports=&quot;516-523&quot; /&gt; 
   &lt;allow-access-from domain=&quot;adobe.com&quot; to-ports=&quot;507,516-523&quot; /&gt; 
   &lt;allow-access-from domain=&quot;192.0.34.166&quot; to-ports=&quot;*&quot; /&gt; 
&lt;/cross-domain-policy&gt;
</span>


</pre>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><span style="font-size: small;">并且flash安全策略规定,如果这个文档是在小于1024的端口上提供,那么可以授权对所有端口的访问权限,如果在大于1024的端口上提供,则只能授权对大于1024的端口的访问权限.因此如果我们想要访问某台服务器上的任意端口的话,就需要在该服务器某个小于1024的端口上以XMLSocket的方式提供一个安全策略文件.<br />
网上google了一把,发现没有类似功能的组件,于是自己动手写了一个,使用的网络框架是mina2.0m1,感谢mina提供的强大功能,我们只需要两个java类,数十行代码就可以完成一个简单的安全策略服务器.(本来xml文档识别的代码应该作为一个mina 的codec来开发,但因为这个例子的功能很简单,所以就偷了个懒,直接在IoHandler中处理了).代码如下:</span>
</p>
<p><span style="font-size: small;"><br />
</span>
</p>
<p><!--   [if gte mso 9]><xml>
 <w:WordDocument>
  <w:View>Normal</w:View>
  <w:Zoom>0</w:Zoom>
  <w:TrackMoves/>
  <w:TrackFormatting/>
  <w:PunctuationKerning/>
  <w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
  <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
  <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
  <w:ValidateAgainstSchemas/>
  <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
  <w:IgnoreMixedContent>false</w:IgnoreMixedContent>
  <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
  <w:DoNotPromoteQF/>
  <w:LidThemeOther>EN-US</w:LidThemeOther>
  <w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
  <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
  <w:Compatibility>
   <w:SpaceForUL/>
   <w:BalanceSingleByteDoubleByteWidth/>
   <w:DoNotLeaveBackslashAlone/>
   <w:ULTrailSpace/>
   <w:DoNotExpandShiftReturn/>
   <w:AdjustLineHeightInTable/>
   <w:BreakWrappedTables/>
   <w:SnapToGridInCell/>
   <w:WrapTextWithPunct/>
   <w:UseAsianBreakRules/>
   <w:DontGrowAutofit/>
   <w:SplitPgBreakAndParaMark/>
   <w:DontVertAlignCellWithSp/>
   <w:DontBreakConstrainedForcedTables/>
   <w:DontVertAlignInTxbx/>
   <w:Word11KerningPairs/>
   <w:CachedColBalance/>
   <w:UseFELayout/>
  </w:Compatibility>
  <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
  <m:mathPr>
   <m:mathFont m:val="Cambria Math"/>
   <m:brkBin m:val="before"/>
   <m:brkBinSub m:val="--"/>
   <m:smallFrac m:val="off"/>
   <m:dispDef/>
   <m:lMargin m:val="0"/>
   <m:rMargin m:val="0"/>
   <m:defJc m:val="centerGroup"/>
   <m:wrapIndent m:val="1440"/>
   <m:intLim m:val="subSup"/>
   <m:naryLim m:val="undOvr"/>
  </m:mathPr></w:WordDocument>
</xml><![endif]--><!--   [if gte mso 9]><xml>
 <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
  DefSemiHidden="true" DefQFormat="false" DefPriority="99"
  LatentStyleCount="267">
  <w:LsdException Locked="false" Priority="0" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
  <w:LsdException Locked="false" Priority="9" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
  <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 1"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 2"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 3"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 4"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 5"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 6"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 7"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 8"/>
  <w:LsdException Locked="false" Priority="39" Name="toc 9"/>
  <w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
  <w:LsdException Locked="false" Priority="10" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Title"/>
  <w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
  <w:LsdException Locked="false" Priority="11" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
  <w:LsdException Locked="false" Priority="22" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
  <w:LsdException Locked="false" Priority="20" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
  <w:LsdException Locked="false" Priority="59" SemiHidden="false"
   UnhideWhenUsed="false" Name="Table Grid"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
  <w:LsdException Locked="false" Priority="1" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 1"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
  <w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
  <w:LsdException Locked="false" Priority="34" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
  <w:LsdException Locked="false" Priority="29" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
  <w:LsdException Locked="false" Priority="30" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 1"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 2"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 2"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 3"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 3"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 4"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 4"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 5"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 5"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
  <w:LsdException Locked="false" Priority="60" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="61" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light List Accent 6"/>
  <w:LsdException Locked="false" Priority="62" SemiHidden="false"
   UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="63" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="64" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="65" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="66" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="67" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
  <w:LsdException Locked="false" Priority="68" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
  <w:LsdException Locked="false" Priority="69" SemiHidden="false"
   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
  <w:LsdException Locked="false" Priority="70" SemiHidden="false"
   UnhideWhenUsed="false" Name="Dark List Accent 6"/>
  <w:LsdException Locked="false" Priority="71" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
  <w:LsdException Locked="false" Priority="72" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
  <w:LsdException Locked="false" Priority="73" SemiHidden="false"
   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
  <w:LsdException Locked="false" Priority="19" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
  <w:LsdException Locked="false" Priority="21" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
  <w:LsdException Locked="false" Priority="31" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
  <w:LsdException Locked="false" Priority="32" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
  <w:LsdException Locked="false" Priority="33" SemiHidden="false"
   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
  <w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
  <w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
 </w:LatentStyles>
</xml><![endif]-->&nbsp;
<!--   [if gte mso 10]>
<style>
 /* Style Definitions */
 table.MsoNormalTable
	{mso-style-name:普通表格;
	mso-tstyle-rowband-size:0;
	mso-tstyle-colband-size:0;
	mso-style-noshow:yes;
	mso-style-priority:99;
	mso-style-qformat:yes;
	mso-style-parent:"";
	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
	mso-para-margin:0cm;
	mso-para-margin-bottom:.0001pt;
	mso-pagination:widow-orphan;
	font-size:10.5pt;
	mso-bidi-font-size:11.0pt;
	font-family:"Calibri","sans-serif";
	mso-ascii-font-family:Calibri;
	mso-ascii-theme-font:minor-latin;
	mso-hansi-font-family:Calibri;
	mso-hansi-theme-font:minor-latin;
	mso-font-kerning:1.0pt;}
</style>
<![endif]--><span style="font-size: small;"><span style="font-size: 10.5pt; font-family: 宋体;">XmlSocketServer.java</span>
</span>
</p>
<p>&nbsp;</p>
<pre name="code" class="java"><span style="font-size: small;">package net.mudfan.xmlsocket;

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.common.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 *
 * @author yunchang Yuan
 */
public class XmlSocketServer {
    private static final int PORT = 888;
    public static void main(String[] args) throws Exception{
        SocketAcceptor acceptor = new NioSocketAcceptor();
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
        acceptor.setHandler(new XmlSocketHandler());
        acceptor.bind(new InetSocketAddress(PORT));

        System.out.println(&quot;Listening on port &quot; + PORT);
    }
}
</span>


</pre>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-size: small;"><span lang="EN-US">XmlSocketHandler.java</span>
</span>
</p>
<p class="MsoNormal">&nbsp;</p>
<p>&nbsp;</p>
<pre name="code" class="java"><span style="font-size: small;">package net.mudfan.xmlsocket;

import java.io.UnsupportedEncodingException;
import org.apache.mina.common.IdleStatus;
import org.apache.mina.common.IoBuffer;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.IoSession;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author yunchang Yuan
 */
public class XmlSocketHandler extends  IoHandlerAdapter{
    static Logger logger = LoggerFactory.getLogger(XmlSocketHandler.class);
    static String security_req = &quot;&lt;policy-file-request/&gt;&quot;;
    static String allow_all =  &quot;&lt;cross-domain-policy&gt;\n&quot;+
                              &quot;  &lt;allow-access-from  domain=\&quot;*\&quot;  to-ports=\&quot;*\&quot;  /&gt;\n&quot;+
                              &quot;&lt;/cross-domain-policy&gt;&quot;;
    
    @Override
    public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception {
        super.exceptionCaught(arg0, arg1);
    }

    @Override
    public void messageReceived(IoSession arg0, Object arg1) throws Exception {
        IoBuffer buf = (IoBuffer)arg1;
        IoBuffer processBuf = (IoBuffer)arg0.getAttribute(&quot;processBuf&quot;);
        
        processBuf.put(buf);
        processBuf.flip();
        String req = getReq(processBuf);
        if(req!=null){
            if(security_req.equals(req)){
                logger.info(&quot;get security req,now send policy file&quot;); 
                byte[] reps = allow_all.getBytes(&quot;UTF-8&quot;);
                IoBuffer wb = IoBuffer.allocate(reps.length+1);
                wb.put(reps);
                wb.put((byte)0x0);
                wb.flip();
                arg0.write(wb);
                arg0.setAttribute(&quot;policySend&quot;, true)    ;
            }
        }
        
    }

    @Override
    public void messageSent(IoSession arg0, Object arg1) throws Exception {
        logger.info(&quot;messageSent&quot;);
        arg0.close();
    }

    @Override
    public void sessionClosed(IoSession arg0) throws Exception {        
        logger.info(&quot;sessionClosed&quot;);    
        super.sessionClosed(arg0);
        arg0.removeAttribute(&quot;processBuf&quot;);
    }

    @Override
    public void sessionCreated(IoSession arg0) throws Exception {
        super.sessionCreated(arg0);
        IoBuffer processBuf = IoBuffer.allocate(64);
        arg0.setAttribute(&quot;processBuf&quot;, processBuf);
    }

    @Override
    public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {
        super.sessionIdle(arg0, arg1);
    }

    @Override
    public void sessionOpened(IoSession arg0) throws Exception {
        super.sessionOpened(arg0);
    }

    private String getReq(IoBuffer buf) {
        IoBuffer reqbuf = IoBuffer.allocate(64);
        boolean found = false;
        for(int i=0;i&lt;buf.limit();i++){
            byte data = buf.get();
            if(data!=0){
                reqbuf.put(data);
            }else{
                found = true;
                break;
            }
        }
        if(found){
            logger.info(&quot;get xml document&quot;);
            reqbuf.flip();
            buf.compact();
            try {
                byte[] strbuf = new byte[reqbuf.limit()];
                reqbuf.get(strbuf,0,reqbuf.limit());
                String req = new String(strbuf, &quot;UTF-8&quot;);
                logger.info(&quot;req is :&quot;+req);
                return req;
            } catch (UnsupportedEncodingException ex) {
                logger.error(&quot;encoding error&quot;);
                return null;
            }
            
        }else{
            
            return null;
        }
        
    }
    
}
</span>


</pre>
<p><span style="font-size: small;">&nbsp;</span>
</p>
<p><span style="font-size: small;">上面代码中用到的外部库,mina 2.0m1, sl4j1.5. 上述代码运行后在服务器的888端口上等待策略文件的请求,在flash代码中socket.connect() 调用之前加上 :<br />
Security.loadPolicyFile(&quot;xmlsocket://host:888&rdquo;); 这样,就可以让服务器上的所有端口被flash 连接了.如果要进行某种限制,修改策略文件即可. 当然也可以在此基础上扩展,从外部读取策略配置.<br />
以上适用as3 的所有环境,包括flash 9+,flex2,flex3<br />
<br />
</span>
</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/209040#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Jun 2008 00:12:12 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/209040</link>
        <guid>http://duker.javaeye.com/blog/209040</guid>
      </item>
      <item>
        <title>sun game server (sgs)初探</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/188192" style="color:red;">http://duker.javaeye.com/blog/188192</a>&nbsp;
          发表时间: 2008年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">Sun game server ,</span>
<span style="font-family: 宋体;">简称</span>
<span lang="EN-US">(sgs) </span>
<span style="font-family: 宋体;">是</span>
<span lang="EN-US">sun </span>
<span style="font-family: 宋体;">公司的一个开源项目</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">主要目标是针对</span>
<span lang="EN-US">mmo</span>
<span style="font-family: 宋体;">游戏的服务器端开发</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">最初是从</span>
<span lang="EN-US">Nighthaven </span>
<span style="font-family: 宋体;">的博客文章</span>
<span lang="EN-US">(<a href="http://nighthaven.javaeye.com/blog/181431">http://nighthaven.javaeye.com/blog/181431</a>
)
</span>
<span style="font-family: 宋体;">上了解到</span>
<span lang="EN-US">sgs </span>
<span style="font-family: 宋体;">项目</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">在大致了解了一下它提供的功能后</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">对其发生了兴趣</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">经过一段时间的研究</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">有了一些心得</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">下面就是这些心得的一个总结</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">最后提供一个使用</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">做服务器的对战俄罗斯</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal"><strong><span lang="EN-US">SGS </span>
</strong>
<strong><span style="font-family: 宋体;">提供的主要功能</span>
</strong>
<span lang="EN-US">:</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--      [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--      [endif]--><strong><span style="font-family: 宋体;">服务器端的扩展</span>
</strong>
<span lang="EN-US">: </span>
<span style="font-family: 宋体;">传统的扩展方法是将整个游戏区域分成多个区</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">不同的区运行在不同的游戏服务器上</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">这带来两个问题</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">一个是处于不同区的玩家不能互相交互</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">另外一个是如果某个区发生的动作较少时</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">会出现服务器资源未被充分利用的情况</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">而在</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">的处理方式下</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">所有的处理被分割成为一个个小的执行单元</span>
<span lang="EN-US">(</span>
<span style="font-family: 宋体;">称为</span>
<span lang="EN-US">task),</span>
<span style="font-family: 宋体;">这些</span>
<span lang="EN-US">task</span>
<span style="font-family: 宋体;">可以在组成网络的任何</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">服务器上执行</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">当用户增加时</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">系统自动增加处理线程</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">不再需要为了扩展而将不同的区分配到不同的服务器上面</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">这样既提高了资源利用率</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">又可以让所有的玩家进行交互</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--      [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--      [endif]--><strong><span style="font-family: 宋体;">数据完整性</span>
</strong>
<span lang="EN-US">: sgs</span>
<span style="font-family: 宋体;">提供了一个分布式的数据存储</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">一个</span>
<span lang="EN-US">task</span>
<span style="font-family: 宋体;">需要访问数据时</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">通过数据存储</span>
<span lang="EN-US">api</span>
<span style="font-family: 宋体;">进行访问</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">数据访问具有事务支持</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">当两个</span>
<span lang="EN-US">task </span>
<span style="font-family: 宋体;">发生冲突时</span>
<span lang="EN-US">,sgs</span>
<span style="font-family: 宋体;">会自动协调</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">较年轻的</span>
<span lang="EN-US">task</span>
<span style="font-family: 宋体;">重新调度等待执行</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">而年老的</span>
<span lang="EN-US">task</span>
<span style="font-family: 宋体;">将会执行并直到结束</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">当前版本中的</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">数据存储未使用关系数据库</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">而是使用了</span>
 <span lang="EN-US">berkeley db. </span>
<span style="font-family: 宋体;">任何</span>
<span lang="EN-US">java </span>
<span style="font-family: 宋体;">对象</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">只要实现了</span>
<span lang="EN-US"> ManagedObject</span>
<span style="font-family: 宋体;">标志接口</span>
 <span style="font-family: 宋体;">和</span>
<span lang="EN-US">Serializable </span>
<span style="font-family: 宋体;">接口后即可自动透明存储</span>
<span lang="EN-US">.(sgs</span>
<span style="font-family: 宋体;">的存储机制好像是可扩展的</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">论坛上已经看到有人在讨论</span>
<span lang="EN-US">mysql </span>
<span style="font-family: 宋体;">的存储插件</span>
<span lang="EN-US">)</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--      [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--      [endif]--><strong><span style="font-family: 宋体;">简单的编程模型</span>
</strong>
<span lang="EN-US">: </span>
<span style="font-family: 宋体;">从应用开发的角度来看</span>
<span lang="EN-US">,sgs </span>
<span style="font-family: 宋体;">提供了</span>
<span lang="EN-US">api</span>
<span style="font-family: 宋体;">屏蔽了多数的底层复杂性</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">例如线程调度</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">事务处理</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">等等</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">应用程序只需要开发并装配自己的对象</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">监听响应客户端事件</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">自己管理持久化的</span>
<span lang="EN-US">ManagedObject</span>
<span style="font-family: 宋体;">对象生命周期即可</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--      [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--      [endif]--><strong><span style="font-family: 宋体;">两种通信模型</span>
</strong>
<span lang="EN-US">: </span>
<span style="font-family: 宋体;">一种是</span>
<span lang="EN-US"> client/server </span>
<span style="font-family: 宋体;">的通信</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">即每个</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">只和</span>
<span lang="EN-US">server </span>
<span style="font-family: 宋体;">通信</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">由</span>
<span lang="EN-US">server </span>
<span style="font-family: 宋体;">来负责数据的处理和转发</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">另外一种是</span>
<span lang="EN-US"> channel</span>
<span style="font-family: 宋体;">机制</span>
<span lang="EN-US">(</span>
<span style="font-family: 宋体;">类似一对多的广播</span>
<span lang="EN-US">),channel</span>
<span style="font-family: 宋体;">由</span>
<span lang="EN-US">server</span>
<span style="font-family: 宋体;">创建并维护</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">每个</span>
<span lang="EN-US">channel </span>
<span style="font-family: 宋体;">可以添加多个</span>
<span lang="EN-US">client,server
</span>
<span style="font-family: 宋体;">可以监听</span>
<span lang="EN-US">channel</span>
<span style="font-family: 宋体;">中的所有通信或者具体某个</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">的通信</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">也可以给</span>
<span lang="EN-US">channel</span>
<span style="font-family: 宋体;">中的全部或者部分</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">发送消息</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">加入</span>
<span lang="EN-US">channel</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">可以收到其它任何</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">发送的消息</span>
<span lang="EN-US">.channel</span>
<span style="font-family: 宋体;">下面</span>
<span lang="EN-US">client</span>
<span style="font-family: 宋体;">之间的通信不需要</span>
<span lang="EN-US">server </span>
<span style="font-family: 宋体;">端的介入</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">由于所有通信的数据格式都是字节数组</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">所以应用程序需要开发自己的应用层协议</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--      [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--      [endif]--><strong><span style="font-family: 宋体;">可扩展的机制</span>
</strong>
<span lang="EN-US">: sgs</span>
<span style="font-family: 宋体;">应用程序访问数据</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">使用</span>
<span lang="EN-US">channel,</span>
<span style="font-family: 宋体;">创建</span>
<span lang="EN-US">task</span>
<span style="font-family: 宋体;">都是通过</span>
<span lang="EN-US">&rdquo;Manager&rdquo;</span>
<span style="font-family: 宋体;">来进行的</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">目前一共有三种缺省的</span>
<span lang="EN-US">&rdquo;Manager&rdquo;
,DataManager,ChannelManager,Taskmanager.</span>
<span style="font-family: 宋体;">但可以扩展开发自己的</span>
<span lang="EN-US">Manager,</span>
<span style="font-family: 宋体;">例如在</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">中要求</span>
<span lang="EN-US">task </span>
<span style="font-family: 宋体;">应该是尽量快的执行</span>
<span lang="EN-US">(task</span>
<span style="font-family: 宋体;">允许执行的时间上限可以配置</span>
<span lang="EN-US">) ,</span>
<span style="font-family: 宋体;">所以如果出现调用可能导致阻塞的系统方法时</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">就需要开发一个扩展的</span>
<span lang="EN-US">Manager.</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">目前</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">提供了</span>
<span lang="EN-US">c</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">java </span>
<span style="font-family: 宋体;">的客户端库</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">但协议是开放的</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">已经有人开发出了支持</span>
<span lang="EN-US">as3</span>
<span style="font-family: 宋体;">和</span>
<span lang="EN-US">python</span>
<span style="font-family: 宋体;">的客户端库</span>
<span lang="EN-US">(<a href="https://darkstar-as-client.dev.java.net/">https://darkstar-as-client.dev.java.net/</a>
).</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面是一个实际的</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">应用例子</span>
<span lang="EN-US">: </span>
<span style="font-family: 宋体;">一个支持两人对战的俄罗斯方块</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">客户端改编自一个开源的</span>
<span lang="EN-US">flash/as3</span>
<span style="font-family: 宋体;">的方块游戏</span>
<span lang="EN-US">(<a href="http://flashgamecode.net/tetris">http://flashgamecode.net/tetris</a>
).</span>
<span style="font-family: 宋体;">为了简单起见</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">目前服务器端启动后仅有一个房间</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">房间只允许二人对战</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">客户端连接上后如果房间已经有两人并且都开始了游戏</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">则游戏开始</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">否则等待</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">更多的功能</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">例如对方状态显示</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">房间列表</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">支持更多人对战等</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">考虑在以后逐步添加</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">下面是使用说明</span>
<span lang="EN-US">:</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">一共是两个包</span>
<span lang="EN-US">
server.zip,client.zip. server.zip </span>
<span style="font-family: 宋体;">中是一个</span>
<span lang="EN-US">eclipse </span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">project</span>
<span style="font-family: 宋体;">目录</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">其中包含了一个</span>
<span lang="EN-US">bat</span>
<span style="font-family: 宋体;">文件</span>
<span lang="EN-US">: runserver.bat. </span>
<span style="font-family: 宋体;">解压后运行</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">如果看到</span>
<span lang="EN-US">:</span>
</p>
<p class="MsoNormal"><img src="../../../upload/attachment/22322/72bd210a-578a-3509-bd95-6d265268aa45.png" alt="" />
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">&ldquo;sgsApp: application is ready&rdquo; </span>
<span style="font-family: 宋体;">说明服务器程序已经正常启动</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">可以等待连接了</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal"><span lang="EN-US">Client.zip</span>
<span style="font-family: 宋体;">中包含了</span>
<span lang="EN-US">fla</span>
<span style="font-family: 宋体;">文件和响应的</span>
<span lang="EN-US">as</span>
<span style="font-family: 宋体;">文件</span>
<span lang="EN-US">. Blox.swf</span>
<span style="font-family: 宋体;">是已经编译好的程序</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">运行两次</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">然后分别开始游戏</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">可以看到只有两个程序同时连接上后</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">游戏才开始</span>
<span lang="EN-US">. </span>
<span style="font-family: 宋体;">和普通的俄罗斯对战一样</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">如果某一方连续消除了</span>
<span lang="EN-US"> n</span>
<span style="font-family: 宋体;">行</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">那么对方就会自动在底部增加</span>
<span lang="EN-US">n-1</span>
<span style="font-family: 宋体;">行</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">如图</span>
<span lang="EN-US">:</span>
</p>
<p class="MsoNormal"><img src="../../../upload/attachment/22320/37d2998f-bc03-31af-a5f9-b7a7fec659b3.png" alt="" />
</p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">Config.conf</span>
<span style="font-family: 宋体;">是配置文件</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">目前有两项配置</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">服务器主机</span>
<span lang="EN-US">(host),</span>
<span style="font-family: 宋体;">连接端口</span>
<span lang="EN-US">(port).</span>
<span style="font-family: 宋体;">缺省配置是</span>
<span lang="EN-US">localhost,1139,</span>
<span style="font-family: 宋体;">即默认服务器和客户端在同一机器上</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">如果想在另外一台机器上运行客户端</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">更改配置即可</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">在运行时</span>
<span lang="EN-US">flash </span>
<span style="font-family: 宋体;">会报安全沙箱问题</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">解决方法请参见我的另外一篇文章</span>
 <span lang="EN-US">&ldquo;</span>
<span style="font-family: 宋体;">解决开发环境下的</span>
<span lang="EN-US">flash player</span>
<span style="font-family: 宋体;">安全沙箱问题</span>
<span lang="EN-US">&rdquo; (<a href="../150579">http://duker.javaeye.com/admin/blogs/150579</a>
)</span>
</p>
<p class="MsoNormal"><span lang="EN-US">server</span>
<span style="font-family: 宋体;">端如果运行第二次以上</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">会出现</span>
<span lang="EN-US">exception,</span>
<span style="font-family: 宋体;">这可能是</span>
<span lang="EN-US">sgs</span>
<span style="font-family: 宋体;">的</span>
<span lang="EN-US">bug</span>
<span style="font-family: 宋体;">导致</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">不影响正常发挥功能</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal">&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/188192#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Apr 2008 22:07:49 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/188192</link>
        <guid>http://duker.javaeye.com/blog/188192</guid>
      </item>
      <item>
        <title>flex skinning 机制实践</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/185662" style="color:red;">http://duker.javaeye.com/blog/185662</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p class="MsoNormal"><span lang="EN-US">Flex</span>
<span style="font-family: 宋体;">中的组件框架中包含了对组件外观进行定制的功能</span>
<span lang="EN-US">(skinning),</span>
<span style="font-family: 宋体;">通过</span>
<span lang="EN-US">skinning</span>
<span style="font-family: 宋体;">机制</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">可以在<strong>保留组件交互特性不变的情况下</strong>
</span>
<strong><span lang="EN-US">,</span>
</strong>
<strong><span style="font-family: 宋体;">将可视外观完全替换掉</span>
</strong>
<span lang="EN-US">. Skin</span>
<span style="font-family: 宋体;">的替换主要是在</span>
<span lang="EN-US">css</span>
<span style="font-family: 宋体;">中为组件指定相应的</span>
<span lang="EN-US">skin</span>
<span style="font-family: 宋体;">图形资源来实现</span>
<span lang="EN-US">,skin</span>
<span style="font-family: 宋体;">图形资源可以是以下几种类型</span>
<span lang="EN-US">:</span>
<strong><span style="font-family: 宋体;">继承自</span>
<span lang="EN-US">ProgrammaticSkin</span>
</strong>
<strong><span style="font-family: 宋体;">的类</span>
</strong>
<span lang="EN-US">, </span>
<strong><span style="font-family: 宋体;">图形文件</span>
</strong>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">存储在</span>
<strong><span lang="EN-US">swf</span>
</strong>
<strong><span style="font-family: 宋体;">文件中的一个符号</span>
</strong>
<span lang="EN-US">(symbol).</span>
<span style="font-family: 宋体;">根据需要可以仅为应用程序中用到的组件替换</span>
<span lang="EN-US">skin,</span>
<span style="font-family: 宋体;">也可以设计一套完整的</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">针对所有组件的</span>
<span lang="EN-US">skin.</span>
<span style="font-family: 宋体;">例如</span>
<span lang="EN-US">yahoo</span>
<span style="font-family: 宋体;">就制作了一套较完整的</span>
<span lang="EN-US">skin,</span>
<span style="font-family: 宋体;">可以免费下载使用</span>
</p>
<p class="MsoNormal"><span lang="EN-US">(<a href="http://developer.yahoo.com/flash/articles/assets/flex-skinning/yflexskin.html">http://developer.yahoo.com/flash/articles/assets/flex-skinning/yflexskin.html</a>
)</span>
</p>
<p class="MsoNormal"><span style="font-family: 宋体;">下面这幅图是我在实践这个</span>
<span lang="EN-US">skinning</span>
<span style="font-family: 宋体;">机制过程中的一个播放器</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">使用的组件都是标准的</span>
<span lang="EN-US">flex</span>
<span style="font-family: 宋体;">组件</span>
<span lang="EN-US">:Button,HSlider,Label</span>
<span style="font-family: 宋体;">等</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">播放进度部分为了能够同时显示播放进度和下载进度</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">对</span>
<span lang="EN-US">HSlider</span>
<span style="font-family: 宋体;">进行了扩展</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">附件里面是这个播放器的源码</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span>
<img src="../../../topics/download/f6a7d82b-ccce-398e-adb8-cb4ffd50b37c" alt="" />
</p>
<p class="MsoNormal"><span lang="EN-US"><!--   [if gte vml 1]><v:shapetype
 id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
 path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
 <v:stroke joinstyle="miter"/>
 <v:formulas>
  <v:f eqn="if lineDrawn pixelLineWidth 0"/>
  <v:f eqn="sum @0 1 0"/>
  <v:f eqn="sum 0 0 @1"/>
  <v:f eqn="prod @2 1 2"/>
  <v:f eqn="prod @3 21600 pixelWidth"/>
  <v:f eqn="prod @3 21600 pixelHeight"/>
  <v:f eqn="sum @0 0 1"/>
  <v:f eqn="prod @6 1 2"/>
  <v:f eqn="prod @7 21600 pixelWidth"/>
  <v:f eqn="sum @8 21600 0"/>
  <v:f eqn="prod @7 21600 pixelHeight"/>
  <v:f eqn="sum @10 21600 0"/>
 </v:formulas>
 <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
 <o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="图片_x0020_1" o:spid="_x0000_i1025" type="#_x0000_t75"
 style="width:415.5pt;height:282.75pt;visibility:visible;mso-wrap-style:square" mce_style="width:415.5pt;height:282.75pt;visibility:visible;mso-wrap-style:square">
 <v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png" mce_src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.png"
  o:title=""/>
</v:shape><![endif]--><!--   [if !vml]--><!--   [endif]--></span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/185662#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 22:34:04 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/185662</link>
        <guid>http://duker.javaeye.com/blog/185662</guid>
      </item>
      <item>
        <title>使用easy eclipse,flex builder,集成开发 j2ee+flex+blazeds</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/181462" style="color:red;">http://duker.javaeye.com/blog/181462</a>&nbsp;
          发表时间: 2008年04月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><span lang="EN-US">Eclipse</span>
<span style="font-family: 宋体;">通过</span>
<span lang="EN-US">wtp</span>
<span style="font-family: 宋体;">插件对</span>
<span lang="EN-US">j2ee web app</span>
<span style="font-family: 宋体;">的开发提供了很好的支持</span>
<span lang="EN-US">,flex builder plugin</span>
<span style="font-family: 宋体;">是基于</span>
<span lang="EN-US">eclipse </span>
<span style="font-family: 宋体;">的一个用于开发</span>
<span lang="EN-US">flex </span>
<span style="font-family: 宋体;">应用程序的插件</span>
<span lang="EN-US">,blazeds</span>
<span style="font-family: 宋体;">是一个用于集成</span>
<span lang="EN-US">flex </span>
<span style="font-family: 宋体;">客户端和</span>
<span lang="EN-US">j2ee server</span>
<span style="font-family: 宋体;">的组件</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">下面介绍一种方法</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">集成</span>
<span lang="EN-US">eclipse,wtp,blazeds,flex builder plugin</span>
<span style="font-family: 宋体;">使得可以在</span>
<span lang="EN-US">eclipse </span>
<span style="font-family: 宋体;">的一个</span>
<span lang="EN-US">&rdquo;dynamic web
project&rdquo; </span>
<span style="font-family: 宋体;">中同时完成</span>
<span lang="EN-US">j2ee web app </span>
<span style="font-family: 宋体;">的开发和</span>
<span lang="EN-US">flex mxml,as3</span>
<span style="font-family: 宋体;">的开发</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">并利用</span>
<span lang="EN-US">blazeds</span>
<span style="font-family: 宋体;">在</span>
<span lang="EN-US">flex </span>
<span style="font-family: 宋体;">客户端访问</span>
<span lang="EN-US">server </span>
<span style="font-family: 宋体;">端的功能</span>
<span lang="EN-US">.</span>
<span style="font-family: 宋体;">所使用的工具中</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">除了</span>
<span lang="EN-US">flex builder</span>
<span style="font-family: 宋体;">是一个商业产品外</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">其它的都是开源组件</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoNormal"><strong><span style="font-family: 宋体;">最终达到的效果</span>
<span lang="EN-US">:</span>
</strong>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--    [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--    [endif]--><span lang="EN-US">Flex </span>
<span style="font-family: 宋体;">应用程序的源码和</span>
<span lang="EN-US">web app</span>
<span style="font-family: 宋体;">的源代码在同一个项目下</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--    [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--    [endif]--><span style="font-family: 宋体;">在</span>
<span lang="EN-US">flex builder</span>
<span style="font-family: 宋体;">视图中开发</span>
<span lang="EN-US">flex </span>
<span style="font-family: 宋体;">应用</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">完全利用</span>
<span lang="EN-US">flex builder</span>
<span style="font-family: 宋体;">对</span>
<span lang="EN-US">flex</span>
<span style="font-family: 宋体;">开发的良好支持</span>
<span lang="EN-US">,build</span>
<span style="font-family: 宋体;">产生的输出直接输出到</span>
<span lang="EN-US">web app </span>
<span style="font-family: 宋体;">的文档目录</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--    [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--    [endif]--><span style="font-family: 宋体;">在</span>
<span lang="EN-US">j2ee </span>
<span style="font-family: 宋体;">视图中进行</span>
<span lang="EN-US">web app </span>
<span style="font-family: 宋体;">开发</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">完全利用</span>
<span lang="EN-US">wtp</span>
<span style="font-family: 宋体;">的强大功能</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--    [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--    [endif]--><span style="font-family: 宋体;">在同一个</span>
<span lang="EN-US">ide</span>
<span style="font-family: 宋体;">中通过切换视图在两种开发模式中切换</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;"><!--    [if !supportLists]--><span style="font-family: Wingdings;"><span>l<span style="font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal; font-family: &quot;Times New Roman&quot;;">&nbsp; </span>
</span>
</span>
<!--    [endif]--><span style="font-family: 宋体;">在</span>
<span lang="EN-US">j2ee</span>
<span style="font-family: 宋体;">视图中</span>
<span lang="EN-US">release </span>
<span style="font-family: 宋体;">产生的</span>
<span lang="EN-US">war</span>
<span style="font-family: 宋体;">文件中包含了最终的服务器代码和</span>
<span lang="EN-US">flex </span>
<span style="font-family: 宋体;">应用编译后的</span>
<span lang="EN-US">swf</span>
<span style="font-family: 宋体;">文件</span>
<span lang="EN-US">,</span>
<span style="font-family: 宋体;">可以直接部署</span>
<span lang="EN-US">.</span>
</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;">&nbsp;</p>
<p class="MsoListParagraph" style="margin-left: 18pt; text-indent: -18pt;">因贴图较多,所以详细步骤请见附件.附件里面也包括了最终生成的eclipse 模板项目.</p>
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/181462#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Apr 2008 21:26:41 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/181462</link>
        <guid>http://duker.javaeye.com/blog/181462</guid>
      </item>
      <item>
        <title>flex  ria应用的系统结构</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/169251" style="color:red;">http://duker.javaeye.com/blog/169251</a>&nbsp;
          发表时间: 2008年03月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          近日看到一则新闻说 Chet Haase 从sun 跳槽到了adobe.chet原来sun公司在客户端技术的架构师(http://weblogs.java.net/blog/chet/). 看来现在adobe的吸引力不小.chet写了一篇文章解释flash和flex 的关系:<br />(http://graphics-geek.blogspot.com/2008/02/moment-of-reflexion.html)<br /><br />近期一直在搞这方面的东西,于是有感而发,整理了下面这个结构图,希望是正确的,呵呵.<br /><br /><img src="../../../upload/attachment/16427/9ec07fef-a8b7-3698-80c2-b98e72753121.gif" height="428" alt="" width="512" /><br /><br />最底层的基础是as3虚拟机和flash player api. 象基本的数据类型,xml处理,正则表达式这些都可以认为是as3虚拟机的一部分,其它的 以flash.*开头的包里基本上都是属于flash player api的范围,包括显示对象,网络等.这些类构成了flash 平台可编程的基础.这些类在flash和flex的应用程序中都可以使用.<br />在这之上,包括了两种组件框架,flash组件框架(一般以fl.*命名),flex组件框架(以mx.*)命名.flash的组件框架结构相比较flex组件框架要简单得多,flex的组件框架是相当的庞大而复杂.<br />在组件框架之上就是我们自己的应用程序了.一般在flash里面开发的应用程序,只能使用flash组件; flex的情况有点特殊,基于flex的应用程序一般是用mxml开发界面,直接继承Application作为顶级显示对象,但flex 的编译器mxmlc确实可以编译直接继承Sprite的类,并将它作为顶级显示对象,这种情况下,在程序中是可以使用flash 组件框架的,前提是将这些类打包成为swc文件后放到mxmlc可以识别的路径上.(无论是flash开发环境还是flex sdk都没有这个swc文件,需要自己动手).<br />无论是flash的应用程序和flex 的应用程序在和服务器交互时,主要可以两种方式:<br />*&nbsp; 通过http之上的amf协议(也就是flash remoting),连接到支持amf协议的应用服务器上,现在主流的服务器端技术,java,php,.net都有开源的flash remoting实现,而java平台上除了第三方的开源组件外,更有正宗的系出adobe的blazeds(这个也是开源的).<br />*&nbsp; 通过rtmp或者rtmpt协议连接到flash media server或者open red5. Flash media server是adobe的商业产品,主要是用来做视频点播,视频会议,视频广播等应用的,fms的开发主要是使用javascript(非客户端的as3,而是老式的javascript).  Open red5是基于java平台,spring,apache mina,jetty的一个开源产品,实现了rtmp,rtmpt,amf协议,最新的版本是0.7. open red5提供以下功能: 服务器-&gt;客户端的流媒体发布,包括flv格式和mp3格式.  客户端-&gt;服务器的流媒体录制(仅限于录制flv格式);shared object, 这是fms和red5上重要的用于同步连接客户端的技术;实时的流广播;flash remoting,可以将red5上的对象方法通过remoting暴露给flash 客户端调用,也可以让red5作为客户端,调用其它支持flash remoting 的服务器.<br />除了以上两种方式外,当然还有webservice,loader等等.当个人认为这些选项都没有什么优势,如果没什么限制的话,就是flash remoting和rtmp这两种是最好的选择.<br />在上面的所有层次中: as3 vm已经作为一个开源项目捐赠给mozilla基金会,flex组件和flash组件都是开源,应用服务器开源的选项大把,流媒体服务器也有了open red5这么一个优秀的开源选择(否则就得接受fms 高昂的价格).<br />可以看出,除了flash 播放器外,都是开源的了,flex这套框架,经过了三个主要版本的发展,已经很成熟,有不少基于flex的应用(http://flex.org/showcase/)<br />相比较而言,javafx现在连个正式版的编译器都没有发布, Silverlight没有一个像样的应用.所以,flex是目前构造ria应用的不二选择.<br /><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/169251#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Mar 2008 22:29:04 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/169251</link>
        <guid>http://duker.javaeye.com/blog/169251</guid>
      </item>
      <item>
        <title>削减flex 应用程序swf文件的体积</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/168502" style="color:red;">http://duker.javaeye.com/blog/168502</a>&nbsp;
          发表时间: 2008年03月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><span style="font-family: 宋体">一直对</span><span>flex </span><span style="font-family: 宋体">生成的</span><span>swf</span><span style="font-family: 宋体">文件大小耿耿于怀</span><span>,</span><span style="font-family: 宋体">即使是只有少数几个控件的简单程序</span><span>,</span><span style="font-family: 宋体">生成的</span><span>swf</span><span style="font-family: 宋体">文件也是将近</span><span>200k,</span><span style="font-family: 宋体">这势必会破坏用户体验</span><span>.</span><span style="font-family: 宋体">造成这种情况的原因是</span><span>,flex </span><span style="font-family: 宋体">组件框架为了提供丰富的功能</span><span>,</span><span style="font-family: 宋体">本身结构非常复杂</span><span>,</span><span style="font-family: 宋体">包含了大量的代码</span><span>,</span><span style="font-family: 宋体">翻翻</span><span>flex3sdk</span><span style="font-family: 宋体">的源码就知道</span><span>,UIComponent</span><span style="font-family: 宋体">是一个将近</span><span>300k</span><span style="font-family: 宋体">的超级怪物</span><span>,Container</span><span style="font-family: 宋体">也有将近</span><span>200k,</span><span style="font-family: 宋体">而这两个类正是</span><span>flex</span><span style="font-family: 宋体">组件中最基础的两个类</span><span>.</span><span style="font-family: 宋体">在</span><span>flex3</span><span style="font-family: 宋体">以前</span><span>,</span><span style="font-family: 宋体">这些代码都要在编译时链接到应用程序中</span><span>,</span><span style="font-family: 宋体">所以导致最终的应用程序</span><span>swf</span><span style="font-family: 宋体">肿胀</span><span>.</span><span style="font-family: 宋体">过大的</span><span>swf</span><span style="font-family: 宋体">文件体积给用户体验造成了影响</span><span>,</span><span style="font-family: 宋体">用户可能不耐烦等待下载就离开了</span><span>.</span></p>

<p class="MsoNormal"><span>&nbsp;</span></p>

<p class="MsoNormal"><span>flex3</span><span style="font-family: 宋体">的发布给我们带来了一个好消息</span><span>,flex3</span><span style="font-family: 宋体">中已经具有了将</span><span>flex</span><span style="font-family: 宋体">组件框架缓存在客户端播放器中的能力</span><span>, 9.0.115 </span><span style="font-family: 宋体">以后版本的</span><span>flash </span><span style="font-family: 宋体">播放器支持加载经过签名的</span><span>RSL</span><span style="font-family: 宋体">文件</span><span>,</span><span style="font-family: 宋体">在运行时</span><span>,</span><span style="font-family: 宋体">如果一个应用程序需要</span><span>flex</span><span style="font-family: 宋体">的框架代码</span><span>,</span><span style="font-family: 宋体">而在本地找不到的话</span><span>,</span><span style="font-family: 宋体">就会去指定的位置下载</span><span>,</span><span style="font-family: 宋体">下载后缓存到播放器的目录中</span><span>,</span><span style="font-family: 宋体">以后再遇到需要框架代码的情况</span><span>,</span><span style="font-family: 宋体">就直接使用缓存中的框架代码</span><span>,</span><span style="font-family: 宋体">这使得应用程序的</span><span>swf</span><span style="font-family: 宋体">文件体积可以大副削减</span><span>,</span><span style="font-family: 宋体">经过测试</span><span>,</span><span style="font-family: 宋体">应用程序体积最小能够达到</span><span>50k</span><span style="font-family: 宋体">左右</span><span>.</span></p>

<p class="MsoNormal"><span>&nbsp;</span>在<span>flex3sdk</span>中<span>,</span>编译器提供了选项<span>,</span>在编译时通过指定参数<span>,</span>不链接框架代码<span>,</span>并将经过签名的<span>RSL</span>框架文件部署到同一目录下<span>.</span></p>

<pre>例如<span>: mxmlc -runtime-shared-library-path=libs/framework.swc,

<span>&nbsp;&nbsp;&nbsp; </span>framework_3.0.183453.swz,,framework_3.0.183453.swf

</span><span><span>&nbsp;&nbsp;&nbsp; </span>SimpleApp.mxml</span></pre>

<p class="MsoNormal"><span>&nbsp;</span></p>

<p class="MsoNormal"><span style="font-family: 宋体">在</span><span>flex builder3 </span><span style="font-family: 宋体">中</span><span>,</span><span style="font-family: 宋体">就更简单了</span><span>,</span><span style="font-family: 宋体">只需要在项目的</span><span>&rdquo;build path&rdquo; </span><span style="font-family: 宋体">选项中</span><span>,</span><span style="font-family: 宋体">将框架的链接属性从</span><span>&rdquo;merged into code&rdquo; </span><span style="font-family: 宋体">设置成</span>
<span>&ldquo;Runtime library&rdquo;</span><span style="font-family: 宋体">就可以了</span><span>,</span><span style="font-family: 宋体">如下图</span><span>.</span></p>

<p class="MsoNormal"><img src="../../../upload/attachment/16191/7c18278a-309f-32f1-8f91-e8a3cc2c0e70.png" alt="" /> </p><p class="MsoNormal">&nbsp;</p>

<p class="MsoNormal"><span style="font-family: 宋体">更详细具体的解释和操作可以</span><span>adove livedoc:</span></p>

<p class="MsoNormal"><span><a href="http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_09.html">http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_09.html</a></span></p>

<p class="MsoNormal"><span>&nbsp;</span></p>

<p class="MsoNormal"><span style="font-family: 宋体">个人觉得</span><span>,adobe flex </span><span style="font-family: 宋体">的</span><span>livedoc</span><span style="font-family: 宋体">文档质量相当高</span><span>,</span><span style="font-family: 宋体">简直就是</span><span>flex </span><span style="font-family: 宋体">大百科全书</span><span>,</span><span style="font-family: 宋体">英文好的话</span><span>,</span><span style="font-family: 宋体">直接啃</span><span>livedoc</span><span style="font-family: 宋体">就可以了</span><span>,</span><span style="font-family: 宋体">哪天全看懂了</span><span>,</span><span style="font-family: 宋体">就成超级牛叉的专家了</span><span>.</span><span style="font-family: 宋体">哈哈</span><span>.</span></p>


          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/168502#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 05 Mar 2008 23:25:43 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/168502</link>
        <guid>http://duker.javaeye.com/blog/168502</guid>
      </item>
      <item>
        <title>flex 中VideoDisplay 的小陷阱</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/155834" style="color:red;">http://duker.javaeye.com/blog/155834</a>&nbsp;
          发表时间: 2008年01月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Flex 的VideoDisplay 控件对于创建视频播放程序非常快捷,方便,但我在使用过程中遇到了一个小陷阱,经过翻看VideoDisplay 源代码,最后总算搞清楚问题所在了. <br />VideoDisplay 有一个ready 事件,按照文档的说法,ready 事件发生时,说明flv文件已经就绪,可以播放了,但实践中发现,在ready事件中获取totalTime 属性时,这个值有时正常,有时是-1,尤其是网络传输速度慢时更是如此,经过反复试验仍不能解决,最后只能查看VideoDisplay源码,发现文件长度的获得是在metadataReceived 这个事件中,totalTime 的计算依据是文件长度,如果文件长度未知,totalTime就返回-1,而metadataReceived有时发生在ready事件之前,有时发生在ready事件之后,导致在ready中获得的totalTime时而正常,时而是-1.所以为了保证能够正确获得totalTime,需要同时处理metadataReceived事件.<br />如果你的firefox上装有firebug,可以看这里: http://dukerr1.googlepages.com/app.html ,通过firebug console,并反复刷新,就可以看到ready事件和metadataReceived事件发生的顺序不确定.<br />(这个播放器使用了flex的preloader定制机制,使用一个静态位图做preloader(也可以使用swf);使用flex 的skin机制定制了播放控制条;扩展了Slider control,在Slider上增加了下载进度显示)
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/155834#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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>Mon, 14 Jan 2008 23:28:01 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/155834</link>
        <guid>http://duker.javaeye.com/blog/155834</guid>
      </item>
      <item>
        <title>使用flash-thundblot和firebug调试flex 应用程序</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/153208" style="color:red;">http://duker.javaeye.com/blog/153208</a>&nbsp;
          发表时间: 2008年01月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          传统的flex 应用程序的调试手段大致是这样的:<br />  使用debug 模式编译,生成带调试信息的swf文件<br />  安装debug 版本的flash player<br />  运行fdb命令行调试器,输入”run”<br />  打开待调试的swf文件,这时会提示是否连接到调试主机,确认后连接到fdb调试器.<br />之后就可以在fdb调试器中看到”trace” 语句的输出信息了,也可以设置断点,单步跟踪等.这种方法的不便之处在于需要同时打开多个应用程序窗口,且fdb 的命令行方式使用也很麻烦.其实很多时候我们需要的仅仅是查看程序中输出的”trace”信息.<a href="http://code.google.com/p/flash-thunderbolt/" target="_blank">flash-thunderblot</a> 就是这样一个工具.它利用flash player 的external interface,将swf文件中的输出信息直接写到firebug console上,极大的方便了开发时的调试.<br />Flash-thunderblot 提供了两种api接口,一种是Logger类静态方法接口,直接用”Logger.debug” 等方法将信息输出,另外一种是集成到flex 的loggin api中. 使用方法也很简单,网上下载后,将其中的swc文件添加到自己的library-path中,然后import相应的类就可以了,具体代码可以查看网站上的例子.<br />在使用flash-thunderblot时可能会碰到安全沙箱的问题,如果是通过http从服务器上下载swf文件,就将html中的 allowScriptAccess设置为 always.如果是从本地的文件系统直接访问swf文件,就用前面介绍过的方法,将开发目录设置为可信目录,这样flash player就不会再报安全问题.
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/153208#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jan 2008 23:07:33 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/153208</link>
        <guid>http://duker.javaeye.com/blog/153208</guid>
      </item>
      <item>
        <title>解决开发环境下的flash player 安全沙箱问题</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/150579" style="color:red;">http://duker.javaeye.com/blog/150579</a>&nbsp;
          发表时间: 2007年12月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal"><span style="font-family: 宋体;">在</span><span lang="EN-US">flex</span><span style="font-family: 宋体;">应用开发时</span><span lang="EN-US">,</span><span style="font-family: 宋体;">曾经遇到过这样的问题</span><span lang="EN-US">,</span><span style="font-family: 宋体;">当访问文件系统上的资源</span><span lang="EN-US">,</span><span style="font-family: 宋体;">比如一个</span><span lang="EN-US">.flv</span><span style="font-family: 宋体;">文件时</span><span lang="EN-US">,flash player </span><span style="font-family: 宋体;">报如下错误</span><span lang="EN-US">: &ldquo;</span><span style="font-family: 宋体;">只有仅限于文件系统的</span><span lang="EN-US"> SWF </span><span style="font-family: 宋体;">文件和可信的本地</span><span lang="EN-US"> SWF </span><span style="font-family: 宋体;">文件可以访问本地资源</span><span lang="EN-US">&rdquo;. </span><span style="font-family: 宋体;">经查阅文档</span><span lang="EN-US">,</span><span style="font-family: 宋体;">找到了一劳永逸的解决方法</span><span lang="EN-US">: </span><span style="font-family: 宋体;">在</span><span lang="EN-US">C:\windows\system32\Macromed\Flash\FlashPlayerTrust </span><span style="font-family: 宋体;">下面</span><span lang="EN-US">,</span><span style="font-family: 宋体;">创建一个文本文件</span><span lang="EN-US">,</span><span style="font-family: 宋体;">例如</span><span lang="EN-US">dev.txt,</span><span style="font-family: 宋体;">把开发时要运行的</span><span lang="EN-US">swf</span><span style="font-family: 宋体;">所在目录每个目录一行</span><span lang="EN-US">,</span><span style="font-family: 宋体;">写到</span><span lang="EN-US">dev.txt</span><span style="font-family: 宋体;">文件中</span><span lang="EN-US">,</span><span style="font-family: 宋体;">例如</span><span lang="EN-US">:</span></p>
<p class="MsoNormal"><span lang="EN-US">E:\flexprojects\fmstest\</span></p>
<p class="MsoNormal"><span lang="EN-US">E:\flexprojects\VideoPlayer\</span></p>
<p class="MsoNormal"><span style="font-family: 宋体;">这样这些目录中的</span><span lang="EN-US">swf</span><span style="font-family: 宋体;">文件在运行时的安全沙箱类型就变成了</span><span lang="EN-US">&rdquo; Security.LOCAL_TRUSTED&rdquo;, </span><span style="font-family: 宋体;">可以随意访问本地或者远程的资源了</span><span lang="EN-US">.</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/150579#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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>Mon, 24 Dec 2007 20:14:57 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/150579</link>
        <guid>http://duker.javaeye.com/blog/150579</guid>
      </item>
      <item>
        <title>adobe又一重大举措!</title>
        <author>duker</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://duker.javaeye.com">duker</a>&nbsp;
          链接：<a href="http://duker.javaeye.com/blog/149807" style="color:red;">http://duker.javaeye.com/blog/149807</a>&nbsp;
          发表时间: 2007年12月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          adobe 将用于嵌入式设备的as3虚拟机捐赠给 mozilla了. 新版的虚拟机可能会在下一版本的flash lite中出现(可能是flash lite4),如果这样的话,开发人员将可以利用flex 和as3的全部功能为嵌入设备进行开发.flex 和as3的开发人员将面临另外一个更大的市场.<br />原文见:<br />http://www.onflex.org/ted/2007/12/meet-qvm-new-tamarin-vm-contributed-to.php
          <br/>
          <span style="color:red;">
            <a href="http://duker.javaeye.com/blog/149807#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Dec 2007 21:52:20 +0800</pubDate>
        <link>http://duker.javaeye.com/blog/149807</link>
        <guid>http://duker.javaeye.com/blog/149807</guid>
      </item>
  </channel>
</rss>