<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-地狱男爵之博客无限</title><link>http://www.blogjava.net/hellboys/</link><description /><language>zh-cn</language><lastBuildDate>Sat, 11 Oct 2008 17:59:22 GMT</lastBuildDate><pubDate>Sat, 11 Oct 2008 17:59:22 GMT</pubDate><ttl>60</ttl><item><title>我想应聘中国男子国家足球队主教练一职</title><link>http://www.blogjava.net/hellboys/archive/2008/06/16/208256.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Mon, 16 Jun 2008 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2008/06/16/208256.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/208256.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2008/06/16/208256.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/208256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/208256.html</trackback:ping><description><![CDATA[&#8220;<span><strong>我想应聘中国男子国家足球队主教练一职，我有100分的信 心，带领中国队在2010年的时候，把大力神杯捧回中国。<br />
　　根据中国足球的现状，我为中国足球队设 计了一整套战术打法，简称为圆环套圆环法。<br />
　　让我们忘掉433还是442这些无聊的数字吧，从此，<br />
足球场上只有一种几何图形，就是圆环。<br />
　　中国队要冲出亚洲，我的战术是，除守门员以外，其他10个 队员手臂扣手臂，围成一个圆圈，其中，找两个射门准的面对圆心，其他的，都背对圆心。摆出此阵以后，守门员 以手抛球的方法把球抛到这个圆环里，然后，整个圆环开始向对方球门缓缓移动，对手一定束手无策，因为他们根 本看不清楚哪个是执球队员哪个是无球队员，稍一接触，就会犯规。当这个圆环移动到离开对方球门的距离小于1 米的时候，靠近球门的队员两条大腿一分，现出空挡，然后由面对圆心的两个射手中的一个突发冷箭，命中率应该 可以高于99%。<br />
　　这个阵法虽然移动缓慢，但是在90分钟里，进他个10几20个球还是可以的！<br />
　　这个只是圆环套圆环法的第一层境界，如果对手是日本，韩国这样二流队，全取三分应该没有什么问题，<br />
但是如果碰到巴西、阿根廷这样的一流队，就要进行队型变化，变化如下：10个人分成两组，第一种是分成一个 4人圈和一个6人圈，6人圈把4人圈圈在中间，这样可以使防御力提高一倍，更加坚不可破；另外一种是分成两 个独立的5人圈，两个5人圈交替前进，只要队员腿够粗，对方根本不知道球在那个5人圈里面，防不胜防！ 结 合这两套战术，干掉巴西也只是小case。<br />
　　我这套战术，是绝对有效和强大的，只要有心玩，场上控 球时间绝对可以达到80%以上，所以最后做技术统计的时候，数据也可以表明，中国队是当之无愧的强大！<br />
　　当然，对方要破我这一套战术，也是有可能的，办法有两个，第一，所有球员排成一线，挡住球门，第二，<br />
对方加上守门员在内组成11个人的大圆环，包住我方的圆环。这样的话，场上的比分会是0：0，每场取一分，<br />
中国要世界杯出线应该也是没有问题的，总比现在这样好！<br />
　　各位领导，对于这套战术，我研究很深，可 以说是毫无漏洞，请给予一个机会，让我执教中国男子国家足球队，我一定可以将中国足球带至前所未有的辉煌！<br />
　　谢谢！ &#8221;</strong></span>
  <img src ="http://www.blogjava.net/hellboys/aggbug/208256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2008-06-16 10:56 <a href="http://www.blogjava.net/hellboys/archive/2008/06/16/208256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android中文文档v0.1 beta低调发布,期待更多同学来参加review</title><link>http://www.blogjava.net/hellboys/archive/2007/12/05/165574.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Wed, 05 Dec 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2007/12/05/165574.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/165574.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2007/12/05/165574.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/165574.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/165574.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="message656"><font color="red">第一阶段:Android中文文档v0.1 beta发布</font><a style="font-size: 16px" href="http://www.androidcn.net/wiki/index.php/Documentation" target="_blank">--由www.androidcn.net社区提供</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img alt="" src="http://www.androidcn.net/images/smilies/lol.gif" border="0" smilieid="12" /><br />
