﻿<?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-都市淘沙者-文章分类-Android/J2ME/Symbian/Jabber</title><link>http://www.blogjava.net/jelver/category/23090.html</link><description>http://www.gaolucha.com上线了，嘿嘿</description><language>zh-cn</language><lastBuildDate>Wed, 10 Apr 2013 09:38:43 GMT</lastBuildDate><pubDate>Wed, 10 Apr 2013 09:38:43 GMT</pubDate><ttl>60</ttl><item><title>根据访问UA获取相关信息</title><link>http://www.blogjava.net/jelver/articles/397636.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Wed, 10 Apr 2013 04:13:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/397636.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/397636.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/397636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/397636.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/397636.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">&lt;</span><span style="color: #000000; ">script&nbsp;type</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">text/javascript</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;browser</span><span style="color: #000000; ">=</span><span style="color: #000000; ">{&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">versions:</span><span style="color: #0000FF; ">function</span><span style="color: #000000; ">(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">var</span><span style="color: #000000; ">&nbsp;u&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;navigator.userAgent,&nbsp;app&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;navigator.appVersion;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">trident:&nbsp;u.indexOf('Trident')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">IE内核&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">presto:&nbsp;u.indexOf('Presto')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">opera内核&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">webKit:&nbsp;u.indexOf('AppleWebKit')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">苹果、谷歌内核&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">gecko:&nbsp;u.indexOf('Gecko')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;u.indexOf('KHTML')&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">火狐内核&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">mobile:&nbsp;</span><span style="color: #000000; ">!!</span><span style="color: #000000; ">u.match(</span><span style="color: #000000; ">/</span><span style="color: #000000; ">AppleWebKit.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">Mobile.</span><span style="color: #000000; ">*/</span><span style="color: #000000; ">)</span><span style="color: #000000; ">||!!</span><span style="color: #000000; ">u.match(</span><span style="color: #000000; ">/</span><span style="color: #000000; ">AppleWebKit</span><span style="color: #000000; ">/</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">是否为移动终端&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">ios:&nbsp;</span><span style="color: #000000; ">!!</span><span style="color: #000000; ">u.match(</span><span style="color: #000000; ">/</span><span style="color: #000000; ">\(i[</span><span style="color: #000000; ">^</span><span style="color: #000000; ">;]</span><span style="color: #000000; ">+</span><span style="color: #000000; ">;(&nbsp;U;)</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;CPU.</span><span style="color: #000000; ">+</span><span style="color: #000000; ">Mac&nbsp;OS&nbsp;X</span><span style="color: #000000; ">/</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">ios终端&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">android:&nbsp;u.indexOf('Android')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;u.indexOf('Linux')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">android终端或者uc浏览器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">iPhone:&nbsp;u.indexOf('iPhone')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">||</span><span style="color: #000000; ">&nbsp;u.indexOf('Mac')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">是否为iPhone或者QQHD浏览器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">iPad:&nbsp;u.indexOf('iPad')&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">是否iPad&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">webApp:&nbsp;u.indexOf('Safari')&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">是否web应该程序，没有头部与底部&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">};<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">}()<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">document.writeln(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;是否为移动终端:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">browser.versions.mobile);<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">document.writeln(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;ios终端:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">browser.versions.ios);<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">document.writeln(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;android终端:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">browser.versions.android);<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; ">document.writeln(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;是否为iPhone:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">browser.versions.iPhone);<br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; ">document.writeln(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;是否iPad:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">+</span><span style="color: #000000; ">browser.versions.iPad);<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">document.writeln(navigator.userAgent);<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">script</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; "></span></div><img src ="http://www.blogjava.net/jelver/aggbug/397636.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2013-04-10 12:13 <a href="http://www.blogjava.net/jelver/articles/397636.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android 应用程序Activity之间数据传递与共享的几种途径【转】</title><link>http://www.blogjava.net/jelver/articles/357231.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Wed, 24 Aug 2011 23:31:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/357231.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/357231.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/357231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/357231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/357231.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/kieven2008/article/details/6006905">http://blog.csdn.net/kieven2008/article/details/6006905</a><br /><br /><strong><span style="font-size: large;">1.基于消息的通信机制 &nbsp;Intent ---boudle ,extra</span> </strong>  <p><span style="font-size: medium;"><strong>&nbsp;&nbsp;&nbsp; </strong> 数据类型有限，比如遇到不可序列化的数据Bitmap,InputStream, 或者LinkList链表等等数据类型就不太好用。</span> </p> <p><strong><span style="font-size: large;">2. 利用static静态数据，</span> </strong> <span style="font-size: large;">public static成员变量；</span> </p> <p><strong><span style="font-size: large;">3.基于外部存储的传输,&nbsp; </span> </strong> <span style="font-size: large;">File/Preference/ Sqlite ，如果要针对第三方应用需要Content Provider</span> <strong><span style="font-size: large;"><br /> </span> </strong> </p> <p><span style="font-size: large;"><strong>4.基于IPC的通信机制</strong></span></p> <p><span style="font-size: large;"><strong></strong>&nbsp;&nbsp; &nbsp;context 与Service之间的传输，如</span><span style="font-size: large;"><span style="font-family: mceinline;">Activity与Service之间的通信，定义AIDL接口文件。</span></span></p> <p><span style="font-size: large;"><span style="font-family: mceinline;">&nbsp;&nbsp; 示例：&nbsp;</span></span><a href="http://www.eoeandroid.com/thread-36249-1-1.html">http://www.eoeandroid.com/thread-36249-1-1.html</a></p> <p><strong><span style="font-family: mceinline;"><span style="font-size: large;">5. 基于Application Context，</span> <span style="font-size: large;">例子如下文：</span></span></strong> </p> <p>&nbsp;</p> <p>&nbsp;</p> <p><br /> &nbsp;&nbsp;&nbsp; 在当前Activity将两个值传到了Test中。但如果遇到不可序列化的数据，如Bitmap、InputStream等，intent就无能为力了。因此，我们很自然地会想到另外一种方法，静态变量。如下面的代码所示：</p> <p><br /> &nbsp;&nbsp;&nbsp; public&nbsp; class&nbsp; Product&nbsp; extends&nbsp; Activity<br /> &nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp; static&nbsp; Bitmap mBitmap;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp; }</p> <p><br /> &nbsp;&nbsp;&nbsp; 对于上面的代码来说，其他任何类可以直接使用Product中的mBitmap变量。这么做很easy、也很cool，但却very very  wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上，回收器并不可靠，尤其是手机上，是更加的不可靠。  因此，除非我们要使自己的程序变得越来越糟糕，否则尽量远离static。</p> <p>注：如果经常使用static的Bitmap、Drawable等变量。可能就会抛出一个在Android系统中非常著名的异常（以前budget这个单词一直记不住什么意思，自从经常抛出这个异常后，这个单词终于烂熟于心了， ）</p> <p>ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget</p> <p><br /> &nbsp;&nbsp;&nbsp; 如果不使用static，总得有方法来代替它（尽管我很喜欢public  static，我相信很多人也喜欢它，但为了我们的程序，建议还是忍痛割爱吧），那么这个新的解决方案就是本文的主题，这就是Application  Context，相当于Web程序的Application，它的生命周期和应用程序一样长（这个我喜欢）。</p> <p>&nbsp;&nbsp;&nbsp; 那么现在来看看如何使用这个Application  Context。我们可以通过Context.getApplicationContext或Context.getApplication方法获得  Application  Context。但要注意，我们获得的只是Context对象，而更理想的方法是获得一个类的对象。ok，说干就干，下面来定义一个类。</p> <p><br /> package&nbsp; net.blogjava.mobile1;</p> <p>import&nbsp; android.app.Application;<br /> import&nbsp; android.graphics.Bitmap;</p> <p>public&nbsp; class&nbsp; MyApp&nbsp; extends&nbsp; Application<br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp; private&nbsp; Bitmap mBitmap;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp; Bitmap getBitmap()<br /> &nbsp;&nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; mBitmap;<br /> &nbsp;&nbsp;&nbsp; }</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; public&nbsp; void&nbsp; setBitmap(Bitmap bitmap)<br /> &nbsp;&nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .mBitmap&nbsp; =&nbsp; bitmap;<br /> &nbsp;&nbsp;&nbsp; }<br /> &nbsp;&nbsp;&nbsp; <br /> }</p> <p><br /> &nbsp;&nbsp;&nbsp; 上面这个类和普通的类没什么本质的不同。但该类是Application的子类。对了，这就是使用Application  Context的第一步，定义一个继承自Application的类。然后呢，就在这个类中定义任何我们想使其全局存在的变量了，如本例中的  Bitmap。下面还需要一个重要的步骤，就是在&lt;application&gt;标签中使用android:name属性来指定这个类，代码如  下：</p> <p><br /> &lt; application&nbsp; android:name =".MyApp"&nbsp; android:icon ="@drawable/icon"&nbsp; android:label ="@string/app_name" &gt; <br /> &nbsp;<br /> &lt;/ application?</p> <p><br /> &nbsp;&nbsp;&nbsp; 接下来的最后一步就是向MyApp对象中存入Bitmap对象，或从MyApp对象中取出Bitmap对象了，存入Bitmap对象的代码如下：</p> <p><br /> &nbsp;&nbsp;&nbsp; MyApp myApp&nbsp; =&nbsp; (MyApp)getApplication();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; Bitmap bitmap&nbsp; =&nbsp; BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; myApp.setBitmap(bitmap); </p> <p>&nbsp;&nbsp;&nbsp; 获得Bitmap对象的代码：</p> <p>&nbsp;&nbsp;&nbsp; ImageView imageview&nbsp; =&nbsp; (ImageView)findViewById(R.id.ivImageView);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; MyApp myApp&nbsp; =&nbsp; (MyApp)getApplication();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; imageview.setImageBitmap(myApp.getBitmap()); <br /> &nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp; 上面两段代码可以在任何的Service、Activity中使用。全局的。</p> <p><br /></p><p>参考：</p> <p>1.http://flyvenus.net/?p=229</p> <p>2.<a href="http://blog.csdn.net/nokiaguy/archive/2010/11/10/5998986.aspx">http://blog.csdn.net/nokiaguy/archive/2010/11/10/5998986.aspx</a> </p><img src ="http://www.blogjava.net/jelver/aggbug/357231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-08-25 07:31 <a href="http://www.blogjava.net/jelver/articles/357231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android做代码混淆的时候容易犯的问题</title><link>http://www.blogjava.net/jelver/articles/356495.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Sun, 14 Aug 2011 09:49:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/356495.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/356495.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/356495.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/356495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/356495.html</trackback:ping><description><![CDATA[今天折腾了一阵，特意留个纪念，尤其喜欢用proguard混淆和json传输的同学要注意了，需要配置好，千万别把那些做json映射到javabean之间的类做混淆了，原因是混淆后类的字段都变了，这个使得json串和java文件无法对应起来，另外需要注意到是在eclipse开发环境运行模拟器是没有问题的，是因为模拟器并没有启用混淆后的apk来安装，所以要确保你的程序正常，你最好用混淆后的apk 通过 adb install xx.apk 的方式来确认是否正常，这个是排除疑问的最好方式。<img src ="http://www.blogjava.net/jelver/aggbug/356495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-08-14 17:49 <a href="http://www.blogjava.net/jelver/articles/356495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java与json互相转换(解决日期问题)</title><link>http://www.blogjava.net/jelver/articles/356485.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Sun, 14 Aug 2011 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/356485.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/356485.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/356485.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/356485.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/356485.html</trackback:ping><description><![CDATA[source:<div><a href="http://hi.baidu.com/learnfordba/blog/item/0ee6cdfb7d61fb859f5146f8.html">http://hi.baidu.com/learnfordba/blog/item/0ee6cdfb7d61fb859f5146f8.html</a></div><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">JSON&nbsp;即&nbsp;JavaScript&nbsp;Object&nbsp;Natation，它是一种轻量级的数据交换格式，非常适合于服务器与&nbsp;JavaScript&nbsp;的交互。本文主要讲解下java和JSON之间的转换，特别是解决互相转换遇到日期问题的情况。<br />&nbsp;&nbsp;&nbsp;&nbsp;一、需要相关的jar包：<br />&nbsp;&nbsp;&nbsp;&nbsp;json</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lib</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xxx.jar<br />&nbsp;&nbsp;&nbsp;&nbsp;ezmorph</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xxx.jar<br />&nbsp;&nbsp;&nbsp;&nbsp;commons</span><span style="color: #000000; ">-</span><span style="color: #000000; ">httpclient</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xxx.jar<br />&nbsp;&nbsp;&nbsp;&nbsp;commons</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lang</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xxx.jar<br />&nbsp;&nbsp;&nbsp;&nbsp;commons</span><span style="color: #000000; ">-</span><span style="color: #000000; ">logging</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xxx.jar<br />&nbsp;&nbsp;&nbsp;&nbsp;commons</span><span style="color: #000000; ">-</span><span style="color: #000000; ">collections</span><span style="color: #000000; ">-</span><span style="color: #000000; ">xxx.jar<br />&nbsp;&nbsp;&nbsp;&nbsp;上面的包可以从下面的连接下载：<br />&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">commons.apache.org/index.html</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">json-lib.sourceforge.net</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;http:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">ezmorph.sourceforge.net</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;二、java</span><span style="color: #000000; ">-</span><span style="color: #000000; ">》JSON<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">.List</span><span style="color: #000000; ">-</span><span style="color: #000000; ">》JSON<br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />List</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ArrayList</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />list.add(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">apple</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />list.add(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">orange</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />JSONArray&nbsp;jarr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSONArray.fromObject(list);<br />System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">list-&gt;json:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;jarr.toString());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;打印结果：list</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">json:[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">apple</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">orange</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">.Map</span><span style="color: #000000; ">-</span><span style="color: #000000; ">》JSON<br /><br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;HashMap</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">();<br />map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Michael</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">baby</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Lucy</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Lily</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;});<br />map.put(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; ">);<br />JSONObject&nbsp;jo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSONObject.fromObject(map);<br />System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">map-&gt;json:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;jo.toString());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;打印结果：map</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">json:{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">30</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Michael</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">baby</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Lucy</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Lily</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">.bean</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">JSON<br /><br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />JsonBean&nbsp;bean&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JsonBean();<br />bean.setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NewBaby</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />bean.setAge(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />bean.setBorn(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Date());<br />jo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSONObject.fromObject(bean);<br />System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bean-&gt;json:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;jo.toString());<br /><br />打印结果：bean</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">json:{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">born</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">date</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">day</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">hours</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">14</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">minutes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">14</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">month</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">seconds</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">time</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">1268201641228</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">timezoneOffset</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">-</span><span style="color: #000000; ">480</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">year</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">110</span><span style="color: #000000; ">},</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NewBaby</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}<br />&nbsp;&nbsp;&nbsp;这时你会发现它把bean对象里的util.Date这个类型的所有属性一一转换出来。在实际运用过程中，大多数情况下我们希望能转化为yyyy</span><span style="color: #000000; ">-</span><span style="color: #000000; ">MM</span><span style="color: #000000; ">-</span><span style="color: #000000; ">dd这种格式，下面就讲一讲如何实现：<br />&nbsp;&nbsp;&nbsp;首先要写一个新的类JsonDateValueProcessor如下：<br /><br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br /></span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />*&nbsp;JSON&nbsp;日期格式处理（java转化为JSON）<br />*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Michael&nbsp;sun<br /></span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;JsonDateValueProcessor&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;JsonValueProcessor&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;datePattern<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;String&nbsp;datePattern&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yyyy-MM-dd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;JsonDateValueProcessor<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;JsonDateValueProcessor()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;format<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;JsonDateValueProcessor(String&nbsp;format)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.datePattern&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;format;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;jsonConfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;Object<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Object&nbsp;processArrayValue(Object&nbsp;value,&nbsp;JsonConfig&nbsp;jsonConfig)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;process(value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;jsonConfig<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;Object<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Object&nbsp;processObjectValue(String&nbsp;key,&nbsp;Object&nbsp;value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JsonConfig&nbsp;jsonConfig)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;process(value);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;process<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;value<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Object&nbsp;process(Object&nbsp;value)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(value&nbsp;</span><span style="color: #0000FF; ">instanceof</span><span style="color: #000000; ">&nbsp;Date)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;sdf&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;SimpleDateFormat(datePattern,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Locale.UK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;sdf.format((Date)&nbsp;value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;value&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">&nbsp;:&nbsp;value.toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">""</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;the&nbsp;datePattern<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;String&nbsp;getDatePattern()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;datePattern;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;pDatePattern&nbsp;the&nbsp;datePattern&nbsp;to&nbsp;set<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;setDatePattern(String&nbsp;pDatePattern)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datePattern&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pDatePattern;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br />测试代码：<br /><br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />JsonBean&nbsp;bean&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JsonBean();<br />bean.setName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NewBaby</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />bean.setAge(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />bean.setBorn(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Date());<br /><br />JsonConfig&nbsp;jsonConfig&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JsonConfig();<br />jsonConfig.registerJsonValueProcessor(Date.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JsonDateValueProcessor());<br /><br />JSONObject&nbsp;jo&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSONObject.fromObject(bean,&nbsp;jsonConfig);<br />System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">bean-&gt;json:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;jo.toString());<br /><br />打印结果：bean</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">json:{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">born</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">2010-03-10</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">NewBaby</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}<br />这就能得到我们想要的结果了。<br /><br />三、JSON</span><span style="color: #000000; ">-</span><span style="color: #000000; ">》java<br /></span><span style="color: #000000; ">1</span><span style="color: #000000; ">.如何把json的yyyy</span><span style="color: #000000; ">-</span><span style="color: #000000; ">MM</span><span style="color: #000000; ">-</span><span style="color: #000000; ">dd的转换为Bean中的util.Date类型：<br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />JSONUtils.getMorpherRegistry().registerMorpher(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DateMorpher(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yyyy-MM-dd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;}));<br /><br />String&nbsp;jsonStr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">[{\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">husband\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">26</span><span style="color: #000000; ">\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">born\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">1984</span><span style="color: #000000; ">-</span><span style="color: #000000; ">01</span><span style="color: #000000; ">-</span><span style="color: #000000; ">12</span><span style="color: #000000; ">\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">},{\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">wife\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">20</span><span style="color: #000000; ">\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">born\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:&nbsp;\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">1990</span><span style="color: #000000; ">-</span><span style="color: #000000; ">05</span><span style="color: #000000; ">-</span><span style="color: #000000; ">01</span><span style="color: #000000; ">\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />Collection</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">JsonBean</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSONArray.toCollection(JSONArray.fromObject(jsonStr),&nbsp;JsonBean.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">DateUtil.getFormatDate(date,fmtstr)日期转字符串这里不再写代码了</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(JsonBean&nbsp;o&nbsp;:&nbsp;list)&nbsp;{<br />&nbsp;&nbsp;&nbsp;System.out.println(DateUtil.getFormatDate(o.getBorn(),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yyyy-MM-dd</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />}<br /><br />打印结果：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">1984</span><span style="color: #000000; ">-</span><span style="color: #000000; ">01</span><span style="color: #000000; ">-</span><span style="color: #000000; ">12</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">1990</span><span style="color: #000000; ">-</span><span style="color: #000000; ">05</span><span style="color: #000000; ">-</span><span style="color: #000000; ">01</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">.&nbsp;JSON</span><span style="color: #000000; ">-</span><span style="color: #000000; ">》List、&nbsp;Map<br />view&nbsp;plaincopy&nbsp;to&nbsp;clipboardprint</span><span style="color: #000000; ">?</span><span style="color: #000000; "><br />String&nbsp;listStr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">[\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">apple\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">orange\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />Collection</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;strlist&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;JSONArray.toCollection(JSONArray.fromObject(listStr));<br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(String&nbsp;str&nbsp;:&nbsp;strlist)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br />}<br /><br />String&nbsp;mapStr&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">{\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">age\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:30,\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">name\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Michael\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">baby\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">:[\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Lucy\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Lily\</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />Map</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;map&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Map)&nbsp;JSONObject.toBean(JSONObject<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.fromObject(mapStr),&nbsp;Map.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);<br /></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(Entry</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">String,&nbsp;Object</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;entry&nbsp;:&nbsp;map.entrySet())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(entry.getKey()&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;entry.getValue());<br />}<br /><br />打印结果：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apple<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;orange<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;Michael<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age&nbsp;</span><span style="color: #000000; ">30</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baby&nbsp;[Lucy,&nbsp;Lily]</span></div><img src ="http://www.blogjava.net/jelver/aggbug/356485.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-08-14 12:00 <a href="http://www.blogjava.net/jelver/articles/356485.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Phonegap：快速开发跨平台HTML5应用的胶水层</title><link>http://www.blogjava.net/jelver/articles/352487.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Fri, 17 Jun 2011 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/352487.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/352487.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/352487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/352487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/352487.html</trackback:ping><description><![CDATA[<div><h1>Phonegap：快速开发跨平台HTML5应用的胶水层</h1>  					<div> 						<span meta-prep-author="">Posted on</span> <a href="http://www.showmuch.com/article/article_4.html" title="16:01" rel="bookmark">2011/03/05</a> by <span vcard=""><a fn="" n="" href="http://www.showmuch.com/article/article_author/riceball/" title="View all posts by 李 雪愚">李 雪愚</a></span>					</div>  					<div> 						<p>在开发移动应用的过程当中，如果你的应用只定位在一种平台上，这可不是一个好主意，但是为许多不同的平台Building应用又是一件 非常麻烦和非常不爽的事情，因为你会发现每一种手机平台都有自己的SDK，它们需要使用不同语言来进行开发，你可能不得不需要5、6个代码仓库来管理不同 设备上的代码，而且需要不同设备的开发人员来开发维护这些仓库，你还不得不装上各个设备的sdk，设置好路径和各种配置信息，来编译不同设备上的应用包。<br /> 那么移动网站模式是不是一个可以接受的替代方案呢？幸运的是移动应用和移动网站并不是对立的两端，通过Phonegap我们可以采用html5的网站形式 来开发移动应用。也许开源Phonegap 会成为 WebApp  上设备端开发的事实上标准，ShowMuch本期就为你推荐移动开发利器：PhoneGap。<br /> 我们先来看看PhoneGap的特性：</p> <div style="padding-left: 25px;"> <ul><li>支持6种移动设备平台：iOS, Android, BlackBerry, WebOS, Symbian WRT, Windows Mobile(内部测试)，以及桌面环境（内部测试）</li><li>HTML5 + CSS3 + JavaScript &nbsp;利用标准的Web技术开发应用</li><li><a href="https://build.phonegap.com/" target="_blank">Phonegap Build</a>: write once, compile on cloud, run anywhere. 提供在线Builder平台：只写一次，云端编译，运行在任何地方</li><li>目前已经有上千基于<a href="http://www.phonegap.com/apps" target="_blank">Phonegap的应用</a>在AppStore上</li><li><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/234651Wve.png" alt="" width="32" />Phonegap 目前标注的版本依然是0.9.x，phonegap的功能特性并不稳定，会有不少bug，要小心。</li></ul> </div> <h2><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;"><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/234650czU.png" alt="" /></span>开始玩</h2> <p>首先自然是需要下载 phonegap： <a href="http://www.phonegap.com/">http://www.phonegap.com/</a></p> <p>然后你还需要相应设备的SDK</p> <p><strong>针对iPhone:</strong></p> <div style="padding-left: 25px;"> <ol><li><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/071041rvR.png" alt="" />从 <a href="http://developer.apple.com/">Apple Developer Portal</a> 下载安装 XCode.</li><li><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/071125R7U.png" alt="" />解开下载好的phonegap压缩包，进入iphone目录安装好phonegap</li><li>打开XCode，在文件菜单选择 New Project&#8230;. 菜单</li><li>点开&#8220;User Templates&#8221;栏，选择Phonegap，然后选中右边的&#8220;<strong>PhoneGap-based Application</strong>&#8221;，点击&#8220;Choose&#8230;&#8221;按钮，命名你的项目，选择项目文件的位置.<img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/071148gMY.jpg" alt="" /></li></ol> </div> <p><strong>针对Android:</strong></p> <div style="padding-left: 25px;"> <ol><li><span style="line-height: 19px;"><span style="line-height: 24px;"><img id="rg_hi" style="width: 81px; height: 81px;" src="data:image/jpg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBhIPDxUTEBIWEBASFBIRFBgVFBMdGRQbHxUcFhgXFxIYJyYeIyUoGhgeHzsgIzMpMTAtFx4xNTwqNScrLCkBCQoKDQsNGQ4OGTUkHiQ1NTU1NDQ1NTU2LjU1NSw1NSw1NDUyNDU1NDY1LjQ1NSw1NDQsNTYpNDQtLDUpLC81LP/AABEIAE8ATwMBIgACEQEDEQH/xAAbAAABBQEBAAAAAAAAAAAAAAAAAQMEBQYCB//EADgQAAIBAwIDBQQJAwUAAAAAAAECAwAEEQUhEhMxBiJRYXEyQYGRFEJSobGys+HwJENyFiM0NYL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAgMEAQX/xAAoEQACAgEDAQcFAAAAAAAAAAAAAQIRAxIhMRMEQWFxgbHBFFGRofD/2gAMAwEAAhEDEQA/APcKKKKACiikJoAWq++v+XJCvXmuyH0EbNn5qB8aNX1qK1jLytgdAB7THwUVQ2NyTKLu8PKyClvFuWUHqeEblj5DpU5Tp6VyXx4m1rfHua0UtM2s3GMlSmfc2M/EDp6U9VEQ4CiiigAooooAK5alJqLdanFEQJHVWPRSe83og3PwoOMyul230m/uZrjvG2bgiQ9F6kEDzAB9T5Cu+xEi3LS3Ep4rjjK4P9tMbBR7h1G3XG9XMtjiYXEPtMAsq4xzFzscH6w92eoyPCqnTNEMOpyPDtCUy/hxsc8A/N5ZHjWXQ4td56nVhkhNN1sq9OV6mtWuqhXmpJAvE/FwgEkqjNgDqTwg09Z3iTIHjYOjDKspyDWqjy7H6KKKDoUUUUAIax+v6Nb2jNdBrmOSRwrmFifaO5biDYUfGtTfX8cKF5XWNB1LEAfzyqHJePNC/wBHBRyp5byxkLk9O6cN91NFtOxJU9jNJrNoR/3EnoWhH4pmkTV7EsB9NubgkgYV5yPjyVXanDdaimA+nQTsBjiWSPfzw3zqZpl3qLSDjtILeLPe/wB3vY8RwZ+RrQ0qv5RJXx8Fld3y26BIUaSQgcuNMkt5sx9keLNXPZHR2tLVY3ILlnkfHsgseIqvkOlWk0yxqWchVAySfdjxNdxyBhkbg7j8azXtRat7OxRRRXBgoNFIaAIGr6PDdoEnQSKDxDORg+II3Bqok7Kcof081wgH1RdNgegkDipXbOZksZWRirDgwVJBHfUbEU3DrZighHJmndoY3JRcj2RklycZ8qXraHpfBX6dzgpryIZ0y7H927PpNZ/iUrltMuz1N03+V3Av6aZqZ/rOLkNNwSYjdY5FKjijJ+0M4qdqGupBysgtz2VE4QPfjBPlvTLOubQr7LNOmv5FRD2enLZIiQ/akee4cenMKrn51pLO2MaYLtIdyWcjJPwwB6Daqe97ViIvm3nZIyQziPujB3IJOSKs7DUBOgdAeBgGVtu8P2rnUU3QPDOEdTWxNFFIKWuiBSGlpDQBn+3H/Al/8fqLVOmsuZIbfni0jFrDIXIQlzwDYF9h+xq87TaTJdqsSuEhLZl2PEQOgX3fwVOk0iF1QPEjiMBV4lBwBsMVnlCTna8DdjzY4YlGSvd/BjtBtBcpfxh+bxsArnHf7pKtgbdd/CmuzM7Xk9srbizjYvn7WeFPuwfhW9itETJRQpbGcADOBtnHlXMFlHGSURULHJIAGfUilWBqt/P3Hl23Up7c8eG1P9GIn1trmK4aS6FuEMkSwgJlsDYMzZbJ6bVpOxQ/oIf8T+c1PbSYTJx8pOYfrcC5+dSbeFUXhQBVHQAYA+FPDG1LU2SzdohLH04qt0+77fkdFFAoq5jP/9k=" alt="" height="81" width="81" />下载安装 JDK 1.5</span></span></li><li><span style="line-height: 19px;"><span style="line-height: 24px;"><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/071127WTj.png" alt="" />下载安装&nbsp;<a href="http://developer.android.com/sdk/index.html">Android SDK</a></span></span></li><li><span style="line-height: 19px;">下载安装 <a href="http://ant.apache.org/ivy/download.cgi" target="_blank">Apache ANT</a></span></li><li>下载安装 Ruby (命令行方式开发需要)</li><li><span style="line-height: 19px;"><span style="line-height: 24px;"><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/071125R7U.png" alt="" />解 压已经下载好的&nbsp;PhoneGap, 进入android 目录，my  god，最新的0.9.4ZIP包中没有命令行创建项目的方式，好吧，你需要从最新的仓库中把代码取出来： git clone  https://github.com/phonegap/phonegap-android.git</span></span></li><li><span style="line-height: 19px;"><span style="line-height: 24px;"><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/234651Wve.png" alt="" width="81" />命令行方式(Droidgap)脚本的开发者没有修改路径以配合新的0.9.4版本，这是这次在发布中被拿掉的原因吧。需要自己改改，蛮简单的，就不多说。</span></span></li><li>将 android下的bin目录 加入你的搜索 path:<br /> UNIX/LINUX的机子:&nbsp;<span style="font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; line-height: 19px; white-space: pre;">export PATH=$PATH:~/phonegap-android/bin<br /> 在windows下将phonegap-android/bin&nbsp;路径加到Path中就不用多说了。</span></li><li><span style="font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; line-height: 19px; white-space: pre;">ok，在命令行下输入 &#8220;droidgap gen demo&#8221;,即可创建phonegap支撑的html5应用项目。</span></li><li><span style="font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; line-height: 19px; white-space: pre;">cd demo;ant debug install 即可安装到设备或模拟器</span></li><li><span style="font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; line-height: 19px; white-space: pre;">adb logcat 在控制台查看设备的输出日志</span></li></ol> </div> <p><strong>使用PhoneGap来创建移动App应用：</strong></p> <p>打开项目的www目录（android是在项目的assets/www目录下），编辑index.html，在body中键 入&lt;h1&gt;hello  world&lt;/h1&gt;（你也可以加上js和css文件在这个目录下面），保存，然后你就可以首先部署到模拟器上看看。</p> <p>也许你会说，哈，这不就是网页嘛！是的，这就是网页，不过通过phonegap，这样的网页应用就有能力访问设备的所有功能：文件系统，GPS，相 机，重力加速度计，电话簿等，当然不同的设备支持的功能会有所不同（目前phonegap还不能支持完所有的功能，具体看各个设备支持的特性列表）。另外 要想呈现和移动应用一样的外观，你还需要选择一种HTML5 Mobile UI Framework库，这样的Framework库已经很多了:  Sencha Touch, JQTouch, JMobile, XUI, The-M-Project,Dojo Mobile,  dhtmlxTouch, wink, jo, webapp.net&#8230;</p> <h2><a href="https://build.phonegap.com/" target="_blank">Phonegap Build</a></h2> <p>除了在本地编译应用之外，您还可以使用Phonegap提供的云端Build工具进行应用编译。那就是：Phonegat Build，通过它，您只需要将用HTML5写好的应用上传到Phonegap的云端服务器，它即可以帮你编译不同平台平的应用。</p> <p><span style="font-size: 16px; font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;"><img src="http://www.showmuch.com/article/wp-content/uploads/auto_save_image/2011/03/005329rTc.png" alt="Part of the phonegap build status screen for an app, showing downloads and errors" /></span></p> <p><span style="font-size: 16px; font-family: Georgia, 'Bitstream Charter', serif; line-height: 24px;"><a href="https://build.phonegap.com/" target="_blank">Phonegap Build</a> 当前<a href="https://build.phonegap.com/" target="_blank">Phonegap Build</a>依然处于beta状态，你需要申请，等到通过方可使用。另外推荐一个Chrome的插件，<a href="http://ripple.tinyhippos.com/" target="_blank">Ripple Emulator</a> 可以在Chrome浏览器上测试你的应用，支持phonegap。</span></p> <p>（文章作者：李雪愚，盛大创新院高级架构师，雪愚对于使用Phonegap有着丰富的经验，曾用Phonegap开发基于Android和iOS的应用。编辑BY：Handaoliang）</p> 											</div></div><img src ="http://www.blogjava.net/jelver/aggbug/352487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-06-17 10:21 <a href="http://www.blogjava.net/jelver/articles/352487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Location-Aware-Instant：开发即时位置感知的Android客户端(转)</title><link>http://www.blogjava.net/jelver/articles/352151.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Sun, 12 Jun 2011 14:04:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/352151.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/352151.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/352151.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/352151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/352151.html</trackback:ping><description><![CDATA[<div>&nbsp; <strong>一、回顾</strong> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在分享这个项目之前先来回顾以前的三篇文章：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997048.html" target="_blank">《基于即时通信和LBS技术的位置感知服务（一）：提出问题及解决方案》</a>（外网地址）</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;   在第一篇文章中我们提出了要让A与B在不同地方能即刻获取对方准确位置的需求。之后讨论了解决这一问题做出的方案选择，即放弃使用轮询（Pooling） 的方式在不同客户端进行数据的更新，理由是因为B不知道A何时需要自己的位置信息，所以B只能一直post自己的位置数据给服务器，而A要定时通过 RESTful Web请求去服务器获取B的信息。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后确定采用基于XMPP协议的PubSub（Publish/Subscribe，发布/订阅）方式进行异步消息实时传递。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997049.html" target="_blank">《基于即时通信和LBS技术的位置感知服务（二）：XMPP协议总结以及开源解决方案》</a>（外网地址）</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二篇文章主要是对XMPP协议进行总结，以及为什么要采用XMPP,最后介绍了XMPP协议的Java开源解决方案：Openfire+Smack+Spark。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cnblogs.com/charley_yang/archive/2011/03/27/1997052.html" target="_blank">《基于即时通信和LBS技术的位置感知服务（三）：搭建Openfire服务器+测试2款IM客户端》</a>（外网地址）</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三篇文章详细讲解了基于XMPP协议的openfire服务架设，以及使用2款异构的基于XMPP协议的桌面客户端测试即时消息传递。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特别提示：为了更好的了解本项目要解决的问题，强烈建议去看看前面的三篇连载。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>二、Location-Aware-Instant项目概括</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location-Aware-Instant是一个运行在Android OS 上具有位置即时感知功能的Android应用程序客户端。与之前第三篇文章里介绍了2款桌面程序一样，遵循开放标准的XMPP协议。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发过程查找和参考了不少外文资料和相关项目，利用周末和晚上的时间、现在已经终于完成了90%。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本程序的架构和技术基础：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. Android OS 应用开发技术：包括地图应用开发。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. Openfire服务器：基于XMPP协议的开源Java服务器端程序。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. Smack 开发库：对XMPP协议进行了封装的客户端实现的Java开发包。本项目采用的是ASmack Library（适合与Android OS 的Smack优化版）。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本项目的实现原理。共分三个层次：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 首先使用Openfire作为服务器，通过使用ASmack库开发出带有联系人列表的即时消息传递程序；</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 然后客户端发送和接收消息之间植入自己的拦截预处理逻辑，并通过定制特殊的命令，实现消息的自动应答功能；</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 最后一层在接收消息时，根据预处理命令判断是否对方的意图为定位请求，如果是则调用位置定位相关方法获取本地位置并自动恢复给发送请求一方，请求方根据预处理命令判断到来的消息是否与位置相关，如果有关则将对方的位置定位在Google 地图上。</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意：本文的内容是描述一种应用，并非代码讲解（本项目可能以后会结合Android开发总结来讲解）。&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; </p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>三、项目功能展示</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于只有一台测试手机HTC G6，而这个项目是与位置有关的，所以用Android 开发模拟器来最为双方通信的一端。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试帐号分别是<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#50;&#64;&#49;&#57;&#50;&#46;&#49;&#54;&#56;&#46;&#48;&#46;&#49;&#55;&#55;">test2@192.168.0.177</a>(由于登录htc g6上的Location-Aware-Instant客户端)，<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#64;&#49;&#57;&#50;&#46;&#49;&#54;&#56;&#46;&#48;&#46;&#49;&#55;&#55;">test@192.168.0.177</a>（用来登录模拟器上的Location-Aware-Instant客户端）。上面2个帐号格式是Jabber Id（XMPP协议中的帐号，可以参考前排第二篇介绍XMPP的文章），本来是使用<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#64;&#105;&#109;&#46;&#99;&#111;&#109;&#105;&#116;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">test@im.comit.com.cn</a> 在其他桌面客户端解析正常，但手机将im.comit.com.cn的域名解析成一个其他的IP，所以直接使用我本机的IP地址。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本程序的logo：<a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751421591.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="icon" alt="icon" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751423510.png" border="0" height="56" width="57" /></a>，logo来源自百度百科的XMPP介绍：<a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751425952.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175143346.png" border="0" height="109" width="158" /></a>，我简单的处理了一下。&nbsp;&nbsp; </p> <p>&nbsp;</p> <p align="left">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 首先是登录界面（分别使用上面的2个帐号登录两款手机客户端）：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175145704.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="g6_login" alt="g6_login" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751479426.png" border="0" height="451" width="219" /></a>HTC g6的登录界面&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751483995.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="login" alt="login" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751498880.png" border="0" height="484" width="324" /></a> 开发模拟器的登录界面</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 双方登录并连接到openfire服务器时，会出现双方的在线情况。也就是在服务器上注册了自己的状态为在线。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751521930.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="g6_list" alt="g6_list" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751533401.png" border="0" height="451" width="219" /></a>HTC g6可以看到对方（test）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751543335.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="list" alt="list" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751545221.png" border="0" height="484" width="324" /></a>开发模拟器显示test2在线</p> <p>&nbsp;</p>        <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 操作（目前只加入了定位对方的功能，其实还有发送普通信息、删除联系人等功能，添加联系人）</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751565022.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="g6_list_op" alt="g6_list_op" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751584824.png" border="0" height="451" width="219" /></a>HTC g6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271751596677.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="list_op" alt="list_op" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175200482.png" border="0" height="484" width="324" /></a></p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. 先来看通过手机模拟器定位htc g6客户端的演示，即点击第三步中手机模拟器(右边)的&#8221;获取位置&#8220;选项操作。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然测试环境在室内，无法获取GPS信号。但HTC g6插入了联通的3G卡所以即时在室内也是可以使用基站定位大概位置。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752036314.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="locate" alt="locate" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752058558.png" border="0" height="484" width="324" /></a></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此时手机模拟器在向G6发送位置感知的请求，G6应该回应自己所在的位置，不到2秒钟后，得到的结果如下图：</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752088261.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="locate_ok" alt="locate_ok" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752111552.png" border="0" height="484" width="324" /></a></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我住在棠下，所以G6通过基站大概定位了我的位置，并将位置数据回应给手机模拟器，模拟器将G6所在的位置定位在地图上。</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  5.  上面演示了通过模拟器定位到G6的位置，现在演示的是G6获取模拟器的位置。但是因为手机模拟器不能获取真实的位置信息，也就无法将自己的信息回复给 G6。解决的方法是在开发工具中输入一个自定义的位置数据。如下图，输入公司在所位置的经纬度（23.143791, 113.347533）。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175211406.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="latlng" alt="latlng" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752128388.png" border="0" height="311" width="338" /></a></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图中emulator 5554就是我们的模拟器（HT03GNX0404是HTC G6手机）。这样模拟器的位置就定位在公司做位置。</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在尝试通过G6来感知模拟器这个客户端所在的位置，即点击第三步中HTC G6 (左边)的&#8221;获取位置&#8220;选项操作。结果如下图：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752151372.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="g6_locate" alt="g6_locate" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752195120.png" border="0" height="451" width="219" /></a></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; G6客户端程序正在等待手机模拟器的回应，不到2秒钟后：</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752235247.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="g6_locate_ok" alt="g6_locate_ok" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175227358.png" border="0" height="451" width="219" /></a></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK，成功定位到公司所在位置，即G6即可感知到了手机模拟器的位置信息。</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到这里手机的位置感知服务基本框架已经出来了。能够即可感知对方的位置，是不是很Cool的体验！</p>  <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>四、项目内容以及结构介绍（代码太长，截图分成上下两部分）</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175229476.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="项目结构" alt="项目结构" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752308915.png" border="0" height="489" width="422" /></a>图1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/201103271752313276.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="项目结构2" alt="项目结构2" src="http://images.cnblogs.com/cnblogs_com/charley_yang/201103/20110327175232669.png" border="0" height="588" width="294" /></a> 图2</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代码结构介绍：以下包名忽略了cn.com.comit.locationaware父包</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图1：chat包：与消息发送有关的类</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data包：联系人列表，消息等实体类</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dialogs包： 交互有关的对话框类</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exception包：异常相关的类</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map包：与地图和LBS有关的类</p>  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图2：service包：封装Smack库和对方提供XMPP服务的封装类。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; util包：工具类包</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; widget.quickantion包：联系人操作（如第三章第3步中的&#8220;获取位置&#8221;）操作选项控件类</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cn.com.comit.locationaware父包：入口以及辅助类</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Google APIs 2.2：引用的google android 地图开发包</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 引用的库：asmack-2010.05.07.jar &#8211; Smack的Android优化版API库、trace.jar错误追踪相关包。</p> <p>&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>五、结束语</strong></p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  1. 传统网络操作方式我们用到 Restful  Get获取数据、Post提交数据，但这不是万能的（虽然可以解决大多数的网络应用问题）。通过引入基于PubSub（发布/订阅）的即时通信有时候可以 取得意想不到的体验效果，本项目提出了一个研究方向和思路（虽然离商用还有很长的路要走，可路终究是找到了一条，并且迈出了&#8220;万里长征的第一步&#8221;）。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 最近基于LBS的应用层出不穷，能够将LBS和即时通信进行整合运行，让研究的方向更明确（例如本项目的自动应答功能）。</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 将即时通信和LBS有机的结合或许可以称作为传说中的&#8220;微创新&#8221;，毕竟创新不一定是非得创造。</p></div><img src ="http://www.blogjava.net/jelver/aggbug/352151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-06-12 22:04 <a href="http://www.blogjava.net/jelver/articles/352151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手机流媒体技术简介 [zhuan]</title><link>http://www.blogjava.net/jelver/articles/345876.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Mon, 07 Mar 2011 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/345876.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/345876.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/345876.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/345876.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/345876.html</trackback:ping><description><![CDATA[<div>http://blog.csdn.net/marsgongna/archive/2008/12/04/3442247.aspx<br />
<br />
手机作为人们必备的移动通信工具，目前在全球已经有超过10亿的用户，其数量还在不断地增长。随着移动多媒体时代的到来，用手机看电视，用手机看电影，用手机听音乐等使用移动<a href="http://www.rosoo.net/a/list_51_1.html" target="_blank"><u>流媒体</u></a>技术的应用，已经在中国迅速发展起来。</div>
<div><strong>一、什么是流媒体技术？</strong></div>
<div>流媒体技术是从互联网上发展起来的一种传送多媒体数据流的技术，其主要特点是以流（streaming）的形式进行多媒体数据的传输。采用流媒
体技术的客户端播放器在播放一个多媒体内容之前，预先下载媒体内容的一部分作为缓存，在将缓存中的这部分内容向用户播放的过程当中，该多媒体内容的剩余部
分将在后台从<a href="http://www.rosoo.net/a/list_52_1.html" target="_blank"><u>服务器</u></a>继续下载到客户端播放器上。这样，一边客户端播放器在不断播放缓冲区中的多媒体内容，另一边多媒体内容的其他部分从后台<a href="http://www.rosoo.net/a/list_52_1.html" target="_blank"><u>服务器</u></a>不断地传输到缓冲区中，这样就实现了所谓&#8220;边下载，边播放&#8221;流式播放。</div>
<div>流媒体技术应用到移动网络和终端上，称之为移动流媒体技术。从上面所述我们可以看到，移动流媒体技术具有三个突出特点：（1）能够实时播放视音
频等多媒体内容，也可以对多媒体内容进行点播，具有交互性。可以让用户摆脱被动接受内容的苦恼，而灵活自主、随时随地地选择自己想观看的内容，从而更加个
性化。（2）播放的流媒体文件不需要在客户端保存，减少了对客户端存储空间的要求，也减少了缓存容量的需求。（3）由于流媒体文件不在客户端保存，从而从
一定程度上解决了媒体文件的版权保护问题。</div>
<div><strong>二、手机播放流媒体文件的基本要求</strong></div>
<div>（一）手机操作系统</div>
<div>目前，智能手机的操作系统主要有<a href="http://www.rosoo.net/a/list_36_1.html" target="_blank"><u>Symbian</u></a>、Windows&nbsp;Mobile、Palm、<a href="http://www.rosoo.net/a/list_49_1.html" target="_blank"><u>Linux</u></a>。其中<a href="http://www.rosoo.net/a/list_36_1.html" target="_blank"><u>Symbian</u></a>、和Windows&nbsp;Mobile系统的使用占据了大多数。 Palm的份额主要来自它的PDA支持。</div>
<div>1、Symbian操作系统</div>
<div>Symbian是诺基亚、摩托罗拉、索尼爱立信等几家电信巨头联合开发的操作系统，据统计，使用Symbian平台的智能手机占据70%。该操
作系统以占用资源小、对硬件要求低、第三方软件支持广泛等优势，成为目前智能手机市场上应用最为广泛的产品，Symbian操作系统下主要使用S60、
UIQ、S90这三种操作平台。</div>
<div>（1）Series S60：S60操作平台具备了Symbian&nbsp;OS操作系统操作的简易性，支持KJAVA和<a href="http://www.rosoo.net/a/list_100_1.html" target="_blank"><u>C++</u></a>开发的针对单手使用的设计，支持的屏幕分辨率为176*208象素。S60界面是拥有最多第三方软件（游戏）的界面，是目前Symbian系统中使用最广泛的版本。主要支持的手机以诺基亚7650、7610、6260等最为典型。</div>
<div>（2）UIQ&nbsp;Series：UIQ&nbsp;Series操作平台的特性主要表现在它的多媒体和功能全面的特性。UIQ&nbsp;Series是
Symbian&nbsp;OS&nbsp;的系统架构下，专门为高端多媒体手机而设计，可支持手写操作，使用起来非常类似&nbsp;PDA&nbsp;操作，适用人群主要定位在高端商务用户。
主要应用有索爱P系列以及诺基亚6708及BENQ&nbsp;P30等。</div>
<div>（3）Series S90：Series90是Symbian平台上最年轻的界面，改手持触摸为操控模式，分辨率高达640*320像素。但目前支持Series 90的只有诺基亚7700（未投产上市）和7710两款手机，更多第三方软件的支持尚需一定时日。</div>
<div>2、Windows&nbsp;Mobile操作系统</div>
<div>（1）Pocket&nbsp;PC&nbsp;Phone系统：Pocket&nbsp;PC是一种手持设备，可帮助使用者存储并检索电子邮件、联系人和约会信息，播放多媒
体文件，玩赏电子游戏，借助MSN&nbsp;Messenger交换文本消息，浏览Web内容等。主要适用机型有BENQ的P50以及多普达696、818、
828等机型。</div>
<div>（2）Smartphone&nbsp;系统：同是微软公司门下的产品，操作界面和WINDOWS非常相似，注重移动互联和娱乐功能。没有触控笔和触摸屏，体现单手操控的理念，全以数字键盘代替。适用机型有多普达的5系列手机。</div>
<div>（二）下载安装终端播放器</div>
<div>对所有操作系统及其不同版本都实现适配的播放器是不存在的，基于成本、开发周期及其它因素的考虑，属第三方软件的流媒体播放器大部分都只是基于以上操作系统实现的。</div>
<div>通过WAP网站，具备上述操作系统的各型号手机，可以直接匹配到适合的流媒体播放器。一般在下载后会直接进入到播放器程序的安装过程，根据系统提示完成安装后，就可以随时、随地享受移动流媒体服务了。</div>
<div><strong>三、手机播放流媒体文件的一般技术过程</strong></div>
<div>（一）3GPP标准中的<a href="http://www.rosoo.net/a/list_46_1.html" target="_blank"><u>协议</u></a>栈</div>
<div>主要包括以下几种：</div>
<div>&#183;RTP（实时传输协议）：RTP被定义为在一对一或一对多的传输情况下工作，其目的是提供时间信息和实现流同步，例如：音频、视频或模拟数据。RTP不处理资源预定，并且不保证实时服务的服务质量，通常使用UDP来传送数据。</div>
<div>&#183;RTCP（实时控制协议）：RTCP的主要功能是为数据的传送情况提供反馈。接收端定期将报告信息发送给发送端（报告信息包括：接收端测量到传输过程中的不稳定情况和信息包丢失的数量）。</div>
<div>&#183;RTSP（实时流协议）：RTSP被用于建立和控制连续媒体的时间同步流。它为多媒体服务扮演&#8220;网络远程控制&#8221;的角色。RTSP是文本协议并且类似HTTP，其主要不同之处在于RTSP是标准的流媒体协议，并通常利用独立传输协议（通常是RTP）来传输媒体数据。</div>
<div>&#183;SDP（会话描述协议）：SDP是服务器端生成的描述媒体文件的编码信息以及所在的服务器的链接等信息，客户端通过它来配置播放软件的设置。它是一个简单、可扩展语法的文本协议。</div>
<div>所有这些流媒体相关协议都是利用TCP和UDP传送。其中，RTSP是主要的协议，在体系结构上位于RTP、RTCP之上，属于应用层协议，被用于建立和控制连续媒体的时间同步流。它为多媒体服务扮演&#8220;网络远程控制&#8221;的角色。</div>
<div>（二）RTSP单播操作的过程描述</div>
<div>一次基本的RTSP单播操作，其实就是用户播放一个流媒体节目的过程。首先，客户端通过浏览一个带RTSP
URL地址的网页等方法来获得媒体片段的位置。在流媒体会话初始化的时候，流媒体播放器连接到流服务器并发送一个RTSP描述命令。这个&#8220;描述命令&#8221;包括
了客户端可以发送的类似音频信道的数量、支持的媒体类型、屏幕尺寸大小和平均象素等信息。流服务器通过一个SDP描述来进行反馈，反馈信息包括流数量、媒
体类型和请求带宽。在分析完该描述之后，客户端为会话中的每一个流发送一个RTSP安装命令，安装命令告诉服务器在客户端用于接收媒体数据的端口。流媒体
连接建立完成后，客户端发送一个播放命令，服务器就开始在UDP上传送媒体流（RTP包）到客户端。最后，客户端可发送一个终止命令来结束流媒体会话。</div>
<div>（三）用户从手机上看到的流程</div>
<div>上述RTSP操作过程对用户是透明的。用户从手机上看到的只是：当他通过WAP网站选择播放一个节目后，手机操作系统自动启动了已安装的播放
器，播放器通过GPRS网络连接到媒体服务器，并开始缓冲，他只需在缓冲到100%前的任何时刻点击&#8220;播放&#8221;按钮，或等待缓冲到100%时播放器自动播
放，就可以开始欣赏音视频节目。</div>
<div>&nbsp;</div>
移动流媒体技术的应用开创了无线通信网络与互联网、视音频压缩编码技术相融合的新时代，随着手机、PDA等移动终端产品功能的不断提升，移动流媒体技术必将带给人们更多、更好的音视频体验
<img src ="http://www.blogjava.net/jelver/aggbug/345876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-03-07 13:28 <a href="http://www.blogjava.net/jelver/articles/345876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手机视频监控系统</title><link>http://www.blogjava.net/jelver/articles/345875.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Mon, 07 Mar 2011 05:23:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/345875.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/345875.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/345875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/345875.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/345875.html</trackback:ping><description><![CDATA[手机视频监控系统是通过用户的手机随时随地来观看远程监控点的视频。那么手机视频监控是如何实现的呢？整套系统是基于互联网而运行的，通过在某个地方安置的监控摄像机拍摄，并将拍摄的视频画面经过视频<a href="http://www.rosoo.net/a/list_52_1.html" target="_blank"><u>服务器</u></a>压缩处理后上传到互联网中，通过网络传输到监控中心的视频监控<a href="http://www.rosoo.net/a/list_52_1.html" target="_blank"><u>服务器</u></a>，然后使用手机上网的方式，登陆到视频监控<a href="http://www.rosoo.net/a/list_52_1.html" target="_blank"><u>服务器</u></a>然后获得监控资源列表，然后可以选择监控的视频。当用户进入到监控画面是还能简单的控制远端的云台，保证自己得到想要的角度。前端的监控摄像机端是通过有线或无线的方式连接到互联网，手机视频查看端是使用无线上网的方式实现。 <br />
&nbsp;&nbsp;&nbsp; 双码流就是对同一视频源，我们会对它进行两次编码，一路可以是 D1/CIF, 另一路是 QCIF. 因当前手机带宽的限制，我们在手机端采用
QCIF 传输，码流为 16Kbps-64Kbps 可调。在 PC 上传输 D1/CIF, 码流为 16Kbps-2Mbps 可调。
保证监视图象的清晰。 <br />
&nbsp;&nbsp; 只要您有手机，手机视频监控系统为你实现随时随地、随心所欲的看到您的住宅、仓库、工厂、道路及安全场所的实时视频，一切视频都呈现在您的手机上。凡摄像机能拍到的，你就能通过手机看到，任何时间任何地点，走到哪看到哪，想看哪就看哪。
<p>1 、采用<a href="http://www.rosoo.net/a/embedded/" target="_blank"><u>嵌入式</u></a>技术 （系统稳定） ，无需电脑就可以独立工作，同时支持 GPRS 、 CDMA 、 EDGE 、 3G 手机无线网络，也就是说只要是有手机网络的地方就能随时随地实现实时的视频监控。&nbsp;</p>
<p>2 、 D1 高清晰网络视频服务器，兼容 D1 、 CIF 格式。</p>
<p>3 、 采用 H.264 视频压缩算法，轻松实现高清晰图像的低网络带宽传输 , 手机实时查看视频可达 20 帧，视频图象实时、流畅。&nbsp;</p>
<p>4 、支持动态 IP 地址、 DNS ，支持局域网、 Internet （ ADSL 、有线通）</p>
<p>5 、可使用中心管理软件实现对多台视频服务器的集中监控和管理，方便组建大型视频监控系统。</p>
<p>6 、网络自适应技术，根据网络带宽自动调整视频帧率。</p>
<p>7 、随时随地的移动监控，专业的电脑远程同步监控录像功能</p>
<p>8 、手机端浏览实时图像的同时，电脑端可同步对图像进行浏览、录像、回放、管理</p>
<p>9 、宽实时视频传输，支持众多型号手机。</p>
<p>10 、支持远程云台控制功能，视角更广</p>
<p>11 、监控点之间随意切换，多部手机可同时监控&nbsp;</p>
<p>12 、报警自动给指定手机发短信及给指定邮箱发邮件。</p>
<p>基本功能&nbsp;</p>
<p>实时报警：监控场地发生意外情况时，通过活动视频向手机报警。</p>
<p>主动查看：平时也可以随时随地的查看监控场地的情况。</p>
<p>在线设置：可以通过手机对监控设备进行设置，比如是否入侵检测，开机关机，图像设置等。</p>
<p>服务器存储：在向手机报警的同时，将高清晰的图片存储到服务器上，以备查用。</p>
<p>&nbsp;远程视频监控、手机视频监控系统解决方案<br />
如今，以嵌入式技术为依托，以网络、通信技术为平台的网络视频监控，已经越来越成熟，应用范围越来越广阔。网络视频监控突破了地域的限制，实现了远程
监控，可是，随着 &#8220; AnyTime、AnyWhere、
AnyDevice&#8221;(任何时间、任何地点、任何设备)等概念的提出，普通的网络视频监控已经不能满足用户日益增长的多元化需求。全新的解决方案?&#8220;手机
视频监控&#8221;使这个问题有了答案，这项应用将在安防行业中得到迅速推广和普及，同时，她也会逐渐走入人们的家庭生活中。</p>
<p>　　手机视频服务器，该设备在开启后，通过已连接的路由器，可直接连接到Internet网络(可独立运作于标准网络环境，无须外接计算机)，然后
将拍摄到的影音视频信号压缩成H.264格式，再发送到Internet。而用户端设备则变成了我们日常用的手机。手机通过GPRS或者CDMA(目前国
内普遍的两种上网方式)上网后，通过查看设备的动态域名+端口，就可以看到手机视频服务器中拍摄到的影音文件了。用户第一次启用这个设备时，要通过在同一
个网络中的电脑对其进行简单的设置(包括用户名、权限、域名、端口等)，以后每次启动，就不再需要设置了。实际上，是集数据采集、网络<a href="http://www.rosoo.net/a/list_53_1.html" target="_blank"><u>视频编码</u></a>、压缩和网络连接为一体，因此严格的说他是一台网络视频服务器。她的应用范围很广，比如：企业、商场监控;幼儿园、托儿所等场所的远程观看;儿童、老人看护;家庭和别墅的安防监控等等。</p>
<p>　　某钻石专卖店数字监控方案</p>
<p>　　某钻石专卖店主营金银首饰和宝石等贵重饰品，为了店内安全，做到能及时处理突发事件，全面掌握犯罪证据，而且考虑到公司总部与店面两个城市的跨地区管理，采用以手机视频服务器为数字传输方式的远程数字监控方案。</p>
<p>　　随着科技的进步，以网络传输的手机视频服务器作为安防监控的第五代产品，在安防界脱颖而出。手机视频服务器把前端的模拟信号采集，通过硬件压缩
为数字信号传输。它独特的稳定性和无人职守，随时都可以在已有的局域网和广域网上访问浏览等优点深受广大终端客户和各地工程商的喜爱。手机视频服务器逐步
占领安防市场。</p>
<p>　　(1)案例分析：</p>
<p>　　钻石专卖店在两年以前就安装了一套以视频压缩卡为采集视频方式的硬盘录像解决方案。随着时间的推移，无论从前端摄像机部分还是从后端的电脑主机，以压缩卡为采集视频的方式毛病曾出不穷，电脑死机更是家常便饭，而且视频画面效果极差，画面速度延时严重。</p>
<p>　　加上公司总部和店面在跨地区的两个城市，鉴于硬盘录像机网络的弊端，不能随时进行网络远程传播。公司领导只能来往于两地奔波，而进行店面的管理，严重影响了工作效率。</p>
<p>　　(2)网络数字解决方案：</p>
<p>　　1、以塬有的线路为传输视频的方式，不改变任何的线路，且使用塬有的摄像机，直接在机房内用手机视频服务器连接塬有接入视频采集卡的模拟线路，设置好手机视频服务器IP为局域网IP，这样本地局域网内就可以实现监控和录像。</p>
<p>　　2、考虑到远程监控和录像，必须申请一条普通的ADSL宽带线路。手机视频服务器只有一个RJ45接口，直接接入ADSL的话，局域网内就不能
进行监控。为了实现本地远程双重监控，可在机房内设置一个普通路由器。实现局域网内本地监控，且局域网内各个电脑都能实现网上冲浪。</p>
<p>　　家庭监控方案</p>
<p>　　随着经济的快速发展，人们生活节奏的提高，照顾家庭的时间将越来越少。但现代科技的高速发展可以让远程照顾小孩、家庭宠物等成为一种可能。人们
在可以繁忙工作的同时，在远程就了解自己家庭概况，及时作出分析与判断。随着网络通讯技术及图像压缩处理技术以及传输技术的快速发展，使得家庭能够采用最
新的通讯和图像处理技术，通过网络传输数字图像，可为实现家庭监控系统提供高效可行而且价格低廉的解决方案。</p>
<p>　　家庭监控方案特点:</p>
<p>　　本方案立足以互联网、宽带ADSL应用方案，采用手机视频服务器 &#8220;传统摄像机&#8221;+&#8220;手机视频服务器&#8221;的方式，摄像机负责影像采集,
手机视频服务器负责把摄像机的模拟信号进行数字压缩，转换成数字信号，最后手机视频服务器通过路由器或交换机或ADSL将视频传输到局域网或互联网。</p>
<p>　　◆ NO-PC架构</p>
<p>　　◆ 预设二级域名</p>
<p>　　◆ 安装简单快捷</p>
<p>　　◆ 外围设备接入灵活</p>
<p>　　◆ 高性能 低成本 免维护 更安全</p>
<p>　　家庭监控标准版方案</p>
<p>　　由一台通过手机视频服务器并在网络端通过网线连接ADSL MODEM;</p>
<p>　　的自带拨号程序连通电源后会自动连接INTERNET，远端用户可以通过IE浏览器直接观看家中情况。</p>
<p>　　实际可应用的范围：</p>
<p>　　- 商业店铺：商场店铺的监控，收银、货架、出入口监控</p>
<p>　　- 居民住宅：室内远程图象报警、小区 / 大楼安全防范、物业的无人监控</p>
<p>　　- 教育行业：幼儿园、小学校的教学评估，家长远程监控</p>
<p>　　- 旅游行业：宾馆饭店的楼层管理、重点文物及景点的保护</p>
<p>　　主要应用：</p>
<p>　　1、店铺超市：店铺老板在家中或外地，只要通过 Internet 或手机随时可看到店铺实景情况，员工的工作情况，进行远程监控和管理。</p>
<p>　　2、企业：企业领导以及各部门需要随时了解员工工作情况，车间生产情况、流水线运作情况等，对突发事件需要进行即时处理。不需到场，只要上互联网或手机随时可看到外地各分部的实时情况。</p>
<p>　　3、家庭：可在办公室或外地通过互联网或手机随时看到家庭的现状。家庭窃案或其它事故发生，可快速查找到当时录像。</p>
4、幼儿园：家长们在家里通过互联网或手机实时监控幼儿在园里情况，解决了对孩子的担忧
<img src ="http://www.blogjava.net/jelver/aggbug/345875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-03-07 13:23 <a href="http://www.blogjava.net/jelver/articles/345875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手机视频监控系统需求</title><link>http://www.blogjava.net/jelver/articles/345874.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Mon, 07 Mar 2011 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/345874.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/345874.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/345874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/345874.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/345874.html</trackback:ping><description><![CDATA[<p><strong>一、手机监控软件功能需求</strong></p>
<div><strong>1.1 </strong>功能概述</div>
<div>手机监控软件，可以通过登陆手机视频<a href="http://www.rosoo.net/a/list_51_1.html" target="_blank"><u>流媒体</u></a>，获取其转发的设备的码流进行解码输出到手机屏幕上(<a href="http://www.rosoo.net/a/list_35_1.html" target="_blank"><u>Windows Mobile</u></a>手机能够自动拨号连接上网络)。</div>
<div>主要功能：</div>
<div>1、登陆手机视频网关，根据所用户登入的用户来选择赋予的权限(获取该用户可看的视频源)。</div>
<div>2、选择视频源浏览视频，对手机视频网关过来的码流进行解码，并实时显示到手机屏幕上。</div>
<div>3、通过手机导航键进行云台控制。</div>
<div><strong>1.2 </strong><strong>性能概述</strong></div>
<div>目前，手机监控软件运行平台是WINCE，但考虑到项目的发展，以及客户的需求，应该可以使用J2ME技术来开发，使用的Java解码库，支持对单P帧，帧率为6的QCIF视频码流的解码。</div>
<div><strong>1.3 </strong><strong>运行环境</strong></div>
<div>硬件环境：手机或者PDA(WINCE操作系统)。</div>
<div>*以后应该支持JAVA平台的手机监控软件</div>
<div><strong>1.4 </strong><strong><a href="http://www.rosoo.net/a/list_52_1.html" target="_blank"><u>服务器</u></a>的配置</strong></div>
<div>　　用户在使用手机软件时，应该是可以配置可以自行配置登入用户、密码、服务器地址、服务器端口，在下次登入时，不需要重新输入以上信息。</div>
<div><strong>1.5 </strong><strong>实时图像的浏览</strong></div>
<div>用户通过手机软件，能进实时图像的浏览，保证视频每秒6帧以上的QCIF的图你，并能进行各通道间的切换。</div>
<div><strong><font size="5">1.6 云台控制</font></strong></div>
<div>通过手机可以对前端云台进行控制。</div>
<div><strong><font size="5">1.7 图像的缩放</font></strong></div>
<div>手机能通过手机菜单进行视频的缩放</div>
<div><strong><font size="5">1.8 手机用户的注销</font></strong></div>
<div>&nbsp;&nbsp; 用户在点击注销菜单时，注销所登入的用户，但不退出软件。</div>
<div><strong><font size="5">1.9 手机视频的回放</font></strong></div>
<div>用户通过手机软件进行视频的回放(按时间段或文件类型进行查询,特别是针对报警录像的回放)</div>
<div><strong><font size="5">1.10 手机软件LOGO的叠加</font></strong></div>
<div>可根据用户的需求更换手机软件的LOGO。<br />
&nbsp;</div>
<div><strong>二、手机视频网关的功能<br />
</strong></div>
<div><strong>2.1 </strong>功能概述</div>
<div>手机视频网关部署在监控中心计算机上。它管理手机登录用户和DVR子码流视频源，同时可以配置视频源的码率等等参数以及配置不同级别用户对应的视频源请求权限和云台控制权限。</div>
<div><strong>2.2 </strong>性能概述</div>
<div>手机视频网关可以管理的视频源最大个数为5120；</div>
<div>可以管理的手机用户最大个数为5120；</div>
<div>允许登录的最大手机用户数为512；</div>
<div>一路视频源的最大请求数为16。(一般DVR监控设备对每一通道有连接限制)</div>
<div><strong>2.3 </strong>运行环境</div>
<div>本系统的运行平台：</div>
<div>硬件环境：PC（主频1.5G以上、主存512M以上、可用硬盘空间20G以上）</div>
<div>软件环境：Windows 2K/XP/2003</div>
<div><strong>2.4 </strong><strong>视频源配置</strong></div>
<div>用户可能通过手机视频流媒体软件配置前端DVR的基本信息，使用用户可以直接通过该软件直接获取视频流。</div>
<div><strong>2.5 </strong><strong>用户的添加与权限的修改</strong></div>
<div>用户可以通过该软件对手机软件使用的用户进行用户的增减，以及权限的配置（包括：实时视频的浏览、云台控制、历史录像的回放）<br />
<br />
&nbsp;</div>
<div><strong><span>三、手机客户端扩展功能<span> <br />
<br />
</span></span></strong></div>
<div>3.1 流量统计,显示当前传输速率及帧率;</div>
<div>3.2 前端监控点发生报警时候,能够以短信或彩信(带报警发生时现场截图)形式通知到手机;</div>
<div>3.3 能够通过手机客户端对远程监控点进行布撤防等操作</div>
<div>3.4 结合GIS系统显示监控点位置以及周边环境,从综合监控平台获取监控点信息(如危险源企业信息,应急预案)</div>
<div>3.5 查看当前浏览视频源前端关联的传感器采集的值(通过采集服务器转发到手机客户端),查看实时与历史数据(最好能够以曲线显示表示)</div>
<img src ="http://www.blogjava.net/jelver/aggbug/345874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2011-03-07 13:21 <a href="http://www.blogjava.net/jelver/articles/345874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我看手游CP出路![转帖]</title><link>http://www.blogjava.net/jelver/articles/341819.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Tue, 28 Dec 2010 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/341819.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/341819.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/341819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/341819.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/341819.html</trackback:ping><description><![CDATA[<span style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span style="font-family: Verdana,'Lucida Grande',Arial,Helvetica,sans-serif; font-size: 14px; line-height: 25px;">
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><a href="http://sns.spforum.net/space.php?uid=30846&amp;do=blog&amp;id=17246">http://sns.spforum.net/space.php?uid=30846&amp;do=blog&amp;id=17246</a></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;">CP，CP！很多朋友看我写的文章之后，总是不忘了问，那吴刚手机游戏机会在哪里呢？唉&#8230;&#8230;问的我头大。那我就认真写写吧&#8230;&#8230;当然，如果你真的做了，赚不到钱，你可千万别怪我了，没有哪个事情没有风险，没有哪个市场是轻松可以进的。但看了我的文章，促使您思考了，了解到新东西了，或者假若去做了，真赚到了，您就帮我挂块匾到天安门城楼，上书四个大字CP万岁！哈哈&#8230;&#8230;开个玩笑了，我不图啥，一帮鸟人，别说我吴刚装B就行了，谁说我装B，你们合伙替我骂他！我开心！说实话，我只关心关心我的人的评价。别人爱骂骂去，有本事骂人的家伙也这么炒作一下，多好！</p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;">先说个笑话</p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;">&nbsp;&nbsp;&nbsp; 我的朋友认为没有电源线的设备就叫无线设备，我来完善一下，不需要连电源线的设备能玩的游戏就叫无线游戏。至于手机游戏这个词、无线互联网这个词，看文章前先扔掉，不然看着纠结！</p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;">我从技术平台来划分，来看机会。</p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;">1、&nbsp; IPHONE</p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;">休闲类游戏、女性游戏？</strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;">从单机游戏角度来说，IPHONE还是存在很大机会的，但竞争也相当激烈，题材、游戏特色将是中国CP突破的重点。千万不要指望自己在百宝箱上的RPG可以拿到APPSTORE上继续卖钱。IPHONE对休闲类游戏的接纳程度很高，并且女性玩家也有相当的比例。我知道的是任天堂的女性玩家2009年底有1100万，占了80%。FACEBOOK有68.2%。联通IPHONE 40%女性用户，全球IPHONE女性用户大概是46%-42%，这要比Android 27%的女性用户比例高不少。</strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">技术特点产生游戏玩法创新</strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">IPHONE4已经推出了，我还没有拿到真机。但从技术参数来看，我关注了四点，一、广告的植入，二、陀螺仪，三、分辨率。四、触摸屏。头一点，我们不谈，我重点说后三项。</strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">陀螺仪是一个重要的革新，如果国内CP想要讨巧出小品游戏赚钱，一定要充分考虑这个东西的作用。我拍脑袋一想，就能想出非常多好玩的东东。这个陀螺仪不同以往，它更加精确，能辨别方向、速度等。玩家的肉体与手机互动，这是多么有意思的一件事啊。CP不要傻卖力气，一定要做出跟以往不同玩法的游戏才能生存。</strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">分辨率导致生产工艺的变化</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">IPHONE4的超高分辨率，使得过去NOKIA S40的128*128美术生产工艺要彻底进阴沟了，这是否意味着，手机游戏开发与PC游戏开发要通盘考虑？至少在美术制作环节上都是这样的。最后，触摸屏游戏，国内CP普遍储备不足，这绝对不是你在触摸屏上仿真一个方向键这么简单，从界面到策划，必须要针对触摸屏开发才可！</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">IPHONE游戏是场硬仗，如果你打输了，千万不要怪市场不好，那100%是你能力的问题，1个亿的IOS装机量，我们可能无动于衷么？回避主流市场，你还敢说自己是做手机游戏的？呵呵&#8230;&#8230;我对于这样的事情最有兴趣，因为这是实力和脑力的比拼，CP梦寐以求的不就应该如此么？推广成本是IPHONE的最令人头痛的问题，我所知道的解决的办法：<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">1）&nbsp; 利用很多现成的广告平台。</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">2）&nbsp; 多做免费游戏，然后进行交叉营销。</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">3）&nbsp; 找海外公司多做些软性宣传</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">4）&nbsp; 得到APPLE的推荐支持</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">5）&nbsp; 找海外信用卡！刷&#8230;&#8230;（这个我不推荐，只是让你知道有这么回事）</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">2、&nbsp; Android、HTML5、FLASH</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">在某种程度上来说，我认为Android与HTML5、FLASH是息息相关的，因为新版本已经支持了这些内容，选切入点是我们必须要慎重的。Android在国内、在海外会有量的，现在就已经看出个所以然，它未来在某种程度上会替代当今山寨手机的地位，或者说山寨手机也Android了！APPLE在各国的强势，导致在价值链中，很多公司无法参与，心生嫉恨，那么推动Android的手机，是他们为数不多的选择之一。但成也萧何败也萧何，由于厂商的过渡分散，也会导致一些很讨厌的问题，但对于UCWEB这样的平台公司来说，是个利好！我现在了解到的情况，很多国家的运营商都在找Android的游戏，希望有个清单供他们选择。<br style="word-wrap: break-word;" />
<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">具体说说，Android手机上用什么开发最好，我觉得还是FLASH吧！FLASH很多人都说，APPLE不支持一定走不远，但我看也未必，APPLE对待HTML5和APPSTORE的态度是很微妙的。况且，HTML5的各种开放应用，开发工具还少得可怜，运行效率或者还不如FLASH，而FLASH有了PC上庞大的客户群，还有FLASH LITE的过度，在近阶段是不可以放弃的。当然，如果CP们还抱着K-JAVA不松手，1-2年就有被边缘化的风险了。我跟不少CP谈过FLASH的情况，他们后来使用了FLASH开发游戏，都高呼FLASH开发游戏简直就感觉去了天堂。从我的视野看到手机游戏公司，明珠、拉阔、呈天游、我们顽石都已经推出或准备推出WEB FLASH的网游了，并且效果不错。我认为这是在当下一个最好的跨平台、跨设备、跨地区国家运营的解决方案。做K-JAVA的开发人员，请抓紧放弃，明珠老板KJ是SUN公司出来的，都没那么深感情，你们何必呢，呵呵&#8230;&#8230;<br style="word-wrap: break-word;" />
<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">说到HTML5，这是个好东西，是腐朽HTML的一次质的飞跃了，但是但是，这东西能否NB取决于GOOGLE与APPLE的态度，APPLE如何让他放弃APPSTORE去推HTML5这是件很难的事情，更何况大力推HTML5是帮了GOOGLE还是帮自己都难说。往往业界大腕都&#8220;支持&#8221;的事，一般成不了，因为各自都有自己的小算盘，但一家公司死命推的东西往往成功。就如同我在ADOBE愤青朋友小潘说的，应该吃碗里的看锅里的，对HTML5密切保持关注！当然FLASH的优势还远远不止这些，后面我还有论述。</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">3、&nbsp; WAP，SYMBIAN</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">不可否认，SYMBIAN江河日下，但瘦死的骡子比马大这个道理大家都懂，与WAP相同，它们依然统领着国内甚至是海外相当大的一块市场，而这块市场依然有巨大的需求。WAP网游、SYMBIAN网游就我个人的体会，依然很有钱赚。另外，刚得到国家大力打击山寨手机和走私芯片的情况，如果力度大的话加之SYMBIAN手机大幅降价，相信对SYMBIAN平台的国内装机量会有提升作用，是不是回光返照就不好说了。WAP不用说了，QQ、斯凯这样的平台用户量简直是惊人的，没有了单机游戏，它们要玩点啥？最后说一下，OVI这东西太烂了！NOKIA打算用这个拥抱互联网？呵呵&#8230;&#8230;不过这东西在中国本土化做的真不错！完全SP模式化了！APPLE 该感谢这些SP，你们在中国参与毁掉了OVI。呵呵&#8230;&#8230;不说牢骚了。我只是觉得我曾经那么挚爱的ＮＯＫＩＡ今天这般天地，唉&#8230;&#8230;2000年我就开始做SYMBIAN游戏了！NND！</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">从厂商角度划分</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">1、&nbsp; MTK斯凯的平台<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">经过了计费、预置等一系列事件之后，斯凯的平台也转型了，我觉得转型还是非常成功的，网游！还是网游！因为只有这样才能继续赚钱，只有这样才能彻底抛弃小额付费，加强其平台优势，粘住用户。当然这个平台有其技术方面的不成熟，不可否认，这是一个好平台有特色的平台。用户是海量的，而这些用户的&#8220;饥渴&#8221;程度很不是一般。别误解我的意思，我是说对游戏的渴求，而不是对黄色游戏的渴求。如果斯凯短视到做这些，那这平台不做也罢了，明明从一个用户身上，可以一年赚到300块，千万不要让不良内容赚走了100块就砸了锅！为什么这个平台好，从公布的数字来看，一个网游月收入超过400万应该是块肉吧？众CP可以好好研究一下如何在上面开发有意思的网游产品，别怕开发辛苦，哪有不辛苦赚来的钱呢？让开发人员克服障碍，回报是可以保障的。这个平台与过去做单机时候的平台思想已经不同了，帮他们做广告，有兴趣的直接联络他们。</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">2、&nbsp; QQ平台<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">QQ平台还用说么？但我说的不是单机游戏，我说的还是网游，QQ社区是个令人感觉恐怖的玩意，SNS 的FEEL 太可怕了，对网游的推动是洪水般的。剩下就看你的产品怎麽样了？我的建议，强调差异性，别去想你跟谁关系好，谁关系坏，产品烂、关系再好，上线了也完蛋，关系一般，产品能赚钱，人家能不好好推么？这是生意了。这与单机游戏讲排名是两回事！N年前，我们在QQ上线了一款失败的产品WAP网游天道，不照样下线么！</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">3、&nbsp; UCWEB平台<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">UCWEB游戏平台的端倪，大家应该已经看出来了些吧，那就是基于FLASH，但经过我的技术分析，他的那个FLASH是假的，呵呵&#8230;&#8230;为什么这么说呢，因为不是ADOBE的FLASH PLAYER，也对，要完全仿真出来一个FLASH PLAYER的解释环境，可真够难的。所以UCWEB只是部分仿真。他的技术实现方法有如针对WEB。通过服务器解释FLASH文件，然后筛选后再发给客户端进行自己的解释。<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">好歹我做过程序员，技术我是半瓶子醋，但这我懂，哈哈&#8230;&#8230;如果是这样，服务器的消耗是巨大的。UCWEB是不可能允许用户随便访问任何的FLASH，而由他承担服务器成本的。除非他傻，呵呵&#8230;&#8230;那么这块肉，UCWEB要吃，他会怎麽吃呢？还是要与众CP分享了。他一定还是要让CP 自己架设服务器，然后他帮你推广，你的FLASH要针对他的浏览器做一些优化，等等等&#8230;&#8230;，这事估计也不久远了。所以，我认为CP的FLASH布局要提上日程了。</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">4、&nbsp; 日本手机SNS<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">DENA，MIXI，GREE这些公司去年都很NB，尤其是GREE说自己不开放平台，因为无法保证产品品质，今年呢？所有的日本SNS手机平台都开放了！咱国内有家叫热酷公司的阳光农场不就宣称自己在MIXI平台月收入过百万美金么？是啊&#8230;&#8230;这也是手机游戏，不是么？用FLASH LITE怎麽了？我看挺好！但日本游戏咱做过，质量、翻译、策划要求都很高，没思想准备，一年半载你磕不下来，但如果你磕下来呢？我们很多人的梦想不是就是赚日本人的钱，然后再去搞苍井空么！哈哈&#8230;&#8230;太三八了。最后说一下，想让公司长治久安！一定要开辟海外战场！！政策趋紧，同志们要早做思想准备。</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">5、&nbsp; FACEBOOK<br style="word-wrap: break-word;" />
</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">不多说，全球值钱的游戏公司，VC风头上的游戏公司无一不是在FACEBOOK上争天下了，顺便说一句，他还是FLASH的游戏，还是网游！</strong></strong></strong></p>
<p style="word-wrap: break-word; margin: 1.5em 0px; padding: 0px;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;"><strong style="word-wrap: break-word;">你可以看出我对很多东西情有独钟，是这样的，如果你担心风险，你犹豫，也没关系，你有好游戏想在IPHONE 或者FLASH上做，我来买单，有天你自己摸明白了，自己干也成。总之&#8230;&#8230;开放你的思维，别在一条船上淹死。世界很大，赚钱的机会很多，写点东西算我的贡献吧&#8230;&#8230;这些内容也是我在CGDC上要讲的主要内容，乖乖，一个听课证要好几千，虽然没进我兜，但总要有些干货才好了。我的Blog很有料的！</strong></strong></strong></p>
</span></span>
<img src ="http://www.blogjava.net/jelver/aggbug/341819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2010-12-28 22:34 <a href="http://www.blogjava.net/jelver/articles/341819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JUnit 和 Android JUnit [转]</title><link>http://www.blogjava.net/jelver/articles/334511.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Tue, 12 Oct 2010 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/334511.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/334511.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/334511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/334511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/334511.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://blog.csdn.net/partner4java/archive/2010/06/03/5644545.aspx因为最近学习TDD，所以JUnit是必须要会的，在这里整理一下，发出来。什么是TDD：Test&nbsp;Driven&nbsp;Development--测试驱动开发别人说的一些话：TDD就是把你的需求用测试给描述出来。没有Mock的单元测...&nbsp;&nbsp;<a href='http://www.blogjava.net/jelver/articles/334511.html'>阅读全文</a><img src ="http://www.blogjava.net/jelver/aggbug/334511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2010-10-12 09:27 <a href="http://www.blogjava.net/jelver/articles/334511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>socket, nio socket 及nio socket框架MINA总结 (转)</title><link>http://www.blogjava.net/jelver/articles/122358.html</link><dc:creator>都市淘沙者</dc:creator><author>都市淘沙者</author><pubDate>Wed, 06 Jun 2007 06:31:00 GMT</pubDate><guid>http://www.blogjava.net/jelver/articles/122358.html</guid><wfw:comment>http://www.blogjava.net/jelver/comments/122358.html</wfw:comment><comments>http://www.blogjava.net/jelver/articles/122358.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jelver/comments/commentRss/122358.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jelver/services/trackbacks/122358.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/lcllcl987/archive/2007/04/16/1566114.aspx">http://blog.csdn.net/lcllcl987/archive/2007/04/16/1566114.aspx</a><br>nio学习：<br>最近花了点时间研究了一下nio，及其开源框架MINA，现把心得总结如下：<br>1：传统socket:阻塞式通信<br>每建立一个Socket连接时，同时创建一个新线程对该Socket进行单独通信（采用阻塞的方式通信）。<br>这种方式具有很高的响应速度，并且控制起来也很简单，在连接数较少的时候非常有效，但是如果<br>对每一个连接都产生一个线程的无疑是对系统资源的一种浪费，如果连接数较多将会出现资源不足的情况<br>example:<br>server code:</p>
<p>public class MultiUserServer extends Thread {<br>&nbsp;private Socket client;<br>&nbsp;<br>&nbsp;public MultiUserServer(Socket c) {<br>&nbsp;&nbsp;this.client = c;<br>&nbsp;}</p>
<p>&nbsp;public void run() {<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(client<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream()));<br>&nbsp;&nbsp;&nbsp;PrintWriter out = new PrintWriter(client.getOutputStream());<br>&nbsp;&nbsp;&nbsp;//&nbsp;Mutil User but can't parallel<br>&nbsp;&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;&nbsp;String str = in.readLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(str);<br>&nbsp;&nbsp;&nbsp;&nbsp;SocketLog.debug("receive message: " + str);<br>&nbsp;&nbsp;&nbsp;&nbsp;out.println("has receive....");<br>&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br>&nbsp;&nbsp;&nbsp;&nbsp;if (str.equals("end"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;client.close();<br>&nbsp;&nbsp;} catch (IOException ex) {<br>&nbsp;&nbsp;} <br>&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) throws IOException {<br>&nbsp;&nbsp;int port = 5678;<br>&nbsp;&nbsp;if (args.length &gt; 0)<br>&nbsp;&nbsp;&nbsp;port = Integer.parseInt(args[0]);<br>&nbsp;&nbsp;ServerSocket server = new ServerSocket(port);<br>&nbsp;&nbsp;SocketLog.debug("the server socket application is created!");<br>&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;//&nbsp;transfer location change Single User or Multi User<br>&nbsp;&nbsp;&nbsp;MultiUserServer mu = new MultiUserServer(server.accept());<br>&nbsp;&nbsp;&nbsp;mu.start();<br>&nbsp;&nbsp;}<br>&nbsp;}<br>}</p>
<p>client code:</p>
<p>public class Client {</p>
<p>&nbsp;static Socket server;</p>
<p>&nbsp;public static void main(String[] args) throws Exception {<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;//set socket proxy.<br>&nbsp;&nbsp;String proxyHost = "192.168.254.212";<br>&nbsp;&nbsp;String proxyPort = "1080";<br>&nbsp;&nbsp;System.getProperties().put("socksProxySet","true");<br>&nbsp;&nbsp;System.getProperties().put("socksProxyHost",proxyHost);<br>&nbsp;&nbsp;System.getProperties().put("socksProxyPort",proxyPort); <br>&nbsp;&nbsp;<br>&nbsp;&nbsp;String host = "132.201.69.80";<br>&nbsp;&nbsp;int port = 13086;<br>&nbsp;&nbsp;if (args.length &gt; 1)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;host = args[0];<br>&nbsp;&nbsp;&nbsp;port = Integer.parseInt(args[1]);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;System.out.println("connetioning:" + host + ":" + port);<br>&nbsp;&nbsp;server = new Socket(host, port);<br>&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(server<br>&nbsp;&nbsp;&nbsp;&nbsp;.getInputStream()));<br>&nbsp;&nbsp;PrintWriter out = new PrintWriter(server.getOutputStream());<br>&nbsp;&nbsp;BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));<br>&nbsp;&nbsp;while (true) {<br>&nbsp;&nbsp;&nbsp;String str = wt.readLine();<br>&nbsp;&nbsp;&nbsp;out.println(str);<br>&nbsp;&nbsp;&nbsp;out.flush();<br>&nbsp;&nbsp;&nbsp;if (str.equals("end")) {<br>&nbsp;&nbsp;&nbsp;&nbsp;break;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;System.out.println(in.readLine());<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;server.close();<br>&nbsp;}<br>}</p>
<p>2.nio:非阻塞通讯模式<br>２．１NIO 设计背后的基石：反应器模式，用于事件多路分离和分派的体系结构模式。 <br>反应器模式的核心功能如下：<br>将事件多路分用 <br>将事件分派到各自相应的事件处理程序 </p>
<p>NIO 的非阻塞 I/O 机制是围绕 选择器和 通道构建的。 Channel 类表示服务器和客户机之间的<br>一种通信机制。Selector 类是 Channel 的多路复用器。 Selector 类将传入客户机请求多路分<br>用并将它们分派到各自的请求处理程序。<br>通道(Channel 类)：表示服务器和客户机之间的一种通信机制。 <br>选择器(Selector类)：是 Channel 的多路复用器。Selector 类将传入的客户机请求多路分用并将它们<br>分派到各自的请求处理程序。</p>
<p>简单的来说：</p>
<p>NIO是一个基于事件的IO架构，最基本的思想就是：有事件我通知你，你再去做你的事情．<br>而且NIO的主线程只有一个，不像传统的模型，需要多个线程以应对客户端请求，也减轻<br>了JVM的工作量。<br>当Channel注册至Selector以后，经典的调用方法如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (somecondition) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = selector.select(TIMEOUT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (n == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Iterator iter = selector.selectedKeys().iterator(); iter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .hasNext();) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isAcceptable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doAcceptable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isConnectable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doConnectable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isValid() &amp;&amp; key.isReadable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doReadable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (key.isValid() &amp;&amp; key.isWritable())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; doWritable(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iter.remove();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>nio中取得事件通知，就是在selector的select事件中完成的。在selector事件时有一个线程<br>向操作系统询问，selector中注册的Channel&amp;&amp;SelectionKey的键值对的各种事件是否有发生，<br>如果有则添加到selector的selectedKeys属性Set中去，并返回本次有多少个感兴趣的事情发生。<br>如果发现这个值&gt;0，表示有事件发生，马上迭代selectedKeys中的SelectionKey，<br>根据Key中的表示的事件，来做相应的处理。<br>实际上，这段说明表明了异步socket的核心，即异步socket不过是将多个socket的调度（或者还有他们的线程调度）<br>全部交给操作系统自己去完成，异步的核心Selector，不过是将这些调度收集、分发而已。<br>2.2 nio example:<br>server code：</p>
<p><br>public class NonBlockingServer<br>{<br>&nbsp;&nbsp;&nbsp; public Selector sel = null;<br>&nbsp;&nbsp;&nbsp; public ServerSocketChannel server = null;<br>&nbsp;&nbsp;&nbsp; public SocketChannel socket = null;<br>&nbsp;&nbsp;&nbsp; public int port = 4900;<br>&nbsp;&nbsp;&nbsp; String result = null;</p>
<p><br>&nbsp;&nbsp;&nbsp; public NonBlockingServer()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside default ctor");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;public NonBlockingServer(int port)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside the other ctor");<br>&nbsp;&nbsp;this.port = port;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void initializeOperations() throws IOException,UnknownHostException<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside initialization");<br>&nbsp;&nbsp;sel = Selector.open();<br>&nbsp;&nbsp;server = ServerSocketChannel.open();<br>&nbsp;&nbsp;server.configureBlocking(false);<br>&nbsp;&nbsp;InetAddress ia = InetAddress.getLocalHost();<br>&nbsp;&nbsp;InetSocketAddress isa = new InetSocketAddress(ia,port);<br>&nbsp;&nbsp;server.socket().bind(isa);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;public void startServer() throws IOException<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside startserver");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initializeOperations();<br>&nbsp;&nbsp;System.out.println("Abt to block on select()");<br>&nbsp;&nbsp;SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT );&nbsp;<br>&nbsp;<br>&nbsp;&nbsp;while (acceptKey.selector().select() &gt; 0 )<br>&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;Set readyKeys = sel.selectedKeys();<br>&nbsp;&nbsp;&nbsp;Iterator it = readyKeys.iterator();</p>
<p>&nbsp;&nbsp;&nbsp;while (it.hasNext()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;SelectionKey key = (SelectionKey)it.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;it.remove();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;if (key.isAcceptable()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Key is Acceptable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocketChannel ssc = (ServerSocketChannel) key.channel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket = (SocketChannel) ssc.accept();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.configureBlocking(false);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if (key.isReadable()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Key is readable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String ret = readMessage(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ret.length() &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeMessage(socket,ret);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;if (key.isWritable()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("THe key is writable");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String ret = readMessage(key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket = (SocketChannel)key.channel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (result.length() &gt; 0 ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeMessage(socket,ret);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void writeMessage(SocketChannel socket,String ret)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;System.out.println("Inside the loop");</p>
<p>&nbsp;&nbsp;if (ret.equals("quit") || ret.equals("shutdown")) {<br>&nbsp;&nbsp;&nbsp;return;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{</p>
<p>&nbsp;&nbsp;&nbsp;String s = "This is context from server!-----------------------------------------";<br>&nbsp;&nbsp;&nbsp;Charset set = Charset.forName("us-ascii");<br>&nbsp;&nbsp;&nbsp;CharsetDecoder dec = set.newDecoder();<br>&nbsp;&nbsp;&nbsp;CharBuffer charBuf = dec.decode(ByteBuffer.wrap(s.getBytes()));<br>&nbsp;&nbsp;&nbsp;System.out.println(charBuf.toString());<br>&nbsp;&nbsp;&nbsp;int nBytes = socket.write(ByteBuffer.wrap((charBuf.toString()).getBytes()));<br>&nbsp;&nbsp;&nbsp;System.out.println("nBytes = "+nBytes);<br>&nbsp;&nbsp;&nbsp;&nbsp;result = null;<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;catch(Exception e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp; <br>&nbsp;&nbsp;&nbsp; public String readMessage(SelectionKey key)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;int nBytes = 0;<br>&nbsp;&nbsp;socket = (SocketChannel)key.channel();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteBuffer buf = ByteBuffer.allocate(1024);<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nBytes = socket.read(buf);<br>&nbsp;&nbsp;&nbsp;buf.flip();<br>&nbsp;&nbsp;&nbsp;Charset charset = Charset.forName("us-ascii");<br>&nbsp;&nbsp;&nbsp;CharsetDecoder decoder = charset.newDecoder();<br>&nbsp;&nbsp;&nbsp;CharBuffer charBuffer = decoder.decode(buf);<br>&nbsp;&nbsp;&nbsp;result = charBuffer.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;catch(IOException e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;return result;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String args[])<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;NonBlockingServer nb;<br>&nbsp;&nbsp;&nbsp; &nbsp;if (args.length &lt; 1)<br>&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;nb = new NonBlockingServer();<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;int port = Integer.parseInt(args[0]);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;nb = new NonBlockingServer(port);<br>&nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;nb.startServer();<br>&nbsp;&nbsp;&nbsp;System.out.println("the nonBlocking server is started!");<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;catch (IOException e)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;System.exit(-1);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;<br>&nbsp;}<br>}</p>
<p>client code:</p>
<p>public class Client {<br>&nbsp;public SocketChannel client = null;</p>
<p>&nbsp;public InetSocketAddress isa = null;</p>
<p>&nbsp;public RecvThread rt = null;</p>
<p>&nbsp;private String host;</p>
<p>&nbsp;private int port;</p>
<p>&nbsp;public Client(String host, int port) {<br>&nbsp;&nbsp;this.host = host;<br>&nbsp;&nbsp;this.port = port;<br>&nbsp;}</p>
<p>&nbsp;public void makeConnection() {<br>&nbsp;&nbsp;String proxyHost = "192.168.254.212";<br>&nbsp;&nbsp;String proxyPort = "1080";<br>&nbsp;&nbsp;System.getProperties().put("socksProxySet", "true");<br>&nbsp;&nbsp;System.getProperties().put("socksProxyHost", proxyHost);<br>&nbsp;&nbsp;System.getProperties().put("socksProxyPort", proxyPort);</p>
<p>&nbsp;&nbsp;int result = 0;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;client = SocketChannel.open();<br>&nbsp;&nbsp;&nbsp;isa = new InetSocketAddress(host, port);<br>&nbsp;&nbsp;&nbsp;client.connect(isa);<br>&nbsp;&nbsp;&nbsp;client.configureBlocking(false);<br>&nbsp;&nbsp;&nbsp;receiveMessage();<br>&nbsp;&nbsp;} catch (UnknownHostException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;long begin = System.currentTimeMillis();</p>
<p>&nbsp;&nbsp;sendMessage();</p>
<p>&nbsp;&nbsp;long end = System.currentTimeMillis();<br>&nbsp;&nbsp;long userTime = end - begin;<br>&nbsp;&nbsp;System.out.println("use tiem: " + userTime);<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;interruptThread();<br>&nbsp;&nbsp;&nbsp;client.close();<br>&nbsp;&nbsp;&nbsp;System.exit(0);<br>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}<br>&nbsp;}</p>
<p>&nbsp;public int sendMessage() {<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Inside SendMessage");<br>&nbsp;&nbsp;String msg = null;<br>&nbsp;&nbsp;ByteBuffer bytebuf;<br>&nbsp;&nbsp;int nBytes = 0;<br>&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;msg = "It's message from client!";<br>&nbsp;&nbsp;&nbsp;System.out.println("msg is "+msg);<br>&nbsp;&nbsp;&nbsp;bytebuf = ByteBuffer.wrap(msg.getBytes());<br>&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 1000; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;nBytes = client.write(bytebuf);<br>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(i + " finished");<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;interruptThread();<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(5000);<br>&nbsp;&nbsp;&nbsp;} catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;client.close();<br>&nbsp;&nbsp;&nbsp;return -1;</p>
<p>&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;return nBytes;</p>
<p>&nbsp;}</p>
<p>&nbsp;public void receiveMessage() {<br>&nbsp;&nbsp;rt = new RecvThread("Receive THread", client);<br>&nbsp;&nbsp;rt.start();</p>
<p>&nbsp;}</p>
<p>&nbsp;public void interruptThread() {<br>&nbsp;&nbsp;rt.val = false;<br>&nbsp;}</p>
<p>&nbsp;public static void main(String args[]) {<br>&nbsp;&nbsp;if (args.length &lt; 2) {<br>&nbsp;&nbsp;&nbsp;System.err.println("You should put 2 args: host,port");<br>&nbsp;&nbsp;} else {<br>&nbsp;&nbsp;&nbsp;String host = args[0];<br>&nbsp;&nbsp;&nbsp;int port = Integer.parseInt(args[1]);<br>&nbsp;&nbsp;&nbsp;Client cl = new Client(host, port);<br>&nbsp;&nbsp;&nbsp;cl.makeConnection();<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;BufferedReader in = new BufferedReader(new InputStreamReader(System.in));<br>&nbsp;&nbsp;String msg;</p>
<p>&nbsp;}</p>
<p>&nbsp;public class RecvThread extends Thread {<br>&nbsp;&nbsp;public SocketChannel sc = null;</p>
<p>&nbsp;&nbsp;public boolean val = true;</p>
<p>&nbsp;&nbsp;public RecvThread(String str, SocketChannel client) {<br>&nbsp;&nbsp;&nbsp;super(str);<br>&nbsp;&nbsp;&nbsp;sc = client;<br>&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;public void run() {<br>&nbsp;&nbsp;&nbsp;int nBytes = 0;<br>&nbsp;&nbsp;&nbsp;ByteBuffer buf = ByteBuffer.allocate(2048);<br>&nbsp;&nbsp;&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp;while (val) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while ((nBytes = nBytes = client.read(buf)) &gt; 0) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.flip();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Charset charset = Charset.forName("us-ascii");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharsetDecoder decoder = charset.newDecoder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CharBuffer charBuffer = decoder.decode(buf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String result = charBuffer.toString();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("the server return: " + result);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf.flip();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;} catch (IOException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</p>
<p>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;}<br>&nbsp;}<br>}<br>3：Socket网络框架 MINA<br>MINA是一个网络应用框架，在不牺牲性能和可扩展性的前提下用于解决如下问题：<br>1：快速开发自己的英勇。<br>2：高可维护性，高可复用性：网络I/O编码，消息的编/解码，业务逻辑互相分离。<br>3：相对容易的进行单元测试。</p>
<p>&nbsp;</p>
<p>3.1 IoFilters：<br>IoFilter为MINA的功能扩展提供了接口。它拦截所有的IO事件进行事件的预处理和后处理(AOP)。我们可以把它想象成<br>Servlet的filters。<br>IoFilter能够实现以下几种目的：<br>事件日志<br>性能检测<br>数据转换(e.g. SSL support)，codec<br>防火墙&#8230;等等 </p>
<p>3.2 codec: ProtocolCodecFactory<br>MINA提供了方便的Protocol支持。如上说讲，codec在IoFilters中设置。<br>通过它的Encoder和Decoder，可以方便的扩展并支持各种基于Socket的网络协议，比如HTTP服务器、FTP服务器、Telnet服务器等等。</p>
<p>要实现自己的编码/解码器(codec)只需要实现interface: ProtocolCodecFactory即可.<br>在MINA 1.0版本，MINA已经实现了几个常用的(codec factory):</p>
<p>DemuxingProtocolCodecFactory, <br>NettyCodecFactory, <br>ObjectSerializationCodecFactory, <br>TextLineCodecFactory<br>&nbsp;<br>其中：<br>TextLineCodecFactory:<br>&nbsp;A ProtocolCodecFactory that performs encoding and decoding between a text line data and a Java <br>&nbsp;string object. This codec is useful especially when you work with a text-based protocols such as SMTP and IMAP.</p>
<p>ObjectSerializationCodecFactory:<br>A ProtocolCodecFactory that serializes and deserializes Java objects. This codec is very useful when <br>you have to prototype your application rapidly without any specific codec. </p>
<p>DemuxingProtocolCodecFactory：<br>A composite ProtocolCodecFactory that consists of multiple MessageEncoders and MessageDecoders. ProtocolEncoder<br>and ProtocolDecoder this factory returns demultiplex incoming messages and buffers to appropriate MessageEncoders <br>and MessageDecoders.</p>
<p>NettyCodecFactory:<br>A MINA ProtocolCodecFactory that provides encoder and decoder for Netty2 Messages and MessageRecognizers.</p>
<p>3.3 business logic: IoHandler</p>
<p>MINA中，所有的业务逻辑都有实现了IoHandler的class完成<br>interfaceHandles:<br>&nbsp;all protocol events fired by MINA. There are 6 event handler methods, and they are all invoked by MINA automatically. <br>&nbsp;当事件发生时，将触发IoHandler中的方法:<br>&nbsp;sessionCreated, sessionOpened, sessionClosed, sessionIdle, exceptionCaught, messageReceived, messageSent<br>MINA 1.O中，IoHandler的实现类：<br>ChainedIoHandler, DemuxingIoHandler, IoHandlerAdapter, SingleSessionIoHandlerDelegate, StreamIoHandler <br>具体细节可参考javadoc。</p>
<p>3.4&nbsp; &nbsp;MINA的高级主题：线程模式<br>MINA通过它灵活的filter机制来提供多种线程模型。<br>没有线程池过滤器被使用时MINA运行在一个单线程模式。<br>如果添加了一个IoThreadPoolFilter到IoAcceptor，将得到一个leader-follower模式的线程池。<br>如果再添加一个ProtocolThreadPoolFilter，server将有两个线程池；<br>一个(IoThreadPoolFilter)被用于对message对象进行转换，另外一个(ProtocolThreadPoolFilter)被用于处理业务逻辑。 <br>SimpleServiceRegistry加上IoThreadPoolFilter和ProtocolThreadPoolFilter的缺省实现即可适用于需<br>要高伸缩性的应用。如果想使用自己的线程模型，请参考SimpleServiceRegistry的源代码，并且自己</p>
<p>初始化Acceptor。</p>
<p>IoThreadPoolFilter threadPool = new IoThreadPoolFilter();threadPool.start();<br>IoAcceptor acceptor = new SocketAcceptor();<br>acceptor.getFilterChain().addLast( "threadPool", threadPool);<br>ProtocolThreadPoolFilter threadPool2 = new ProtocolThreadPoolFilter();<br>threadPool2.start();<br>ProtocolAcceptor acceptor2 = new IoProtocolAcceptor( acceptor );<br>acceptor2.getFilterChain().addLast( "threadPool", threadPool2 );<br>...<br>threadPool2.stop();<br>threadPool.stop();</p>
<p><br>采用MINA进行socket开发，一般步骤如下：<br>1：<br>server:<br>IoAcceptor acceptor = new SocketAcceptor(); //建立client接收器<br>or client:<br>SocketConnector connector = new SocketConnector();&nbsp; //建立一个连接器<br>2：server的属性配置：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketAcceptorConfig cfg = new SocketAcceptorConfig();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.setReuseAddress(true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "codec",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //对象序列化 codec factory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast( "logger", new LoggingFilter() );<br>3：绑定address和business logic<br>server:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptor.bind(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new InetSocketAddress( SERVER_PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ServerSessionHandler( ), cfg ); // 绑定address和handler</p>
<p>client:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connector.connect(new InetSocketAddress( HOSTNAME, PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ClientSessionHandler(msg), cfg );</p>
<p>下面的这个简单的example演示client和server传递object的过程：<br>Message.java<br>public class Message implements Serializable {</p>
<p>&nbsp;&nbsp;&nbsp; private int type;<br>&nbsp;&nbsp;&nbsp; private int status;<br>&nbsp;&nbsp;&nbsp; private String msgBody;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public Message(int type, int status, String msgBody)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.status = status;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msgBody = msgBody;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public String getMsgBody() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return msgBody;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setMsgBody(String msgBody) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msgBody = msgBody;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getStatus() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return status;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setStatus(int status) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.status = status;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public int getType() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return type;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void setType(int type) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>Client.java<br>public class Client<br>{<br>&nbsp;&nbsp;&nbsp; private static final String HOSTNAME = "localhost";<br>&nbsp;&nbsp;&nbsp; private static final int PORT = 8080;<br>&nbsp;&nbsp;&nbsp; private static final int CONNECT_TIMEOUT = 30; // seconds</p>
<p><br>&nbsp;&nbsp;&nbsp; public static void main( String[] args ) throws Throwable<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketConnector connector = new SocketConnector();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Configure the service.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketConnectorConfig cfg = new SocketConnectorConfig();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.setConnectTimeout( CONNECT_TIMEOUT );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "codec",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast( "logger", new LoggingFilter() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IoSession session;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message msg = new Message(0,1,"hello");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connector.connect(new InetSocketAddress( HOSTNAME, PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ClientSessionHandler(msg), cfg );</p>
<p>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>ClientSessionHandler.java<br>public class ClientSessionHandler extends IoHandlerAdapter<br>{<br>&nbsp;&nbsp;&nbsp; private Object msg;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; public ClientSessionHandler(Object msg)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.msg = msg;<br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;&nbsp;&nbsp; public void sessionOpened( IoSession session )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.write(this.msg);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void messageReceived( IoSession session, Object message )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("in messageReceived!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message rm = (Message ) message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionLog.debug(session, rm.getMsgBody());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("message is: " + rm.getMsgBody());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.write(rm);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void exceptionCaught( IoSession session, Throwable cause )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>Server.java<br>public class Server<br>{<br>&nbsp;&nbsp;&nbsp; private static final int SERVER_PORT = 8080;</p>
<p>&nbsp;&nbsp;&nbsp; public static void main( String[] args ) throws Throwable<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IoAcceptor acceptor = new SocketAcceptor();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Prepare the service configuration.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SocketAcceptorConfig cfg = new SocketAcceptorConfig();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.setReuseAddress( true );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "codec",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cfg.getFilterChain().addLast( "logger", new LoggingFilter() );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptor.bind(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new InetSocketAddress( SERVER_PORT ),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new ServerSessionHandler( ), cfg );</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( "The server Listening on port " + SERVER_PORT );<br>&nbsp;&nbsp;&nbsp; }<br>}</p>
<p>ServerSessionHandler.java<br>public class ServerSessionHandler extends IoHandlerAdapter<br>{<br>&nbsp;&nbsp;&nbsp; public void sessionOpened( IoSession session )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // set idle time to 60 seconds<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setIdleTime( IdleStatus.BOTH_IDLE, 60 );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("times",new Integer(0));<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void messageReceived( IoSession session, Object message )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("in messageReceived");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int times = ((Integer)(session.getAttribute("times"))).intValue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("tiems = " + times);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // communicate 30 times,then close the session.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (times &lt; 30)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; times++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("times", new Integer(times));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Message msg;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg = (Message) message;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg.setMsgBody("in server side: " + msg.getMsgBody());&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("begin send msg: " + msg.getMsgBody());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.write(msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void sessionIdle( IoSession session, IdleStatus status )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SessionLog.info( session, "Disconnecting the idle." );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // disconnect an idle client<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void exceptionCaught( IoSession session, Throwable cause )<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // close the connection on exceptional situation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.close();<br>&nbsp;&nbsp;&nbsp; }<br>}<br>MINA自己附带的Demo已经很好的说明了它的运用。<br>值得一提的是它的SumUp：客户端发送几个数字，服务端求和后并返回结果。这个简单的程序演示了如何自己实现CODEC。</p>
<p>补充提示：<br>下载并运行MINA的demo程序还颇非周折:<br>运行MINA demo appli擦tion：<br>1:在JDK5<br>产生错误:<br>Exception in thread "main" java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Executor<br>&nbsp;at org.apache.mina.example.reverser.Main.main(Main.java:44)<br>&nbsp;<br>察看mina的QA email:<br><a href="http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html">http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html</a></p>
<p>原来需要下载:backport-util-concurrent.jar并加入classpath<br><a href="http://dcl.mathcs.emory.edu/util/backport-util-concurrent/">http://dcl.mathcs.emory.edu/util/backport-util-concurrent/</a></p>
<p>继续运行还是报错:<br>Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory</p>
<p>原来MINA采用了slf4j项目作为log，继续下载<br>slf4j-simple.jar等，并加入classpath:<br><a href="http://www.slf4j.org/download.html">http://www.slf4j.org/download.html</a></p>
<img src ="http://www.blogjava.net/jelver/aggbug/122358.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jelver/" target="_blank">都市淘沙者</a> 2007-06-06 14:31 <a href="http://www.blogjava.net/jelver/articles/122358.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>