<br />
Android中文文档阅读地址:&nbsp;&nbsp;<a href="http://www.androidcn.net/wiki/index.php/Documentation" target="_blank">http://www.androidcn.net/wiki/index.php/Documentation</a><br />
<br />
Android中文文档大部分已经完成. 但是可能有不少细节和不足之处需要完善和修补.<br />
<br />
感谢翻译的同学,已经在文档里面加入. 如果缺少,请联系我<img alt="" src="http://www.androidcn.net/images/smilies/smile.gif" border="0" smilieid="1" /> <br />
<br />
<br />
<br />
<font color="red">第二阶段:请有时间的同学进行review.</font><br />
<br />
review阶段既然采用wiki上面形式. 希望review的同学可以联系AndroidCN管理员和各版版主.<br />
<br />
相信review阶段对同学理解Android可以有更快的理解和提高. 阅读文档也是对Android理解之初步. <br />
<br />
所有在阅读文档的时候,希望同学们不吝啬自己的一笔之力,对于未完全或翻译有误的地方进行涂抹. <img alt="" src="http://www.androidcn.net/images/smilies/handshake.gif" border="0" smilieid="17" /> <br />
<br />
相信大家可以先阅读文档,然后提出翻译中的不足进行.<br />
<br />
review 讨论区： <a href="http://www.androidcn.net/thread-119-1-1.html">http://www.androidcn.net/thread-119-1-1.html</a><br />
</div>
<img src ="http://www.blogjava.net/hellboys/aggbug/165574.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2007-12-05 16:42 <a href="http://www.blogjava.net/hellboys/archive/2007/12/05/165574.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>欢迎访问Android中国</title><link>http://www.blogjava.net/hellboys/archive/2007/11/15/160794.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Thu, 15 Nov 2007 09:24:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2007/11/15/160794.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/160794.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2007/11/15/160794.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/160794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/160794.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 欢迎访问Android中国, Android是google为手机开发的操作系统, 基于Linux2.6内核. 移动终端开发和使用是一个非常有趣,有挑战的活动.于是, 我们一些志同道合的朋友成立了Android中国, 致力于docs的中文化, 当然还有交流何使用经验, 共同开发Android项目. 欢迎您的光临和加入.<br><br>主页：http://www.androidcn.net&nbsp;&nbsp;<a href='http://www.blogjava.net/hellboys/archive/2007/11/15/160794.html'>阅读全文</a><img src ="http://www.blogjava.net/hellboys/aggbug/160794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2007-11-15 17:24 <a href="http://www.blogjava.net/hellboys/archive/2007/11/15/160794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActiveMQ4.1 +Spring2.0的POJO JMS方案 扩展，以更加实用（基于ss）.二</title><link>http://www.blogjava.net/hellboys/archive/2007/04/05/108737.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Thu, 05 Apr 2007 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2007/04/05/108737.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/108737.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2007/04/05/108737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/108737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/108737.html</trackback:ping><description><![CDATA[<br>一：续一，说明一的可使用性。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">amq:queue&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="destination.report"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;physicalName</span><span style="COLOR: #0000ff">="active.jms.report"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">amq:queue&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="destination.point"</span><span style="COLOR: #ff0000">&nbsp;&nbsp;physicalName</span><span style="COLOR: #0000ff">="active.jms.point"</span><span style="COLOR: #0000ff">/&gt;</span></div>
<br><font color=#800000>queue&nbsp;: 队列的名字 for 制造者.<br><br>感觉<font color=#0000ff>org.springframework.jms.listener.DefaultMessageListenerContainer 做的不好，如果destination property能做一个可包含多个队列，并且有选择性的messageListener就好了，这样就避免下面的监听的尴尬了。呵呵</font><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;listener&nbsp;container，MDP无需实现接口&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="fluxPerhourListenerContainer"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.jms.listener.DefaultMessageListenerContainer"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="connectionFactory"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="jmsConnectionFactory"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="destination"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="destination.fluxPerhour"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="messageListener"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="messageListener"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="fluxPerDayListenerContainer"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.jms.listener.DefaultMessageListenerContainer"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="connectionFactory"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="jmsConnectionFactory"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="destination"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="destination.fluxPerday"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="messageListener"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="messageListener"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="reportPerdayProducer"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="com.jms.ReportPerdayProducer"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="template"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="jmsTemplate"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="destination"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="destination.report"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="pointProducer"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="com.jms.PointProducer"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="template"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="jmsTemplate"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="destination"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="destination.point"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div>
<br><span>producer不能重用，因为send到不同destination，所有没办法重用。<font color=#000000>如果能对producer做一个默认统一的封装就好了. 但是DefaultProducer.那么应该注意队列线程安全方面，目前没有什么好的想法，就采用通用一些的办法，不过xml和代码稍多一些.<br></font></span></font><br><br>然后就用到 前面文章一 里面的内容了，非常简便。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;Message&nbsp;Driven&nbsp;POJO&nbsp;(MDP)&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="messageListener"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.jms.listener.adapter.MessageListenerAdapter"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;may&nbsp;be&nbsp;other&nbsp;method&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">constructor-arg</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="com..jms.MessageConsumerAdapter"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--业务接口/业务门面--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="transfersManager"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="transfersManager"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">constructor-arg</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;may&nbsp;be&nbsp;other&nbsp;method&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="defaultListenerMethod"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="receive"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;custom&nbsp;MessageConverter&nbsp;define&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="messageConverter"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="messageConverter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;Holder&nbsp;Message&nbsp;converter&nbsp;&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="messageConverter"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="com.jms.CoverterHolder"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="defaultMessageConverter"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="com.jms.DefaultMessageConverter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;Spring&nbsp;JmsTemplate&nbsp;config&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="jmsTemplate"</span><span style="COLOR: #ff0000">&nbsp;class</span><span style="COLOR: #0000ff">="org.springframework.jms.core.JmsTemplate"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="connectionFactory"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;lets&nbsp;wrap&nbsp;in&nbsp;a&nbsp;pool&nbsp;to&nbsp;avoid&nbsp;creating&nbsp;a&nbsp;connection&nbsp;per&nbsp;send&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">bean&nbsp;</span><span style="COLOR: #ff0000">class</span><span style="COLOR: #0000ff">="org.springframework.jms.connection.SingleConnectionFactory"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="targetConnectionFactory"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="jmsConnectionFactory"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="messageConverter"</span><span style="COLOR: #ff0000">&nbsp;ref</span><span style="COLOR: #0000ff">="messageConverter"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">bean</span><span style="COLOR: #0000ff">&gt;</span></div>
&nbsp;<br><br><br>二.单元测试有时加载 activemq的问题<br>1.这个可能和spring版本有关系，请采用比较稳定的版本。例如apache-activemq官方包里面提供的.<br>2.选择 xml解析的问题，例如 <br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">abstract</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;SpringManagerTestCase&nbsp;</span><span style="COLOR: #0000ff">extends</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_104_807_Open_Image onclick="this.style.display='none'; Codehighlighter1_104_807_Open_Text.style.display='none'; Codehighlighter1_104_807_Closed_Image.style.display='inline'; Codehighlighter1_104_807_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_104_807_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_104_807_Closed_Text.style.display='none'; Codehighlighter1_104_807_Open_Image.style.display='inline'; Codehighlighter1_104_807_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AbstractTransactionalDataSourceSpringContextTests&nbsp;</span><span id=Codehighlighter1_104_807_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_104_807_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;SpringManagerTestCase()<br><img id=Codehighlighter1_140_547_Open_Image onclick="this.style.display='none'; Codehighlighter1_140_547_Open_Text.style.display='none'; Codehighlighter1_140_547_Closed_Image.style.display='inline'; Codehighlighter1_140_547_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_140_547_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_140_547_Closed_Text.style.display='none'; Codehighlighter1_140_547_Open_Image.style.display='inline'; Codehighlighter1_140_547_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_140_547_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_140_547_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">javax.xml.parsers.DocumentBuilderFactory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.xerces.jaxp.DocumentBuilderFactoryImpl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">javax.xml.parsers.SAXParserFactory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.xerces.jaxp.SAXParserFactoryImpl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.setProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">javax.xml.transform.TransformerFactory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.xalan.processor.TransformerFactoryImpl</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDependencyCheck(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setDefaultRollback(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_550_680_Open_Image onclick="this.style.display='none'; Codehighlighter1_550_680_Open_Text.style.display='none'; Codehighlighter1_550_680_Closed_Image.style.display='inline'; Codehighlighter1_550_680_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_550_680_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_550_680_Closed_Text.style.display='none'; Codehighlighter1_550_680_Open_Image.style.display='inline'; Codehighlighter1_550_680_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_550_680_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_550_680_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;配置Spring的配置文件的方法。<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="COLOR: #808080">@see</span><span style="COLOR: #008000">&nbsp;org.springframework.test.AbstractDependencyInjectionSpringContextTests#getConfigLocations()<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_723_804_Open_Image onclick="this.style.display='none'; Codehighlighter1_723_804_Open_Text.style.display='none'; Codehighlighter1_723_804_Closed_Image.style.display='inline'; Codehighlighter1_723_804_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_723_804_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_723_804_Closed_Text.style.display='none'; Codehighlighter1_723_804_Open_Image.style.display='inline'; Codehighlighter1_723_804_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;String[]&nbsp;getConfigLocations()&nbsp;</span><span id=Codehighlighter1_723_804_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_723_804_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_747_800_Open_Image onclick="this.style.display='none'; Codehighlighter1_747_800_Open_Text.style.display='none'; Codehighlighter1_747_800_Closed_Image.style.display='inline'; Codehighlighter1_747_800_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_747_800_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_747_800_Closed_Text.style.display='none'; Codehighlighter1_747_800_Open_Image.style.display='inline'; Codehighlighter1_747_800_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;String[]&nbsp;</span><span id=Codehighlighter1_747_800_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_747_800_Open_Text><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">classpath:applicationContext-activemq-embedded.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br><br>三.为特殊的应用服务器，如resin ，也要选择特定的xml解析器<br>在web.xml中配置增加
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;In&nbsp;order&nbsp;to&nbsp;be&nbsp;able&nbsp;to&nbsp;compatiable&nbsp;with&nbsp;Resin&nbsp;2.1.x&nbsp;and&nbsp;3.0.x,<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;both&nbsp;XML&nbsp;and&nbsp;XSLT&nbsp;have&nbsp;to&nbsp;be&nbsp;replaced.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If&nbsp;only&nbsp;xalan&nbsp;is&nbsp;included,&nbsp;Resin&nbsp;2.1.x&nbsp;will&nbsp;fail&nbsp;but&nbsp;not&nbsp;3.0.x.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Therefore&nbsp;the&nbsp;best&nbsp;way&nbsp;is&nbsp;to&nbsp;use&nbsp;the&nbsp;compatiable&nbsp;version&nbsp;of&nbsp;the<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XML&nbsp;parser&nbsp;ans&nbsp;XSLT.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Please&nbsp;refere&nbsp;to&nbsp;the&nbsp;following&nbsp;link&nbsp;for&nbsp;more&nbsp;detailed&nbsp;information.<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;http://www.caucho.com/resin-3.0/xml/jaxp.xtp<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;xml&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">system-property&nbsp;</span><span style="COLOR: #ff0000">javax.xml.parsers.DocumentBuilderFactory</span><span style="COLOR: #0000ff">=<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">system-property&nbsp;</span><span style="COLOR: #ff0000">javax.xml.parsers.SAXParserFactory</span><span style="COLOR: #0000ff">=<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"org.apache.xerces.jaxp.SAXParserFactoryImpl"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;&nbsp;xslt&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">system-property&nbsp;</span><span style="COLOR: #ff0000">javax.xml.transform.TransformerFactory</span><span style="COLOR: #0000ff">=<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"org.apache.xalan.processor.TransformerFactoryImpl"</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><img src="http://www.blogjava.net/Images/dot.gif"><img src="http://www.blogjava.net/Images/dot.gif"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">web-app</span><span style="COLOR: #0000ff">&gt;</span></div>
<br><br><br>以上的以全部在实施中测试通过并且运行。大家可以方向使用和理解。如有疑问，相互交流.<br>
<img src ="http://www.blogjava.net/hellboys/aggbug/108737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2007-04-05 16:55 <a href="http://www.blogjava.net/hellboys/archive/2007/04/05/108737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ActiveMQ4.1 +Spring2.0的POJO JMS方案 扩展，以更加实用（基于ss）</title><link>http://www.blogjava.net/hellboys/archive/2007/04/01/107834.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Sun, 01 Apr 2007 13:56:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2007/04/01/107834.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/107834.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2007/04/01/107834.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/107834.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/107834.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 说明： 本文并非基础说明文章，如无基础，请先参阅：1. http://wiki.springside.org.cn/display/springside/ActiveMQ2. http://wiki.springside.org.cn/display/springside/ActiveMQ-part2仅以springside-2.0-RC1版本扩展由于为每个POJO类实现自己...&nbsp;&nbsp;<a href='http://www.blogjava.net/hellboys/archive/2007/04/01/107834.html'>阅读全文</a><img src ="http://www.blogjava.net/hellboys/aggbug/107834.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2007-04-01 21:56 <a href="http://www.blogjava.net/hellboys/archive/2007/04/01/107834.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一台主机被多台电脑监控 (keyword:cacti,snmp,snmpd.conf)</title><link>http://www.blogjava.net/hellboys/archive/2007/03/07/102331.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Wed, 07 Mar 2007 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2007/03/07/102331.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/102331.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2007/03/07/102331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/102331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/102331.html</trackback:ping><description><![CDATA[SNMPD.CONF(5)                                       SNMPD.CONF(5)<br /><br /><br /><br />NAME<br />       share/snmp/snmpd.conf  -  configuration  file for the ucd-<br />       snmp SNMP agent.<br /><br />DESCRIPTION<br />       snmpd.conf is the configuration file which defines how the<br />       ucd-smnp SNMP agent operates.  These files may contain any<br />       of the directives found in the DIRECTIVES  section  below.<br />       This  file  is  not  required for the agent to operate and<br />       report mib entries.<br /><br />PLEASE READ FIRST<br />       First, make sure you have read the  snmp_config(5)  manual<br />       page  that  describes how the ucd-snmp configuration files<br />       operate, where they are located  and  how  they  all  work<br />       together.<br /><br />EXTENSIBLE-MIB<br />       The  ucd-snmp  SNMP  agent reports much of its information<br />       through queries to the 1.3.6.1.4.1.2021 section of the mib<br />       tree.   Every  mib in this section has the following table<br />       entries in it.<br /><br />       .1 -- index<br />              This is the table's index numbers for each  of  the<br />              DIRECTIVES listed below.<br /><br />       .2 -- name<br />              The  name of the given table entry.  This should be<br />              unique, but is not required to be.<br /><br />       .100 -- errorFlag<br />              This is a flag returning either the integer value 1<br />              or  0 if an error is detected for this table entry.<br /><br />       .101 -- errorMsg<br />              This is a DISPLAY-STRING describing any error trig-<br />              gering the errorFlag above.<br /><br />       .102 -- errorFix<br />              If  this entry is SNMPset to the integer value of 1<br />              AND the errorFlag defined above is indeed  a  1,  a<br />              program  or script will get executed with the table<br />              entry name from above as the argument.  The program<br />              to  be  executed is configured in the config.h file<br />              at compile time.<br /><br />   Directives<br />       proc NAME<br /><br />       proc NAME MAX<br /><br />       proc NAME MAX MIN<br /><br />              Checks to see if the NAME'd processes  are  running<br />              on  the  agent's  machine.  An error flag (1) and a<br />              description  message  are  then   passed   to   the<br />              1.3.6.1.4.1.2021.2.100  and  1.3.6.1.4.1.2021.2.101<br />              mib tables (respectively) if the NAME'd program  is<br />              not  found  in  the  process  table  as reported by<br />              "/bin/ps -e".<br /><br />              If MAX and MIN are not specified, MAX is assumed to<br />              be infinity and MIN is assumed to be 1.<br /><br />              If  MAX  is specified but MIN is not specified, MIN<br />              is assumed to be 0.<br /><br />       procfix NAME PROG ARGS<br />              This registers a command  that  knows  how  to  fix<br />              errors   with   the   given   process  NAME.   When<br />              1.3.6.1.4.1.2021.2.102 for a given NAMEd program is<br />              set to the integer value of 1, this command will be<br />              called.  It defaults to a compiled value set  using<br />              the PROCFIXCMD definition in the config.h file.<br /><br />       exec NAME PROG ARGS<br /><br />       exec MIBNUM NAME PROG ARGS<br /><br />              If  MIBNUM is not specified, the agent executes the<br />              named PROG with arguments of ARGS and  returns  the<br />              exit status and the first line of the STDOUT output<br />              of   the   PROG   program   to   queries   of   the<br />              1.3.6.1.4.1.2021.8.100  and  1.3.6.1.4.1.2021.8.101<br />              mib  tables  (respectively).   All  STDOUT   output<br />              beyond the first line is silently truncated.<br /><br />              If  MIBNUM  is  specified,  it  acts  as  above but<br />              returns the exit status  to  MIBNUM.100.0  and  the<br />              entire  STDOUT  output to the table MIBNUM.101 in a<br />              mib table.  In this case, the MIBNUM.101  mib  con-<br />              tains the entire STDOUT output, one mib table entry<br />              per line of output (ie, the first line is output as<br />              MIBNUM.101.1,  the second at MIBNUM.101.2, etc...).<br /><br />              Note:  The MIBNUM must be specified in dotted-inte-<br />                     ger  notation  and  can  not be specified as<br />                     ".iso.org.dod.internet..."  (should  instead<br />                     be<br /><br />              Note:  The  agent caches the exit status and STDOUT<br />                     of the executed program for 30 seconds after<br />                     the  initial  query.   This  is  to increase<br />                     speed and maintain consistency  of  informa-<br />                     tion  for  consecutive  table  queries.  The<br />                     cache can be flushed by a  snmp-set  request<br />                     of  integer(1)  to 1.3.6.1.4.1.2021.100.VER-<br />                     CLEARCACHE.<br /><br />       execfix NAME PROG ARGS<br />              This registers a command  that  knows  how  to  fix<br />              errors  with  the  given  exec  or  sh  NAME.  When<br />              1.3.6.1.4.1.2021.8.102 for a given NAMEd  entry  is<br />              set to the integer value of 1, this command will be<br />              called.  It defaults to a compiled value set  using<br />              the EXECFIXCMD definition in the config.h file.<br /><br />       disk PATH<br /><br />       disk PATH [ MINSPACE | MINPERCENT% ]<br /><br />              Checks  the  named disks mounted at PATH for avail-<br />              able disk space.  If the disk space  is  less  than<br />              MINSPACE  (kB) if specified or less than MINPERCENT<br />              (%) if a  %  sign  is  specified,  or  DEFDISKMINI-<br />              MUMSPACE  (kB)  if  not  specified,  the associated<br />              entry in the 1.3.6.1.4.1.2021.9.100 mib table  will<br />              be  set to (1) and a descriptive error message will<br />              be returned to queries of 1.3.6.1.4.1.2021.9.101.<br /><br />       load MAX1<br /><br />       load MAX1 MAX5<br /><br />       load MAX1 MAX5 MAX15<br /><br />              Checks the load average of the machine and  returns<br />              an error flag (1), and an text-string error message<br />              to   queries   of    1.3.6.1.4.1.2021.10.100    and<br />              1.3.6.1.4.1.2021.10.101   (respectively)  when  the<br />              1-minute, 5-minute, or  15-minute  averages  exceed<br />              the associated maximum values.  If any of the MAX1,<br />              MAX5, or MAX15 values are unspecified, they default<br />              to a value of DEFMAXLOADAVE.<br /><br />       file FILE [MAXSIZE]<br />              Monitors  file sizes and makes sure they don't grow<br />              beyond a certain size.  MAXSIZE defaults  to  infi-<br />              nite  if  not specified, and only monitors the size<br />              without reporting errors about it.<br /><br />   Errors<br />       Any errors in obtaining the above information are reported<br />       via    the    1.3.6.1.4.1.2021.101.100    flag   and   the<br />       1.3.6.1.4.1.2021.101.101 text-string description.<br /><br />SMUX SUB-AGENTS<br />       To enable and SMUX based sub-agent, such as gated, use the<br />       smuxpeer configuration entry<br /><br />       smuxpeer OID PASS<br />              For gated a sensible entry might be<br /><br />       .1.3.6.1.4.1.4.1.3 secret<br /><br />ACCESS CONTROL<br />       snmpd  supports the View-Based Access Control Model (vacm)<br />       as defined in RFC 2275.  To this end,  it  recognizes  the<br />       following  keywords  in  the  configuration file: com2sec,<br />       group, access, and view  as  well  as  some  easier-to-use<br />       wrapper   directives:  rocommunity,  rwcommunity,  rouser,<br />       rwuser.<br /><br />       rocommunity COMMUNITY [SOURCE] [OID]<br /><br />       rwcommunity COMMUNITY [SOURCE] [OID]<br />              These create read-only and  read-write  communities<br />              that  can  be used to access the agent.  They are a<br />              quick method of using the following com2sec, group,<br />              access,  and view directive lines.  They are not as<br />              efficient either, as groups aren't created  so  the<br />              tables  are possibly larger.  In other words: don't<br />              use these if you have complex situations to set up.<br /><br />              The  format  of the SOURCE is token is described in<br />              the com2sec directive section below.  The OID token<br />              restricts  access  for that community to everything<br />              below that given OID.<br /><br />       rouser USER [noauth|auth|priv] [OID]<br /><br />       rwuser USER [noauth|auth|priv] [OID]<br />              Creates a  SNMPv3  USM  user  in  the  VACM  access<br />              configuration  tables.   Again,  its more efficient<br />              (and powerful) to use the combined com2sec,  group,<br />              access, and view directives instead.<br /><br />              The minimum level of authentication and privacy the<br />              user must use  is  specified  by  the  first  token<br />              (which  defaults  to  "auth").   The  OID parameter<br />              restricts access for that user to everything  below<br />              the given OID.<br /><br />       com2sec NAME SOURCE COMMUNITY<br />              This   directive   specifies  the  mapping  from  a<br />              source/community pair to a  security  name.  SOURCE<br />              can be a hostname, a subnet, or the word "default".<br />              A subnet can be specified as  IP/MASK  or  IP/BITS.<br />              The first source/community combination that matches<br />              the incoming packet is selected.<br /><br />       group NAME MODEL SECURITY<br />              This directive defines the mapping  from  security-<br />              model/securityname  to  group.  MODEL is one of v1,<br />              v2c, or usm.<br /><br />       access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY<br />              The  access  directive  maps  from   group/security<br />              model/security  level  to  a view.  MODEL is one of<br />              any, v1, v2c, or usm.   LEVEL  is  one  of  noauth,<br />              auth,  or priv.  PREFX specifies how CONTEXT should<br />              be matched against the context of the incoming pdu,<br />              either  exact  or  prefix.   READ, WRITE and NOTIFY<br />              specifies the view to be used for the corresponding<br />              access.   For  v1  or  v2c  access,  LEVEL  will be<br />              noauth, and CONTEXT will be empty.<br /><br />       view NAME TYPE SUBTREE [MASK]<br />              The defines the named view. TYPE is either included<br />              or  excluded.   MASK is a list of hex octets, sepa-<br />              rated by '.' or ':'.  The MASK defaults to "ff"  if<br />              not specified.<br /><br />              The  reason  for the mask is, that it allows you to<br />              control access to one row in a table,  in  a  rela-<br />              tively  simple  way.  As  an example, as an ISP you<br />              might consider giving each customer access  to  his<br />              or her own interface:<br /><br />              view cust1 included interfaces.ifTable.ifEntry.ifIndex.1 ff.a0<br />              view cust2 included interfaces.ifTable.ifEntry.ifIndex.2 ff.a0<br /><br />              (interfaces.ifTable.ifEntry.ifIndex.1 == .1.3.6.1.2.1.2.2.1.1.1,<br />              ff.a0 == 11111111.10100000. which nicely covers up and including<br />              the row index, but lets the user vary the field of the row)<br /><br />       VACM Examples:<br />              #       sec.name  source          community<br />              <strong>com2sec local     localhost       private<br />              com2sec mynet     10.10.10.0/24   public<br />              com2sec public    default         public<br /><br />              #             sec.model  sec.name<br />              group mygroup v1         mynet<br />              group mygroup v2c        mynet<br />              group mygroup usm        mynet<br />              group local   v1         local<br />              group local   v2c        local<br />              group local   usm        local<br />              group public  v1         public<br />              group public  v2c        public<br />              group public  usm        public<br /><br />              #           incl/excl subtree                          mask<br />              view all    included  .1                               80<br />              view system included  system                           fe<br />              view mib2   included  .iso.org.dod.internet.mgmt.mib-2 fc<br /><br />              #              context sec.model sec.level prefix read   write notify<br />              access mygroup ""      any       noauth    exact  mib2   none  none<br />              access public  ""      any       noauth    exact  system none  none<br />              access local   ""      any       noauth    exact  all    all   all<br /></strong><br />       Default VACM model<br />              The default configuration of the agent, as shipped, is functionally<br />              equivalent to the following entries:<br />              com2sec   public    default   public<br />              group     public    v1   public<br />              group     public    v2c  public<br />              group     public    usm  public<br />              view      all  included  .1<br />              access    public    ""   any  noauth    exact     all  none none<br /><br />SNMPv3 CONFIGURATION<br />       engineID STRING<br />              The  snmpd  agent  needs  to  be configured with an<br />              engineID to be able to respond to SNMPv3  messages.<br />              With  this  configuration  file  line, the engineID<br />              will be configured from STRING.  The default  value<br />              of  the  engineID  is  configured with the first IP<br />              address found for the hostname of the machine.<br /><br />       createUser username (MD5|SHA) authpassphrase [DES]  [priv-<br />       passphrase]<br />              This directive should be placed into the "/var/ucd-<br />              snmp"/snmpd.conf  file  instead of the other normal<br />              locations.  The reason is that the  information  is<br />              read  from  the  file  and then the line is removed<br />              (eliminating the storage of the master password for<br />              that  user)  and  replaced  with  the  key  that is<br />              derived from it.  This key is a localized  key,  so<br />              that  if  it is stolen it can not be used to access<br />              other agents.  If the password is stolen,  however,<br />              it can be.<br /><br />              MD5  and  SHA  are the authentication types to use,<br />              but you must have built the  package  with  openssl<br />              installed  in  order  to use SHA.  The only privacy<br />              protocol currently supported is DES.  If  the  pri-<br />              vacy  passphrase is not specified, it is assumed to<br />              be the same as the authentication passphrase.  Note<br />              that  the users created will be useless unless they<br />              are also added to the VACM  access  control  tables<br />              described above.<br /><br />              Warning:  the minimum pass phrase length is 8 char-<br />              acters.<br /><br />              SNMPv3 users can be created at  runtime  using  the<br />              snmpusm command.<br /><br /><br />SETTING SYSTEM INFORMATION<br />       syslocation STRING<br /><br />       syscontact STRING<br /><br />              Sets the system location and the system contact for<br />              the agent.  This information  is  reported  by  the<br />              'system' table in the mibII tree.<br /><br />       authtrapenable NUMBER<br />              Setting  authtrapenable  to 1 enables generation of<br />              authentication failure traps. The default value  is<br />              2 (disable).<br /><br />       trapcommunity STRING<br />              This  defines  the  default  community string to be<br />              used when sending traps.  Note  that  this  command<br />              must  be  used  prior to any of the following three<br />              commands  that  are  intended  use  this  community<br />              string.<br /><br />       trapsink HOST [COMMUNITY [PORT]]<br /><br />       trap2sink HOST [COMMUNITY [PORT]]<br /><br />       informsink HOST [COMMUNITY [PORT]]<br />              These  commands  define  the hosts to receive traps<br />              (and/or inform notifications). The daemon  sends  a<br />              Cold  Start  trap when it starts up. If enabled, it<br />              also sends traps on authentication failures.   Mul-<br />              tiple  trapsink, trap2sink and informsink lines may<br />              be specified to specify multiple destinations.  Use<br />              trap2sink  to  send  SNMPv2 traps and informsink to<br />              send inform notifications.   If  COMMUNITY  is  not<br />              specified,  the  string from a preceding trapcommu-<br />              nity directive will be used. If PORT is not  speci-<br />              fied,  the  well known SNMP trap port (162) will be<br />              used.<br /><br />PASS-THROUGH CONTROL<br />       pass MIBOID EXEC<br />              Passes entire control of MIBOID to  the  EXEC  pro-<br />              gram.   The  EXEC  program  is called in one of the<br />              following three ways:<br /><br />              EXEC -g MIBOID<br /><br />              EXEC -n MIBOID<br /><br />                     These call lines match to SNMP get and  get-<br />                     next requests.  It is expected that the EXEC<br />                     program will take the arguments passed to it<br />                     and  return the appropriate response through<br />                     it's stdout.<br /><br />                     The first line of stdout should be  the  mib<br />                     OID of the returning value.  The second line<br />                     should be the TYPE of value returned,  where<br />                     TYPE  is  one  of  the text strings: string,<br />                     integer,  unsigned,   objectid,   timeticks,<br />                     ipaddress,  counter,  or  gauge.   The third<br />                     line of stdout should be  the  VALUE  corre-<br />                     sponding with the returned TYPE.<br /><br />                     For  instance, if a script was to return the<br />                     value integer value "42" when a request  for<br />                     .1.3.6.1.4.100  was  requested,  the  script<br />                     should return the following 3 lines:<br />                       .1.3.6.1.4.100<br />                       integer<br />                       42<br /><br />                     To indicate that the  script  is  unable  to<br />                     comply with the request due to an end-of-mib<br />                     condition or an invalid request, simple exit<br />                     and  return  no  output to stdout at all.  A<br />                     snmp error will be  generated  corresponding<br />                     to the SNMP NO-SUCH-NAME response.<br /><br />              EXEC -s MIBOID TYPE VALUE<br /><br />                     For SNMP set requests, the above call method<br />                     is used.  The TYPE passed to the  EXEC  pro-<br />                     gram  is  one  of the text strings: integer,<br />                     counter, gauge, timeticks, ipaddress, objid,<br />                     or  string,  indicating  the  type  of value<br />                     passed in the next argument.<br /><br />                     Return nothing to stdout, and the  set  will<br />                     assumed to have been successful.  Otherwise,<br />                     return one of the following error strings to<br />                     signal an error: not-writable, or wrong-type<br />                     and the appropriate error response  will  be<br />                     generated instead.<br /><br />                      Note:  By   default,   the  only  community<br />                             allowed to  write  (ie  snmpset)  to<br />                             your  script  will  be the "private"<br />                             community,or community #2 if defined<br />                             differently by the "community" token<br />                             discussed above.  Which  communities<br />                             are  allowed  write  access are con-<br />                             trolled by the RWRITE definition  in<br />                             the snmplib/snmp_impl.h source file.<br /><br />EXAMPLE<br />       See the EXAMPLE.CONF file in the top level  source  direc-<br />       tory for a more detailed example of how the above informa-<br />       tion is used in real examples.<br /><br />RE-READING snmpd.conf and snmpd.local.conf<br />       The ucd-snmp agent can be forced to re-read its configura-<br />       tion files.  It can be told to do so by one of two ways:<br /><br />       1.     An       snmpset       of       integer(1)       to<br />              1.3.6.1.4.1.2021.100.VERUPDATECONFIG.<br /><br />       2.     A "kill -HUP" signal sent to the snmpd  agent  pro-<br />              cess.<br /><br />FILES<br />       share/snmp/snmpd.conf<br /><br />SEE ALSO<br />       snmp_config(5), snmpd(1), EXAMPLE.conf, read_config(3).<br /><br /><br /><br />                           27 Jan 2000              SNMPD.CONF(5)<br /><img src ="http://www.blogjava.net/hellboys/aggbug/102331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2007-03-07 10:27 <a href="http://www.blogjava.net/hellboys/archive/2007/03/07/102331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>妙解网络多台dhcp引起的IP冲突 </title><link>http://www.blogjava.net/hellboys/archive/2006/11/15/81181.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Wed, 15 Nov 2006 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2006/11/15/81181.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/81181.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2006/11/15/81181.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/81181.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/81181.html</trackback:ping><description><![CDATA[客人在我所供职的酒店上网的时候，经常会弹出一个对话框，显示一些提示，如上网的注意事项和消费标准等信息;并且有自己的电影和歌曲服务器，DHCP-server也是其中的一台服务器，宾馆、酒店就是用这台机器，为客户分配IP地址提供上网功能，即客户把自己的计算机连上网线，网卡配置自动获取IP地址，就会从动态主机配置协议(DHCP)服务器分配到一个IP地址;采用DHCP server可以自动为用户设置网络IP地址、掩码、网关、DNS、Wins 等网络参数，简化了用户网络设置，提高了管理效率。 <br /><br />　　那么我们的问题也出现了:常见的，很多用户抱怨用这种方法上不了网，但不是所有客户都上不了网。经过调查发现，住宾馆、酒店的人绝大多数是商务人员和工程师，他们携带的手提电脑一般安装的是Windows server版本，server版本默认启动了DHCP server功能，当一台这样的计算机连入网络，在他之后的计算机就会把他当成DHCP服务器，并被分配了不正确的IP地址，从而上不了网。 <br /><br />　　<b>DHCP服务器地址分配方式</b><br /><br />　　DHCP是一种用于简化主机IP配置管理的协议标准。通过采用DHCP标准，可以使用DHCP服务器为网络上所有启用了DHCP的客户端分配、配置、跟踪和更改(必要时)所有TCP/IP设置。此外，DHCP还可以确保不使用重复地址、重新分配未使用的地址，并且可以自动为主机连接的子网分配适当的IP地址。当一个网络中，有2个或2个以上的DHCP服务器时，提醒切勿将DHCP地址池定义的过大，以免多个地址池之间出现“包含于”的关系，或者是部分客户端手工指定的IP地址包含于DHCP服务器的地址池中，从而造成DHCP的一些异常故障。 <br /><br />　　针对不同的需求，DHCP服务器有三种机制分配IP地址: <br /><br />　　自动分配 DHCP服务器给首次连接到网络的某些客户端分配固定IP地址，该地址由用户长期使用; <br /><br />　　动态分配 DHCP服务器给客户端分配有时间限制的IP地址，使用期限到期后，客户端需要重新申请地址，客户端也可以主动释放该地址。绝大多数客户端主机得到的是这种动态分配的地址; <br /><br />　　手动分配 由网络管理员为客户端指定固定的IP地址。 <br /><br />　　三种地址分配方式中，只有动态分配可以重复使用客户端不再需要的地址。 <br /><br />　　每项技术都是有利有弊的，DHCP也不例外，由于DHCP有着配置简单，管理方便的优点，问题也随之产生，由于DHCP的运作机制，通常服务器和客户端没有认证机制，如果网络上存在多台DHCP服务器将会给网络造成混乱。由于用户不小心配置了DHCP服务器引起的网络混乱非常常见，足可见此问题的普遍性。 <br /><br />　　本人在从事网络工作的几年里，遇到过很多问题，其中有关DHCP-server冲突的不在少数，在解决问题的同时也总结了一些经验，在这里简单介绍一下，与大家分享，希望给在解决此类问题的同行一些帮助，也希望广大高手指出其中的不足和需要改进的地方。<br /><br /><strong>DHCP服务器冲突的解决方法</strong><br /><br />　　<b>使用DHCP snooping技术来解决</b><br /><br />　　针对这种DHCP服务器冲突的解决方法有很多，最直接的方法就是贴告示，让入住的客户在上网时关闭Windows的DHCP网络服务，这个选项在‘控制面板’，‘管理工具’里的‘DHCP网络服务’，进入关闭即可。这里要注意的是，非server版的Windows不用关闭，并且不要把‘控制面板’，‘管理工具’，‘服务’中的DHCP client给停止了，这样是分配不到地址的。 <br /><br />　　当然上面的方法比较被动也不合常理，更不便于我们网络的管理，所以还是应该从我们网络本身出发来解决问题。 <br /><br />　　既然是DHCP的问题，那么我们就用DHCP的技术来解决问题，比较有代表的就是DHCP snooping技术。DHCP snooping技术是DHCP安全特性，通过建立和维护DHCP snooping绑定表过滤不可信任的DHCP信息，这些信息是指来自不信任区域的DHCP信息。DHCP snooping绑定表包含不信任区域的用户mac地址、IP地址、租用期、vlan-id接口等信息。 <br /><br />　　首先定义交换机上的信任端口和不信任端口，其中信任端口连接DHCP服务器或其他交换机的端口;不信任端口连接用户或网络。不信任端口将接收到的DHCP服务器响应的DHCP ack 和DHCP off报文丢弃;而信任端口将此配置中的命令都是以CISCO的设备为基础，但不管是哪个公司的设备，总体设计思想是一致的，不同的可能在命令格式上略有差异，工作人员应该根据具体的实际情况来解决相应的问题。 <br /><br />　　在全局模式下启动DHCP snooping功能，这个默认是关闭的，而且不是所有设备都支持这个功能，最好先看使用说明。 <br /><br />　　switch(config)#ip dhcp-snooping <br /><br />　　如果有vlan就使用下面的命令来监测具体的vlan <br /><br />　　switch(config)#ip dhcp-snooping vlan vlan-id <br /><br />　　然后定义可信任的端口，默认情况交换机的端口均为不信任端口，通常网络设备接口， TRUNK 接口和连接DHCP服务器的端口定义为可信任端口。 <br /><br />　　switch(config)#int f0/x <br /><br />　　switch(config-if)#ip dhcp snooping trust <br /><br /><strong>使用PVLAN技术来解决</strong><br /><br />　　有很多二层的技术可以防止DHCP-server冲突的，PVLAN就是其中一个运用比较广的技术。 <br /><br />　　PVLAN私有局域网(private vlan)，在PVLAN的概念里，端口有3种类型:Isolated port，Community port, Promiscuous port;它们分别对应不同的vlan类型:Isolated port属于Isolated PVLAN，Community port属于Community PVLAN，而代表一个Private vlan整体的是Primary vlan，前面两类vlan需要和它绑定在一起，同时它还包括Promiscuous port。在Isolated PVLAN中，Isolated port只能和Promiscuous port，彼此之间不能访问;在Community PVLAN中，vlan与vlan之间都不能访问，同一Community vlan的接口可以互相访问，并且所有Community vlan的接口都可以与Promiscuous port进行通信。利用这项技术，我们可以把上连或连接DHCP服务器的接口定义为Promiscuous port，其他接口分配到Isolated vlan里，这样所有接口都只能与上连或DHCP服务器进行通信，即使有一台机器设为DHCP服务器，其他机器也不会与它产生流量，把它做为服务器。 <br /><br />　　利用这个技术解决DHCP-server冲突的方法有很多，也很灵活，下面介绍一种比较简单的方法，也是用的比较多的: <br /><br />　　首先把交换机配置成transparents模式:　　 <br /><br />　　switch(config)#vtp mode transparent <br /><br />　　顺便可以打开端口的保护功能，它的意思是打开端口保护的端口之间不能访问，但打开保护的端口可以与没有开启此项功能的端口通信，可以根据自己的需求来打开保护功能: <br /><br />　　switch(config)#int range f0/124 <br /><br />　　switch(config-if-range)#switchitchport protected <br /><br />　　建立isolated vlan和primary vlan，把isolated vlan定义为primary lan的附属vlan，因为要与primary互相访问: <br /><br />　　switch(config)#vlan 14 <br /><br />　　switch(config-vlan)private-vlan isolated <br /><br />　　switch(config)#vlan 44 <br /><br />　　switch(config-vlan)#private-vlan primary <br /><br />　　switch(config-vlan)#private-vlan association 14 <br /><img src ="http://www.blogjava.net/hellboys/aggbug/81181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2006-11-15 10:22 <a href="http://www.blogjava.net/hellboys/archive/2006/11/15/81181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不得不笑！ 上班时什么人听什么音乐!!</title><link>http://www.blogjava.net/hellboys/archive/2006/10/20/76405.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Fri, 20 Oct 2006 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2006/10/20/76405.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/76405.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2006/10/20/76405.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/76405.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/76405.html</trackback:ping><description><![CDATA[
		<table class="tableid" cellspacing="0" cellpadding="0" width="94%" border="0">
				<tbody>
						<tr>
								<td class="h20" width="94%">
										<p align="center">
												<font color="#f35091" size="2">
														<strong>
														</strong>
												</font> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>真的很不错呢！转载过来和大家一起分享！</strong>
												</font>
										</p>
										<p align="center">
												<strong>
														<font color="#f35091" size="2">
														</font>
												</strong>
												<br />
												<a href="http://blog.rayli.com.cn/PhotoUpload/200610200413358.gif" target="_blank">
														<img src="http://blog.rayli.com.cn/PhotoUpload/200610200413358.gif" border="0" />
												</a>
												<br />
										</p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>我是一个普通的中层领导,每天有条有序的工作,顺便听听能使人放松的流行音乐...</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/2006101923400854.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/2006101923400854.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center"> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>我们的老板就不一样了,他很喜欢听节奏感很强的舞曲..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019234416797.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019234416797.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center"> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>隔壁的小王是个很激进的年轻人..他喜欢听朋克..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/2006101923455603.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/2006101923455603.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>董事长是个有生活有故事的人...没事总带两张古典唱片..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019234827510.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019234827510.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>总监活着比较累,听音乐的时候还要看着大家干没干活儿...</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019234937842.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019234937842.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>对面新来的小伙子总是边听着嘻哈音乐边打字..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/2006101923505616.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/2006101923505616.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>副总长相比较深沉,但其实他只听刀郎和火风...</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/2006101923528725.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/2006101923528725.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>市场部的小伙子总是出差,听音乐的时候表情像ET..压力比较大吧</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/2006101923545445.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/2006101923545445.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center"> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>技术部的同事压力也是比较大的那种..听音乐的时候动作比较亢奋..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019235432388.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019235432388.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>底层的销售人员他们通常爱听重金属音乐,时不时放两声开开嗓子..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019235451872.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019235451872.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center"> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>财务部的会计老张记帐的时候总爱听茉莉花..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019235520567.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019235520567.gif" border="0" />
																</strong>
														</font>
												</a>
										</p>
										<p align="center">
												<br /> </p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>美工MM是个哈日的小女孩..听着宇多田还要仔细盯着电脑做图..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019235550762.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019235550762.gif" border="0" />
																</strong>
														</font>
												</a>
												<br />
										</p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>．．．．．．</strong>
												</font>
										</p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>．．．．．．</strong>
												</font>
										</p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>．．．．．．</strong>
												</font>
										</p>
										<p align="center">
												<font color="#f35091" size="2">
														<strong>下班了..大家共同的爱好就是看看A片什么的..</strong>
												</font>
										</p>
										<p align="center">
												<a href="http://blog.rayli.com.cn/PhotoUpload/20061019235641481.gif" target="_blank">
														<font color="#f35091" size="2">
																<strong>
																		<img src="http://blog.rayli.com.cn/PhotoUpload/20061019235641481.gif" border="0" />
																</strong>
														</font>
												</a>
												<br />
												<br />
												<br />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/hellboys/aggbug/76405.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellboys/" target="_blank">地狱男爵(hellboys)</a> 2006-10-20 16:21 <a href="http://www.blogjava.net/hellboys/archive/2006/10/20/76405.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>P2P之UDP穿透NAT的原理与实现</title><link>http://www.blogjava.net/hellboys/archive/2006/09/13/69263.html</link><dc:creator>地狱男爵(hellboys)</dc:creator><author>地狱男爵(hellboys)</author><pubDate>Tue, 12 Sep 2006 16:32:00 GMT</pubDate><guid>http://www.blogjava.net/hellboys/archive/2006/09/13/69263.html</guid><wfw:comment>http://www.blogjava.net/hellboys/comments/69263.html</wfw:comment><comments>http://www.blogjava.net/hellboys/archive/2006/09/13/69263.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/hellboys/comments/commentRss/69263.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellboys/services/trackbacks/69263.html</trackback:ping><description><![CDATA[
		<h2 class="diaryTitle">P2P之UDP穿透NAT的原理与实现 - 增强篇(附修改过的源代码)</h2>
		<br />
		<p>------------------------------------------------------------------------------------------------------------</p>
		<p>NAT(The IP Network Address Translator) 的概念和意义是什么?</p>
		<p>NAT, 中文翻译为网络地址转换。具体的详细信息可以访问RFC 1631 - <a href="http://www.faqs.org/rfcs/rfc1631.html">http://www.faqs.org/rfcs/rfc1631.html</a>, 这是对于NAT的定义和解释的最权威的描述。网络术语都是很抽象和艰涩的，除非是专业人士，否则很难从字面中来准确理解NAT的含义。</p>
		<p>要想完全明白NAT 的作用，我们必须理解IP地址的两大分类，一类是私有IP地址，在这里我们称作内网IP地址。一类是非私有的IP地址，在这里我们称作公网IP地址。关于IP地址的概念和作用的介绍参见我的另一篇文章: <a href="http://hwycheng.blogchina.com/2402121.html">http://hwycheng.blogchina.com/2402121.html</a></p>
		<p>内网IP地址: 是指使用A/B/C类中的私有地址, 分配的IP地址在全球不惧有唯一性，也因此无法被其它外网主机直接访问。<br />公网IP地址: 是指具有全球唯一的IP地址，能够直接被其它主机访问的。</p>
		<p>NAT
最初的目的是为使用内网IP地址的计算机提供通过少数几台具有公网的IP地址的计算机访问外部网络的功能。NAT
负责将某些内网IP地址的计算机向外部网络发出的IP数据包的源IP地址转换为NAT自己的公网的IP地址，目的IP地址不变,
并将IP数据包转发给路由器，最终到达外部的计算机。同时负责将外部的计算机返回的IP数据包的目的IP地址转换为内网的IP地址，源IP地址不变，并最
终送达到内网中的计算机。<br />                                                 <br />        ----------------------                           ----------------------               <br />        | 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host<br />        ----------------------                           ----------------------               <br />                ^ port:2809                                      ^port: 1827                            <br />                |                                                |                            <br />                V                                                V                            <br />        ----------------------                           ----------------------               <br />        | 192.168.0.1        | NAT device                | 192.168.0.2        | NAT device    <br />        | 61.51.99.86        |                           | 61.51.77.66        |               <br />        ----------------------                           ----------------------               <br />                ^                                                ^                            <br />                |                                                |                            <br />                V port:80                                        V port: 80                           <br />        ----------------------                           ----------------------               <br />        | 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host <br />        ----------------------                           ----------------------               <br />                                                            <br />                              图一: NAT 实现了私有IP的计算机分享几个公网IP地址访问Internet的功能。<br />                              <br />随
着网络的普及，IPv4的局限性暴露出来。公网IP地址成为一种稀缺的资源，此时NAT
的功能局限也暴露出来，同一个公网的IP地址，某个时间只能由一台私有IP地址的计算机使用。于是NAPT(The IP Network
Address/Port
Translator)应运而生，NAPT实现了多台私有IP地址的计算机可以同时通过一个公网IP地址来访问Internet的功能。这在很大程度上暂
时缓解了IPv4地址资源的紧张。</p>
		<p>NAPT
负责将某些内网IP地址的计算机向外部网络发出的TCP/UDP数据包的源IP地址转换为NAPT自己的公网的IP地址，源端口转为NAPT自己的一个端
口。目的IP地址和端口不变,
并将IP数据包发给路由器，最终到达外部的计算机。同时负责将外部的计算机返回的IP数据包的目的IP地址转换内网的IP地址，目的端口转为内网计算机的
端口，源IP地址和源端口不变，并最终送达到内网中的计算机。</p>
		<p>                                                 <br />                ----------------------                           ----------------------               <br />                | 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host<br />                ----------------------                           ----------------------               <br />                        port: 2809      ^                   ^ port: 1827<br />                                         \                 /<br />                                          v               v                             <br />                                        ----------------------            <br />                                        | 192.168.0.1        | NAT device <br />                                        | 61.51.99.86        |            <br />                                        ----------------------                                  <br />        map port:9882 to 192.168.0.5:2809 ^              ^ map port: 9881 to 192.168.0.6:1827<br />                                         /                \<br />                             port:80    v                  v    port:80                         <br />                ----------------------                           ----------------------               <br />                | 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host <br />                ----------------------                           ----------------------                                 <br />                                <br />                              图二: NAPT 实现了私有IP的计算机分享一个公网IP地址访问Internet的功能。                                             <br /> <br />在
我们的工作和生活中,
NAPT的作用随处可见，绝大部分公司的网络架构，都是通过1至N台支持NAPT的路由器来实现公司的所有计算机连接外部的Internet网络的。包括
本人在写这篇文章的时候，也是在家中使用一台IBM笔记本通过一台宽带连接的台式机来访问Internet的。我们本篇文章主要讨论的NAPT的问题。</p>
		<p>NAPT(The IP Network Address/Port Translator) 为何阻碍了P2P软件的应用?</p>
		<p>通
过NAPT
上网的特点决定了只能由NAPT内的计算机主动向NAPT外部的主机发起连接，外部的主机想直接和NAPT内的计算机直接建立连接是不被允许的。IM(即
时通讯)而言，这意味着由于NAPT内的计算机和NAPT外的计算机只能通过服务器中转数据来进行通讯。对于P2P方式的下载程序而言，意味着NAPT内
的计算机不能接收到NAPT外部的连接，导致连接数用过少，下载速度很难上去。因此P2P软件必须要解决的一个问题就是要能够在一定的程度上解决NAPT
内的计算机不能被外部连接的问题。</p>
		<p>NAT(The IP Network Address Translator) 进行UDP穿透的原理是什么?</p>
		<p>TCP/IP
传输时主要用到TCP和UDP协议。TCP协议是可靠的，面向连接的传输协议。UDP是不可靠的，无连接的协议。根据TCP和UDP协议的实现原理，对于
NAPT来进行穿透，主要是指的UDP协议。TCP协议也有可能，但是可行性非常小，要求更高，我们此处不作讨论，如果感兴趣可以到Google上搜索，
有些文章对这个问题做了探讨性的描述。下面我们来看看利用UDP协议来穿透NAPT的原理是什么:</p>
		<p>                        ----------------------                           ----------------------               <br />                        | 192.168.0.5        |  Internat host            | 192.168.0.6        |  Internat host<br />                        ----------------------                           ----------------------               <br />                          UDP port: 2809        ^                   ^ UDP port: 1827<br />                                                 \                 /<br />                                                  v               v                             <br />                                                ----------------------            <br />                                                | 192.168.0.1        | NAT device <br />                                                | 61.51.99.86        |            <br />                                                ----------------------                                  <br />  Session(192.168.0.6:1827 &lt;-&gt; 61.51.76.102:8098) ^              ^ Session(192.168.0.6:1827 &lt;-&gt; 61.51.76.102:8098)<br />               map port:9882 to 192.168.0.5:2809 /                \map port: 9881 to 192.168.0.6:1827<br />                                  UDP port:8098 v                  v    UDP port:8098                           <br />                        ----------------------                           ----------------------               <br />                        | 61.51.202.88       | Internet host             | 61.51.76.102       | Internet host <br />                        ----------------------                           ----------------------                 <br />                                                        <br />                                        <br />                                      图三: NAPT 是如何将私有IP地址的UDP数据包与公网主机进行透明传输的。</p>
		<p>UDP协议包经NAPT透明传输的说明:</p>
		<p>NAPT
为每一个Session分配一个NAPT自己的端口号，依据此端口号来判断将收到的公网IP主机返回的TCP/IP数据包转发给那台内网IP地址的计算
机。在这里Session是虚拟的，UDP通讯并不需要建立连接，但是对于NAPT而言，的确要有一个Session的概念存在。NAPT对于UDP协议
包的透明传输面临的一个重要的问题就是如何处理这个虚拟的Session。我们都知道TCP连接的Session以SYN包开始，以FIN包结束，
NAPT可以很容易的获取到TCP
Session的生命周期，并进行处理。但是对于UDP而言，就麻烦了，NAPT并不知道转发出去的UDP协议包是否到达了目的主机，也没有办法知道。而
且鉴于UDP协议的特点，可靠很差，因此NAPT必须强制维持Session的存在，以便等待将外部送回来的数据并转发给曾经发起请求的内网IP地址的计
算机。NAPT具体如何处理UDP
Session的超时呢？不同的厂商提供的设备对于NAPT的实现不近相同，也许几分钟，也许几个小时，些NAPT的实现还会根据设备的忙碌状态进行智能
计算超时时间的长短。</p>
		<p>                  [192.168.0.6:1827]<br />                            | UDP Packet[src ip:192.168.0.6 src port:1827 dst ip:61.51.76.102 dst port 8098]<br />                            v<br />        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]<br />                            | UDP Packet[src ip:61.51.99.86 src port:9881 dst ip:61.51.76.102 dst port 8098]<br />                            v                   <br />                  [61.51.76.102:8098]<br />                  <br />                                    图四: NAPT 将内部发出的UDP协议包的源地址和源端口改变传输给公网IP主机。<br />                                    <br />                                    <br />                  [192.168.0.6:1827]<br />                            ^<br />                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:192.168.0.6 dst port 1827]<br />        [pub ip: 61.51.99.86]NAT[priv ip: 192.168.0.1]<br />                            ^   <br />                            | UDP Packet[src ip:61.51.76.102 src port:8098 dst ip:61.51.99.86 dst port 9881]    <br />                  [61.51.76.102:8098]<br />                  <br />                                    图五: NAPT 将收到的公网IP主机返回的UDP协议包的目的地址和目的端口改变传输给内网IP计算机。                                <br />现在我们大概明白了NAPT如何实现内网计算机和外网主机间的透明通讯。现在来看一下我们最关心的问题，就是NAPT是依据什么策略来判断是否要为一个请求发出的UDP数据包建立Session的呢？主要有一下几个策略: </p>
		<p>A. 源地址(内网IP地址)不同，忽略其它因素, 在NAPT上肯定对应不同的Session<br />B. 源地址(内网IP地址)相同，源端口不同，忽略其它的因素，则在NAPT上也肯定对应不同的Session<br />C. 源地址(内网IP地址)相同，源端口相同，目的地址(公网IP地址)相同，目的端口不同，则在NAPT上肯定对应同一个Session<br />D. 源地址(内网IP地址)相同，源端口相同，目的地址(公网IP地址)不同，忽略目的端口，则在NAPT上是如何处理Session的呢？</p>
		<p>D的情况正式我们关心和要讨论的问题。依据目的地址(公网IP地址)对于Session的建立的决定方式我们将NAPT设备划分为两大类:</p>
		<p>Symmetric NAPT:<br />对于到同一个IP地址，任意端口的连接分配使用同一个Session; 对于到不同的IP地址, 任意端口的连接使用不同的Session. <br />我们称此种NAPT为 Symmetric NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的IP地址不同，则会建立不同的Session.</p>
		<p>        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]<br />                ^               ^                       ^<br />                |               |                       |<br />                v               v                       v<br />               9883            9882                    9881<br />                                 |<br />                             \ [NAT] /<br />                                 ^<br />                                 |<br />                                 v                        <br />                          [192.168.0.6:1827]<br />                          <br />                          图六: Symmetric 的英文意思是对称。多个端口对应多个主机，平行的，对称的!<br />                  <br />Cone NAPT:<br />对于到同一个IP地址，任意端口的连接分配使用同一个Session; 对于到不同的IP地址，任意端口的连接也使用同一个Session.<br />我们称此种NAPT为 Cone NAPT. 也就是只要本地绑定的UDP端口相同， 发出的目的地址不管是否相同， 都使用同一个Session.</p>
		<p>        [202.223.98.78:9696] [202.223.98.78:9696] [202.223.98.78:9696]</p>
		<p>                        ^          ^         ^<br />                         \         |        /<br />                          v        v       v<br />                                 9881<br />                                 [NAT]<br />                                   ^<br />                                   |<br />                                   v                      <br />                          [192.168.0.6:1827]<br />                          <br />                          图七: Cone 的英文意思是锥。一个端口对应多个主机，是不是像个锥子?</p>
		<p>现
在绝大多数的NAPT属于后者，即Cone NAT。本人在测试的过程中，只好使用了一台日本的Symmetric
NAT。还好不是自己的买的，我从不买日货,
希望看这篇文章的朋友也自觉的不要购买日本的东西。Win9x/2K/XP/2003系统自带的NAPT也是属于 Cone
NAT的。这是值的庆幸的，因为我们要做的UDP穿透只能在Cone NAT间进行，只要有一台不是Cone
NAT，对不起，UDP穿透没有希望了，服务器转发吧。后面会做详细分析!</p>
		<p>下面我们再来分析一下NAPT
工作时的一些数据结构，在这里我们将真正说明UDP可以穿透Cone
NAT的依据。这里描述的数据结构只是为了说明原理，不具有实际参考价值，真正感兴趣可以阅读Linux的中关于NAT实现部分的源码。真正的NAT实现
也没有利用数据库的，呵呵，为了速度！</p>
		<p>Symmetric NAPT 工作时的端口映射数据结构如下:</p>
		<p>内网信息表:</p>
		<p>[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ 外网IP地址 ] [ SessionTime 开始时间 ]</p>
		<p>PRIMARY KEY( [NAPT 分配端口] ) -&gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找.<br />UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.<br />UNIQUE( [ 内网IP地址 ], [ 内网端口 ], [ 外网IP地址 ] ) -&gt; 表示这三个字段联合起来不能重复.</p>
		<p>映射表:</p>
		<p>[NAPT 分配端口] [ 外网端口 ]</p>
		<p>UNIQUE( [NAPT 分配端口], [ 外网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.</p>
		<p>Cone NAPT 工作时的端口映射数据结构如下:</p>
		<p>内网信息表:</p>
		<p>[NAPT 分配端口] [ 内网IP地址 ] [ 内网端口 ] [ SessionTime 开始时间 ]</p>
		<p>PRIMARY KEY( [NAPT 分配端口] ) -&gt; 表示依据[NAPT 分配端口]建立主键，必须唯一且建立索引，加快查找.<br />UNIQUE( [ 内网IP地址 ], [ 内网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.</p>
		<p>外网信息表:</p>
		<p>[ wid 主键标识 ] [ 外网IP地址 ] [ 外网端口 ]</p>
		<p>PRIMARY KEY( [ wid 主键标识 ] ) -&gt; 表示依据[ wid 主键标识 ]建立主键，必须唯一且建立索引，加快查找.<br />UNIQUE( [ 外网IP地址 ], [ 外网端口 ] ) -&gt; 表示这两个字段联合起来不能重复.</p>
		<p>映射表: 实现一对多，的</p>
		<p>[NAPT 分配端口] [ wid 主键标识 ]</p>
		<p>UNIQUE( [NAPT 分配端口], [ wid 主键标识 ] ) -&gt; 表示这两个字段联合起来不能重复.<br />UNIQUE( [ wid 主键标识 ] ) -&gt; 标识此字段不能重复.</p>
		<p>看完了上面的数据结构是更明白了还是更晕了？ 呵呵! 多想一会儿就会明白了。通过NAT,内网计算机计算机向外连结是很容易的，NAPT会自动处理，我们的应用程序根本不必关心它是如何处理的。那么外部的计算机想访问内网中的计算机如何实现呢？我们来看一下下面的流程：</p>
		<p>c 是一台在NAPT后面的内网计算机，s是一台有外网IP地址的计算机。c 主动向 s 发起连接请求，NAPT依据上面描述的规则在自己的数据结构中记录下来，建立一个Session. 然后 c 和 s 之间就可以实现双向的透明的数据传输了。如下面所示:</p>
		<p>   c[192.168.0.6:1827] &lt;-&gt; [priv ip: 192.168.0.1]NAPT[pub ip: 61.51.99.86:9881] &lt;-&gt; s[61.51.76.102:8098]</p>
		<p>由
此可见，一台外网IP地址的计算机想和NAPT后面的内网计算机通讯的条件就是要求NAPT后面的内网计算机主动向外网IP地址的计算机发起一个UDP数
据包。外网IP地址的计算机利用收到的UDP数据包获取到NAPT的外网IP地址和映射的端口，以后就可以和内网IP的计算机透明的进行通讯了。<br />    <br />现
在我们再来分析一下我们最关心的两个NAPT后面的内网计算机如何实现直接通讯呢?
两者都无法主动发出连接请求，谁也不知道对方的NAPT的公网IP地址和NAPT上面映射的端口号。所以我们要靠一个公网IP地址的服务器帮助两者来建立
连接。当两个NAPT后面的内网计算机分别连接了公网IP地址的服务器后，服务器可以从收到的UDP数据包中获取到这两个NAPT设备的公网IP地址和这
两个连接建立的Session的映射端口。两个内网计算机可以从服务器上获取到对方的NAPT设备公网IP地址和映射的端口了。</p>
		<p>我们假设两个内网计算机分别为A和B，对应的NAPT分别为AN和BN， 如果A在获取到B对应的BN的IP地址和映射的端口后，迫不急待的向这个IP<br />地
址和映射的端口发送了个UDP数据包，会有什么情况发生呢？依据上面的原理和数据结构我们会知道，AN会在自己的数据结构中生成一条记录，标识一个新
Session的存在。BN在收到数据包后，从自己的数据结构中查询，没有找到相关记录，因此将包丢弃。B是个慢性子，此时才慢吞吞的向着AN的IP地址
和映射的端口发送了一个UDP数据包，结果如何呢？当然是我们期望的结构了，AN在收到数据包后，从自己的数据结构中查找到了记录，所以将数据包进行处理
发送给了A。A 再次向B发送数据包时，一切都时畅通无阻了。OK, 大工告成！且慢，这时对于Cone NAPT而言，对于Symmetric
NAPT呢？呵呵，自己分析一下吧...</p>
		<p>NAPT(The IP Network Address/Port Translator) 进行UDP穿透的具体情况分析!</p>
		<p>首先明确的将NAPT设备按照上面的说明分为: Symmetric NAPT 和 Cone NAPT, Cone NAPT 是我们需要的。Win9x/2K/XP/2003 自带的NAPT也为Cone NAPT。</p>
		<p>第一种情况, 双方都是Symmetric NAPT:</p>
		<p>此情况应给不存在什么问题，肯定是不支持UDP穿透。</p>
		<p>第二种情况, 双方都是Cone NAPT:</p>
		<p>此情况是我们需要的，可以进行UDP穿透。</p>
		<p>第三种情况, 一个是Symmetric NAPT, 一个是Cone NAPT:</p>
		<p>此情况比较复杂，但我们按照上面的描述和数据机构进行一下分析也很容易就会明白了, 分析如下,</p>
		<p>假设: A -&gt; Symmetric NAT, B -&gt; Cone NAT</p>
		<p>1.
A 想连接 B, A 从服务器那儿获取到 B 的NAT地址和映射端口, A 通知服务器，服务器告知 B A的NAT地址和映射端口, B 向 A
发起连接，A 肯定无法接收到。此时 A 向 B 发起连接， A 对应的NAT建立了一个新的Session，分配了一个新的映射端口， B 的
NAT 接收到UDP包后，在自己的映射表中查询，无法找到映射项，因此将包丢弃了。</p>
		<p>2. B 想连接 A, B 从服务器那儿获取到
A 的NAT地址和映射端口, B 通知服务器, 服务器告知 A B的NAT地址和映射端口,A 向 B 发起连接, A
对应的NAT建立了一个新的Session，分配了一个新的映射端口B肯定无法接收到。此时 B 向 A 发起连接, 由于 B 无法获取 A
建立的新的Session的映射端口，仍是使用服务器上获取的映射端口进行连接， 因此 A
的NAT在接收到UDP包后，在自己的映射表中查询，无法找到映射项, 因此将包丢弃了。</p>
		<p>根据以上分析，只有当连接的两端的NAT都为Cone NAT的情况下，才能进行UDP的内网穿透互联。</p>
		<p>
				<br />NAPT(The IP Network Address/Port Translator) 进行UDP穿透如何进行现实的验证和分析!</p>
		<p>需要的网络结构如下:</p>
		<p>三个NAT后面的内网机器，两个外网服务器。其中两台Cone NAPT，一台 Symmetric NAPT。</p>
		<p>验证方法:</p>
		<p>可
以使用本程序提供的源码，编译，然后分别运行服务器程序和客户端。修改过后的源码增加了客户端之间直接通过IP地址和端口发送消息的命令，利用此命令，你
可以手动的验证NAPT的穿透情况。为了方便操作，推荐你使用一个远程登陆软件，可以直接在一台机器上操作所有的相关的计算机