??xml version="1.0" encoding="utf-8" standalone="yes"?>在线A亚洲老鸭窝天堂,亚洲成a人片在线观看天堂无码,亚洲色欲色欲www在线播放 http://m.tkk7.com/jelver/category/23090.htmlhttp://www.gaolucha.com上线了,嘿嘿zh-cnWed, 10 Apr 2013 09:38:43 GMTWed, 10 Apr 2013 09:38:43 GMT60Ҏ讉KUA获取相关信息http://m.tkk7.com/jelver/articles/397636.html都市淘沙?/dc:creator>都市淘沙?/author>Wed, 10 Apr 2013 04:13:00 GMThttp://m.tkk7.com/jelver/articles/397636.htmlhttp://m.tkk7.com/jelver/comments/397636.htmlhttp://m.tkk7.com/jelver/articles/397636.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/397636.htmlhttp://m.tkk7.com/jelver/services/trackbacks/397636.html 1 <script type="text/javascript">
 2 var browser={    
 3 versions:function(){            
 4 var u = navigator.userAgent, app = navigator.appVersion;            
 5 return {                
 6 trident: u.indexOf('Trident') > -1//IE内核                
 7 presto: u.indexOf('Presto') > -1//opera内核                
 8 webKit: u.indexOf('AppleWebKit') > -1//Ҏ、谷歌内?nbsp;               
 9 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1//火狐内核                
10 mobile: !!u.match(/AppleWebKit.*Mobile.*/)||!!u.match(/AppleWebKit/), //是否为移动终?nbsp;               
11 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //iosl端                
12 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1//androidl端或者uc览?nbsp;               
13 iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1//是否为iPhone或者QQHD览?nbsp;               
14 iPad: u.indexOf('iPad') > -1//是否iPad                
15 webApp: u.indexOf('Safari') == -1 //是否web应该E序Q没有头部与底部            
16 };
17 }()
18 }
19 
20 document.writeln(" 是否为移动终? "+browser.versions.mobile);
21 document.writeln(" iosl端: "+browser.versions.ios);
22 document.writeln(" androidl端: "+browser.versions.android);
23 document.writeln(" 是否为iPhone: "+browser.versions.iPhone);
24 document.writeln(" 是否iPad: "+browser.versions.iPad);
25 document.writeln(navigator.userAgent);
26 </script>
27 

]]>
android 应用E序Activity之间数据传递与׃n的几U途径【{?/title><link>http://m.tkk7.com/jelver/articles/357231.html</link><dc:creator>都市淘沙?/dc:creator><author>都市淘沙?/author><pubDate>Wed, 24 Aug 2011 23:31:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/357231.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/357231.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/357231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/357231.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/357231.html</trackback:ping><description><![CDATA[<a >http://blog.csdn.net/kieven2008/article/details/6006905</a><br /><br /><strong><span style="font-size: large;">1.Z消息的通信机制  Intent ---boudle ,extra</span> </strong> <p><span style="font-size: medium;"><strong>    </strong> 数据cd有限Q比如遇C可序列化的数据Bitmap,InputStream, 或者LinkList链表{等数据cd׃太好用?/span> </p> <p><strong><span style="font-size: large;">2. 利用static静态数据,</span> </strong> <span style="font-size: large;">public static成员变量Q?/span> </p> <p><strong><span style="font-size: large;">3.Z外部存储的传?  </span> </strong> <span style="font-size: large;">File/Preference/ Sqlite Q如果要针对W三方应用需要Content Provider</span> <strong><span style="font-size: large;"><br /> </span> </strong> </p> <p><span style="font-size: large;"><strong>4.ZIPC的通信机制</strong></span></p> <p><span style="font-size: large;"><strong></strong>    context 与Service之间的传输,?/span><span style="font-size: large;"><span style="font-family: mceinline;">Activity与Service之间的通信Q定义AIDL接口文g?/span></span></p> <p><span style="font-size: large;"><span style="font-family: mceinline;">   CZQ?nbsp;</span></span><a >http://www.eoeandroid.com/thread-36249-1-1.html</a></p> <p><strong><span style="font-family: mceinline;"><span style="font-size: large;">5. ZApplication ContextQ?/span> <span style="font-size: large;">例子如下文:</span></span></strong> </p> <p> </p> <p> </p> <p><br />     在当前Activity两个gCTest中。但如果遇到不可序列化的数据Q如Bitmap、InputStream{,intent无能ؓ力了。因此,我们很自然地会想到另外一U方法,静态变量。如下面的代码所C:</p> <p><br />     public  class  Product  extends  Activity<br />    {<br />          public  static  Bitmap mBitmap;<br />           <br />    }</p> <p><br />     对于上面的代码来_其他Mcd以直接用Product中的mBitmap变量。这么做很easy、也很coolQ但却very very wrong。我们千万不要以为Davlik虚拟机的垃圾回收器会帮助我们回收不需要的内存垃圾。事实上Q回收器q不可靠Q尤其是手机上,是更加的不可靠? 因此Q除非我们要使自qE序变得来糟p,否则量q离static?/p> <p>注:如果l常使用static的Bitmap、Drawable{变量。可能就会抛Z个在Androidpȝ中非常著名的异常Q以前budgetq个单词一直记不住什么意思,自从l常抛出q个异常后,q个单词l于烂熟于心了, Q?/p> <p>ERROR/AndroidRuntime(4958): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget</p> <p><br />     如果不用staticQd有方法来代替它(管我很喜欢public staticQ我怿很多Z喜欢它,但ؓ了我们的E序Q徏议还是忍痛割爱吧Q,那么q个新的解决Ҏ是本文的主题,q就是Application ContextQ相当于WebE序的ApplicationQ它的生命周期和应用E序一样长Q这个我喜欢Q?/p> <p>    那么现在来看看如何用这个Application Context。我们可以通过Context.getApplicationContext或Context.getApplicationҎ获得 Application Context。但要注意,我们获得的只是Context对象Q而更理想的方法是获得一个类的对象。okQ说q就qԌ下面来定义一个类?/p> <p><br /> package  net.blogjava.mobile1;</p> <p>import  android.app.Application;<br /> import  android.graphics.Bitmap;</p> <p>public  class  MyApp  extends  Application<br /> {<br />      private  Bitmap mBitmap;</p> <p>     public  Bitmap getBitmap()<br />     {<br />          return  mBitmap;<br />     }</p> <p>     public  void  setBitmap(Bitmap bitmap)<br />     {<br />          this .mBitmap  =  bitmap;<br />     }<br />     <br /> }</p> <p><br />     上面q个cd普通的cL什么本质的不同。但该类是Application的子cR对了,q就是用Application Context的第一步,定义一个承自Application的类。然后呢Q就在这个类中定义Q何我们想使其全局存在的变量了Q如本例中的 Bitmap。下面还需要一个重要的步骤Q就是在<application>标签中用android:name属性来指定q个c,代码? 下:</p> <p><br /> < application  android:name =".MyApp"  android:icon ="@drawable/icon"  android:label ="@string/app_name" > <br />  <br /> </ application?</p> <p><br />     接下来的最后一步就是向MyApp对象中存入Bitmap对象Q或从MyApp对象中取出Bitmap对象了,存入Bitmap对象的代码如下:</p> <p><br />     MyApp myApp  =  (MyApp)getApplication();<br />         <br />     Bitmap bitmap  =  BitmapFactory.decodeResource( this .getResources(), R.drawable.icon);<br />         <br />     myApp.setBitmap(bitmap); </p> <p>    获得Bitmap对象的代码:</p> <p>    ImageView imageview  =  (ImageView)findViewById(R.id.ivImageView);<br />         <br />     MyApp myApp  =  (MyApp)getApplication();<br />         <br />     imageview.setImageBitmap(myApp.getBitmap()); <br />     <br />     上面两段代码可以在Q何的Service、Activity中用。全局的?/p> <p><br /></p><p>参考:</p> <p>1.http://flyvenus.net/?p=229</p> <p>2.<a >http://blog.csdn.net/nokiaguy/archive/2010/11/10/5998986.aspx</a> </p><img src ="http://m.tkk7.com/jelver/aggbug/357231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">都市淘沙?/a> 2011-08-25 07:31 <a href="http://m.tkk7.com/jelver/articles/357231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android做代码؜淆的时候容易犯的问?/title><link>http://m.tkk7.com/jelver/articles/356495.html</link><dc:creator>都市淘沙?/dc:creator><author>都市淘沙?/author><pubDate>Sun, 14 Aug 2011 09:49:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/356495.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/356495.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/356495.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/356495.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/356495.html</trackback:ping><description><![CDATA[今天折腾了一阵,Ҏ留个U念Q尤其喜Ƣ用proguardh和json传输的同学要注意了,需要配|好Q千万别把那些做json映射到javabean之间的类做؜淆了Q原因是h后类的字D都变了Q这个得json串和java文g无法对应hQ另外需要注意到是在eclipse开发环境运行模拟器是没有问题的Q是因ؓ模拟器ƈ没有启用h后的apk来安装,所以要保你的E序正常Q你最好用h后的apk 通过 adb install xx.apk 的方式来认是否正常Q这个是排除疑问的最好方式?img src ="http://m.tkk7.com/jelver/aggbug/356495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">都市淘沙?/a> 2011-08-14 17:49 <a href="http://m.tkk7.com/jelver/articles/356495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java与json互相转换(解决日期问题)http://m.tkk7.com/jelver/articles/356485.html都市淘沙?/dc:creator>都市淘沙?/author>Sun, 14 Aug 2011 04:00:00 GMThttp://m.tkk7.com/jelver/articles/356485.htmlhttp://m.tkk7.com/jelver/comments/356485.htmlhttp://m.tkk7.com/jelver/articles/356485.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/356485.htmlhttp://m.tkk7.com/jelver/services/trackbacks/356485.htmlhttp://hi.baidu.com/learnfordba/blog/item/0ee6cdfb7d61fb859f5146f8.html

JSON ?nbsp;JavaScript Object NatationQ它是一U轻量的数据交换格式,非常适合于服务器?nbsp;JavaScript 的交互。本文主要讲解下java和JSON之间的{换,特别是解决互相{换遇到日期问题的情况?br />    一、需要相关的jar包:
    json
-lib-xxx.jar
    ezmorph
-xxx.jar
    commons
-httpclient-xxx.jar
    commons
-lang-xxx.jar
    commons
-logging-xxx.jar
    commons
-collections-xxx.jar
    上面的包可以从下面的q接下蝲Q?br />    http:
//commons.apache.org/index.html
    http://json-lib.sourceforge.net
    http://ezmorph.sourceforge.net
   二、java-》JSON
     
1.List-》JSON
view plaincopy to clipboardprint
?
List
<String> list = new ArrayList<String>();
list.add(
"apple");
list.add(
"orange");
JSONArray jarr 
= JSONArray.fromObject(list);
System.out.println(
"list->json:" + jarr.toString());

    打印l果Qlist
->json:["apple","orange"]
     
2.Map-》JSON

view plaincopy to clipboardprint
?
Map
<String, Object> map = new HashMap<String, Object>();
map.put(
"name""Michael");
map.put(
"baby"new String[] { "Lucy""Lily" });
map.put(
"age"30);
JSONObject jo 
= JSONObject.fromObject(map);
System.out.println(
"map->json:" + jo.toString());

    打印l果Qmap
->json:{"age":30,"name":"Michael","baby":["Lucy","Lily"]}
    
3.bean->JSON

view plaincopy to clipboardprint
?
JsonBean bean 
= new JsonBean();
bean.setName(
"NewBaby");
bean.setAge(
1);
bean.setBorn(
new Date());
jo 
= JSONObject.fromObject(bean);
System.out.println(
"bean->json:" + jo.toString());

打印l果Qbean
->json:{"age":1,"born":{"date":10,"day":3,"hours":14,"minutes":14,"month":2,"seconds":1,"time":1268201641228,"timezoneOffset":-480,"year":110},"name":"NewBaby"}
   q时你会发现它把bean对象里的util.Dateq个cd的所有属性一一转换出来。在实际q用q程中,大多数情况下我们希望能{化ؓyyyy
-MM-ddq种格式Q下面就讲一讲如何实玎ͼ
   首先要写一个新的类JsonDateValueProcessor如下Q?br />
view plaincopy to clipboardprint
?
/**
* JSON 日期格式处理Qjava转化为JSONQ?br />* 
@author Michael sun
*/
public class JsonDateValueProcessor implements JsonValueProcessor {

    
/**
     * datePattern
     
*/
    
private String datePattern = "yyyy-MM-dd";

    
/**
     * JsonDateValueProcessor
     
*/
    
public JsonDateValueProcessor() {
        
super();
    }

    
/**
     * 
@param format
     
*/
    
public JsonDateValueProcessor(String format) {
        
super();
        
this.datePattern = format;
    }

    
/**
     * 
@param value
     * 
@param jsonConfig
     * 
@return Object
     
*/
    
public Object processArrayValue(Object value, JsonConfig jsonConfig) {
        
return process(value);
    }

    
/**
     * 
@param key
     * 
@param value
     * 
@param jsonConfig
     * 
@return Object
     
*/
    
public Object processObjectValue(String key, Object value,
            JsonConfig jsonConfig) {
        
return process(value);
    }

    
/**
     * process
     * 
@param value
     * 
@return
     
*/
    
private Object process(Object value) {
        
try {
            
if (value instanceof Date) {
                SimpleDateFormat sdf 
= new SimpleDateFormat(datePattern,
                        Locale.UK);
                
return sdf.format((Date) value);
            }
            
return value == null ? "" : value.toString();
        } 
catch (Exception e) {
            
return "";
        }

    }

    
/**
     * 
@return the datePattern
     
*/
    
public String getDatePattern() {
        
return datePattern;
    }

    
/**
     * 
@param pDatePattern the datePattern to set
     
*/
    
public void setDatePattern(String pDatePattern) {
        datePattern 
= pDatePattern;
    }

}

试代码Q?br />
view plaincopy to clipboardprint
?
JsonBean bean 
= new JsonBean();
bean.setName(
"NewBaby");
bean.setAge(
1);
bean.setBorn(
new Date());

JsonConfig jsonConfig 
= new JsonConfig();
jsonConfig.registerJsonValueProcessor(Date.
class,new JsonDateValueProcessor());

JSONObject jo 
= JSONObject.fromObject(bean, jsonConfig);
System.out.println(
"bean->json:" + jo.toString());

打印l果Qbean
->json:{"age":1,"born":"2010-03-10","name":"NewBaby"}
q就能得到我们想要的l果了?br />
三、JSON
-》java
1.如何把json的yyyy-MM-dd的{换ؓBean中的util.DatecdQ?br />view plaincopy to clipboardprint?
JSONUtils.getMorpherRegistry().registerMorpher(
          
new DateMorpher(new String[] { "yyyy-MM-dd" }));

String jsonStr 
= "[{\"name\": \"husband\", \"age\": \"26\", \"born\": \"1984-01-12\"},{\"name\": \"wife\", \"age\": \"20\", \"born\": \"1990-05-01\"}]";

Collection
<JsonBean> list = JSONArray.toCollection(JSONArray.fromObject(jsonStr), JsonBean.class);
      
//DateUtil.getFormatDate(date,fmtstr)日期转字W串q里不再写代码了
for (JsonBean o : list) {
   System.out.println(DateUtil.getFormatDate(o.getBorn(), 
"yyyy-MM-dd"));
}

打印l果Q?br />           
1984-01-12
          
1990-05-01
   
2. JSON-》List?nbsp;Map
view plaincopy to clipboardprint
?
String listStr 
= "[\"apple\",\"orange\"]";
Collection
<String> strlist = JSONArray.toCollection(JSONArray.fromObject(listStr));
for (String str : strlist) {
    System.out.println(str);
}

String mapStr 
= "{\"age\":30,\"name\":\"Michael\",\"baby\":[\"Lucy\",\"Lily\"]}";
Map
<String, Object> map = (Map) JSONObject.toBean(JSONObject
                .fromObject(mapStr), Map.
class);
for (Entry<String, Object> entry : map.entrySet()) {
    System.out.println(entry.getKey() 
+ " " + entry.getValue());
}

打印l果Q?br />            apple
           orange
           name Michael
           age 
30
           baby [Lucy, Lily]


]]>
PhonegapQ快速开发跨q_HTML5应用的胶水层http://m.tkk7.com/jelver/articles/352487.html都市淘沙?/dc:creator>都市淘沙?/author>Fri, 17 Jun 2011 02:21:00 GMThttp://m.tkk7.com/jelver/articles/352487.htmlhttp://m.tkk7.com/jelver/comments/352487.htmlhttp://m.tkk7.com/jelver/articles/352487.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/352487.htmlhttp://m.tkk7.com/jelver/services/trackbacks/352487.html

PhonegapQ快速开发跨q_HTML5应用的胶水层

Posted on 2011/03/05 by ?雪愚

在开发移动应用的q程当中Q如果你的应用只定位在一U^CQ这可不是一个好LQ但是ؓ许多不同的^台Building应用又是一?非常ȝ和非怸爽的事情Q因Z会发现每一U手机^台都有自qSDKQ它们需要用不同语a来进行开发,你可能不得不需??个代码仓库来理不同 讑֤上的代码Q而且需要不同设备的开发h员来开发维护这些仓库,你还不得不装上各个设备的sdkQ设|好路径和各U配|信息,来编译不同设备上的应用包?br /> 那么Ud|站模式是不是一个可以接受的替代Ҏ呢?q运的是Ud应用和移动网站ƈ不是对立的两端,通过Phonegap我们可以采用html5的网站Ş?来开发移动应用。也许开源Phonegap 会成?WebApp 上设备端开发的事实上标准,ShowMuch本期׃ؓ你推荐移动开发利器:PhoneGap?br /> 我们先来看看PhoneGap的特性:

  • 支持6U移动设备^収ͼiOS, Android, BlackBerry, WebOS, Symbian WRT, Windows Mobile(内部试)Q以及桌面环境(内部试Q?/li>
  • HTML5 + CSS3 + JavaScript  利用标准的Web技术开发应?/li>
  • Phonegap Build: write once, compile on cloud, run anywhere. 提供在线Builderq_Q只写一ơ,云端~译Q运行在M地方
  • 目前已经有上千基?a target="_blank">Phonegap的应?/a>在AppStore?/li>
  • Phonegap 目前标注的版本依然是0.9.xQphonegap的功能特性ƈ不稳定,会有不少bugQ要心?/li>

开始玩

首先自然是需要下?phonegapQ?http://www.phonegap.com/

然后你还需要相应设备的SDK

针对iPhone:

  1. ?Apple Developer Portal 下蝲安装 XCode.
  2. 解开下蝲好的phonegap压羃包,q入iphone目录安装好phonegap
  3. 打开XCodeQ在文g菜单选择 New Project…. 菜单
  4. 点开“User Templates”栏,选择PhonegapQ然后选中双?#8220;PhoneGap-based Application”Q点?#8220;Choose…”按钮Q命名你的项目,选择目文g的位|?

针对Android:

  1. 下蝲安装 JDK 1.5
  2. 下蝲安装 Android SDK
  3. 下蝲安装 Apache ANT
  4. 下蝲安装 Ruby (命o行方式开发需?
  5. ?压已l下载好?nbsp;PhoneGap, q入android 目录Qmy godQ最新的0.9.4ZIP包中没有命o行创建项目的方式Q好吧,你需要从最新的仓库中把代码取出来: git clone https://github.com/phonegap/phonegap-android.git
  6. 命o行方?Droidgap)脚本的开发者没有修改\径以配合新的0.9.4版本Q这是这ơ在发布中被拿掉的原因吧。需要自己改改,蛮简单的Q就不多说?/span>
  7. ?android下的bin目录 加入你的搜烦 path:
    UNIX/LINUX的机? export PATH=$PATH:~/phonegap-android/bin
    在windows下将phonegap-android/bin 路径加到Path中就不用多说了?/span>
  8. okQ在命o行下输入 “droidgap gen demo”,卛_创徏phonegap支撑的html5应用目?/span>
  9. cd demo;ant debug install 卛_安装到设备或模拟?/span>
  10. adb logcat 在控制台查看讑֤的输出日?/span>

使用PhoneGap来创建移动App应用Q?/strong>

打开目的www目录Qandroid是在目的assets/www目录下)Q编辑index.htmlQ在body中键 ?lt;h1>hello world</h1>Q你也可以加上js和css文g在这个目录下面)Q保存,然后你就可以首先部v到模拟器上看看?/p>

也许你会_哈,q不是|页嘛!是的Q这是|页Q不q通过phonegapQ这L|页应用有能力讉K讑֤的所有功能:文gpȝQGPSQ相 机,重力加速度计,电话等Q当然不同的讑֤支持的功能会有所不同Q目前phonegapq不能支持完所有的功能Q具体看各个讑֤支持的特性列表)。另?要想呈现和移动应用一L外观Q你q需要选择一UHTML5 Mobile UI Framework库,q样的Framework库已l很多了: Sencha Touch, JQTouch, JMobile, XUI, The-M-Project,Dojo Mobile, dhtmlxTouch, wink, jo, webapp.net…

Phonegap Build

除了在本地编译应用之外,您还可以使用Phonegap提供的云端Build工具q行应用~译。那是QPhonegat BuildQ通过它,您只需要将用HTML5写好的应用上传到Phonegap的云端服务器Q它卛_以帮你编译不同^台^的应用?/p>

Part of the phonegap build status screen for an app, showing downloads and errors

Phonegap Build 当前Phonegap Build依然处于beta状态,你需要申P{到通过方可使用。另外推荐一个Chrome的插ӞRipple Emulator 可以在Chrome览器上试你的应用Q支持phonegap?/span>

Q文章作者:李雪愚,盛大创新院高U架构师Q雪愚对于用Phonegap有着丰富的经验,曄Phonegap开发基于Android和iOS的应用。编辑BYQHandaoliangQ?/p>



]]>
Location-Aware-InstantQ开发即时位|感知的Android客户??http://m.tkk7.com/jelver/articles/352151.html都市淘沙?/dc:creator>都市淘沙?/author>Sun, 12 Jun 2011 14:04:00 GMThttp://m.tkk7.com/jelver/articles/352151.htmlhttp://m.tkk7.com/jelver/comments/352151.htmlhttp://m.tkk7.com/jelver/articles/352151.html#Feedback1http://m.tkk7.com/jelver/comments/commentRss/352151.htmlhttp://m.tkk7.com/jelver/services/trackbacks/352151.html  一、回?/strong>

      在分享这个项目之前先来回以前的三篇文章Q?/p>

      《基于即旉信和LBS技术的位置感知服务Q一Q:提出问题及解x案?/a>Q外|地址Q?/p>

      在第一文章中我们提出了要让A与B在不同地方能卛_获取Ҏ准确位置的需求。之后讨Z解决q一问题做出的方案选择Q即攑ּ使用轮询QPoolingQ?的方式在不同客户端进行数据的更新Q理由是因ؓB不知道A何时需要自q位置信息Q所以B只能一直post自己的位|数据给服务器,而A要定旉过 RESTful WebhL务器获取B的信息?/p>

      最后确定采用基于XMPP协议的PubSubQPublish/SubscribeQ发?订阅Q方式进行异步消息实时传递?/p>

      《基于即旉信和LBS技术的位置感知服务Q二Q:XMPP协议ȝ以及开源解x案?/a>Q外|地址Q?/p>

      W二文章主要是对XMPP协议q行ȝQ以及ؓ什么要采用XMPP,最后介l了XMPP协议的Java开源解x案:Openfire+Smack+Spark?/p>

      《基于即旉信和LBS技术的位置感知服务Q三Q:搭徏Openfire服务?试2ƾIM客户端?/a>Q外|地址Q?/p>

      W三文章详l讲解了ZXMPP协议的openfire服务架设Q以及?Ƒּ构的ZXMPP协议的桌面客L试x消息传递?/p>

      特别提示Qؓ了更好的了解本项目要解决的问题,强烈ȝ看前面的三篇q蝲?/p>

     

      二、Location-Aware-Instant目概括

      Location-Aware-Instant是一个运行在Android OS 上具有位|即时感知功能的Android应用E序客户端。与之前W三文章里介绍?ƾ桌面程序一P遵@开放标准的XMPP协议?/p>

      开发过E查扑֒参考了不少外文资料和相关项目,利用周末和晚上的旉、现在已l终于完成了90%?/p>

     

      本程序的架构和技术基Q?/p>

      1. Android OS 应用开发技术:包括地图应用开发?/p>

      2. Openfire服务器:ZXMPP协议的开源Java服务器端E序?/p>

      3. Smack 开发库Q对XMPP协议q行了封装的客户端实现的Java开发包。本目采用的是ASmack LibraryQ适合与Android OS 的Smack优化版)?/p>

     

      本项目的实现原理。共分三个层ơ:

      1. 首先使用Openfire作ؓ服务器,通过使用ASmack库开发出带有联系人列表的x消息传递程序;

      2. 然后客户端发送和接收消息之间植入自己的拦截预处理逻辑Qƈ通过定制Ҏ的命令,实现消息的自动应{功能;

      3. 最后一层在接收消息ӞҎ预处理命令判断是否对方的意图为定位请求,如果是则调用位置定位相关Ҏ获取本地位置q自动恢复给发送请求一方,hҎ据预处理命o判断到来的消息是否与位置相关Q如果有兛_对方的位置定位在Google 地图上?/p>

 

      注意Q本文的内容是描qCU应用,q代码讲解Q本目可能以后会结合Android开发ȝ来讲解)?nbsp;

    

       三、项目功能展C?/strong>

      ׃只有一台测试手机HTC G6Q而这个项目是与位|有关的Q所以用Android 开发模拟器来最为双斚w信的一端?/p>

      试帐号分别?a href="mailto:test2@192.168.0.177">test2@192.168.0.177(׃dhtc g6上的Location-Aware-Instant客户?Q?a href="mailto:test@192.168.0.177">test@192.168.0.177Q用来登录模拟器上的Location-Aware-Instant客户端)。上?个帐h式是Jabber IdQXMPP协议中的帐号Q可以参考前排第二篇介绍XMPP的文章)Q本来是使用test@im.comit.com.cn 在其他桌面客L解析正常Q但手机im.comit.com.cn的域名解析成一个其他的IPQ所以直接用我本机的IP地址?/p>

      本程序的logoQ?a >iconQlogo来源自百度百U的XMPP介绍Q?a >imageQ我单的处理了一下?nbsp; 

 

      1. 首先是登录界面(分别使用上面?个帐L录两ƾ手机客LQ:

      g6_loginHTC g6的登录界?nbsp;     login 开发模拟器的登录界?/p>

 

      2. 双方dq连接到openfire服务器时Q会出现双方的在U情c也是在服务器上注册了自己的状态ؓ在线?/p>

      g6_listHTC g6可以看到ҎQtestQ?nbsp;     list开发模拟器昄test2在线

 

      3. 操作Q目前只加入了定位对方的功能Q其实还有发送普通信息、删除联pMh{功能,d联系人)

      g6_list_opHTC g6      list_op

 

      4. 先来看通过手机模拟器定位htc g6客户端的演示Q即点击W三步中手机模拟?双)?#8221;获取位置“选项操作?/p>

      虽然试环境在室内,无法获取GPS信号。但HTC g6插入了联通的3G卡所以即时在室内也是可以使用基站定位大概位置?/p>

      locate

      此时手机模拟器在向G6发送位|感知的hQG6应该回应自己所在的位置Q不?U钟后,得到的结果如下图Q?/p>

 

      locate_ok

      我住在棠下,所以G6通过基站大概定位了我的位|,q将位置数据回应l手机模拟器Q模拟器G6所在的位置定位在地图上?/p>

 

      5. 上面演示了通过模拟器定位到G6的位|,现在演示的是G6获取模拟器的位置。但是因为手机模拟器不能获取真实的位|信息,也就无法自q信息回复l?G6。解决的Ҏ是在开发工具中输入一个自定义的位|数据。如下图Q输入公司在所位置的经U度Q?3.143791, 113.347533Q?/p>

      latlng

      图中emulator 5554是我们的模拟器QHT03GNX0404是HTC G6手机Q。这h拟器的位|就定位在公司做位置?/p>

 

      现在试通过G6来感知模拟器q个客户端所在的位置Q即点击W三步中HTC G6 (左边)?#8221;获取位置“选项操作。结果如下图Q?/p>

      g6_locate

      G6客户端程序正在等待手机模拟器的回应,不到2U钟后:

 

      g6_locate_ok

      OKQ成功定位到公司所在位|,即G6卛_感知C手机模拟器的位置信息?/p>

 

      到这里手机的位置感知服务基本框架已经出来了。能够即可感知对方的位置Q是不是很Cool的体验!

 

      四、项目内容以及结构介l(代码太长Q截囑ֈ成上下两部分Q?/strong>

      目l构?      目l构2 ?

      代码l构介绍Q以下包名忽略了cn.com.comit.locationaware父包

      ?Qchat包:与消息发送有关的c?/p>

               data包:联系人列表,消息{实体类

               dialogs包: 交互有关的对话框c?/p>

               exception包:异常相关的类

               map包:与地囑֒LBS有关的类

      ?Qservice包:装Smack库和Ҏ提供XMPP服务的封装类?/p>

               util包:工具cd

               widget.quickantion包:联系人操作(如第三章W?步中?#8220;获取位置”Q操作选项控gc?/p>

               cn.com.comit.locationaware父包Q入口以及辅助类

               Google APIs 2.2Q引用的google android 地图开发包

               引用的库Qasmack-2010.05.07.jar – Smack的Android优化版API库、trace.jar错误q踪相关包?/p>

 

      五、结束语

      1. 传统|络操作方式我们用到 Restful Get获取数据、Post提交数据Q但q不是万能的Q虽然可以解军_多数的网l应用问题)。通过引入ZPubSubQ发?订阅Q的x通信有时候可?取得意想不到的体验效果,本项目提Z一个研I方向和思\Q虽然离商用q有很长的\要走Q可路终I是扑ֈ了一条,q且q出?#8220;万里长征的第一?#8221;Q?/p>

      2. 最q基于LBS的应用层ZIP能够LBS和即旉信q行整合q行Q让研究的方向更明确Q例如本目的自动应{功能)?/p>

      3. 即旉信和LBS有机的结合或许可以称作ؓ传说中的“微创?#8221;Q毕竟创C一定是非得创造?/p>

]]>
手机媒体技术简?[zhuan]http://m.tkk7.com/jelver/articles/345876.html都市淘沙?/dc:creator>都市淘沙?/author>Mon, 07 Mar 2011 05:28:00 GMThttp://m.tkk7.com/jelver/articles/345876.htmlhttp://m.tkk7.com/jelver/comments/345876.htmlhttp://m.tkk7.com/jelver/articles/345876.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/345876.htmlhttp://m.tkk7.com/jelver/services/trackbacks/345876.htmlhttp://blog.csdn.net/marsgongna/archive/2008/12/04/3442247.aspx

手机作ؓZ必备的移动通信工具Q目前在全球已经有超q?0亿的用户Q其数量q在不断地增ѝ随着Ud多媒体时代的到来Q用手机看电视,用手机看电媄Q用手机听音乐等使用Ud媒?/u>技术的应用Q已l在中国q速发展v来?/div>
一、什么是媒体技术?
媒体技术是从互联网上发展v来的一U传送多媒体数据的技术,其主要特Ҏ以流QstreamingQ的形式q行多媒体数据的传输。采用流? 体技术的客户端播攑֙在播放一个多媒体内容之前Q预先下载媒体内容的一部分作ؓ~存Q在缓存中的这部分内容向用h攄q程当中Q该多媒体内容的剩余? 分将在后C服务?/u>l箋下蝲到客L播放器上。这P一边客L播放器在不断播放~冲Z的多媒体内容Q另一边多媒体内容的其他部分从后台服务?/u>不断C输到~冲ZQ这样就实现了所?#8220;边下载,Ҏ?#8221;式播放?/div>
媒体技术应用到Ud|络和终端上Q称之ؓUd媒体技术。从上面所q我们可以看刎ͼUd媒体技术具有三个突出特点:Q?Q能够实时播放视? 频等多媒体内容,也可以对多媒体内容进行点播,h交互性。可以让用户摆脱被动接受内容的苦|而灵z自丅R随旉地地选择自己惌看的内容Q从而更加个 性化。(2Q播攄媒体文件不需要在客户端保存,减少了对客户端存储空间的要求Q也减少了缓存容量的需求。(3Q由于流媒体文g不在客户端保存,从而从 一定程度上解决了媒体文件的版权保护问题?/div>
二、手机播放流媒体文g的基本要?/strong>
Q一Q手机操作系l?/div>
目前Q智能手机的操作pȝ主要?a target="_blank">Symbian、Windows Mobile、Palm?a target="_blank">Linux。其?a target="_blank">Symbian、和Windows Mobilepȝ的用占据了大多数?Palm的䆾额主要来自它的PDA支持?/div>
1、Symbian操作pȝ
Symbian是诺Z、摩托罗拉、烦爱立信{几家电信巨头联合开发的操作pȝQ据l计Q用Symbianq_的智能手机占?0%。该? 作系l以占用资源、对g要求低、第三方软g支持q泛{优势,成ؓ目前手机市场上应用最为广泛的产品QSymbian操作pȝ下主要用S60? UIQ、S90q三U操作^台?/div>
Q?QSeries S60QS60操作q_具备了Symbian OS操作pȝ操作的简易性,支持KJAVA?a target="_blank">C++开发的针对单手使用的设计,支持的屏q分辨率?76*208象素。S60界面是拥有最多第三方软gQ游戏)的界面,是目前Symbianpȝ中用最q泛的版本。主要支持的手机以诺Z7650?610?260{最为典型?/div>
Q?QUIQ SeriesQUIQ Series操作q_的特性主要表现在它的多媒体和功能全面的特性。UIQ Series? Symbian OS 的系l架构下Q专门ؓ高端多媒体手设计,可支持手写操作,使用h非常cM PDA 操作Q适用人群主要定位在高端商务用戗? 主要应用有烦爱Ppd以及诺基?708及BENQ P30{?/div>
Q?QSeries S90QSeries90是Symbianq_上最q轻的界面,Ҏ持触ؓ操控模式Q分辨率高达640*320像素。但目前支持Series 90的只有诺Z7700Q未投上市Q和7710两款手机Q更多第三方软g的支持尚需一定时日?/div>
2、Windows Mobile操作pȝ
Q?QPocket PC PhonepȝQPocket PC是一U手持设备,可帮助用者存储ƈ索电子邮件、联pMh和约会信息,播放多媒 体文Ӟ玩赏电子游戏Q借助MSN Messenger交换文本消息Q浏览Web内容{。主要适用机型有BENQ的P50以及多普?96?18? 828{机型?/div>
Q?QSmartphone pȝQ同是微软公叔R下的产品Q操作界面和WINDOWS非常怼Q注重移动互联和׃功能。没有触控笔和触摸屏Q体现单手操控的理念Q全以数字键盘代ѝ适用机型有多普达?pd手机?/div>
Q二Q下载安装终端播攑֙
Ҏ有操作系l及其不同版本都实现适配的播攑֙是不存在的,Z成本、开发周期及其它因素的考虑Q属W三方Y件的媒体播攑֙大部分都只是Z以上操作pȝ实现的?/div>
通过WAP|站Q具备上q操作系l的各型h机,可以直接匚w到适合的流媒体播放器。一般在下蝲后会直接q入到播攑֙E序的安装过E,Ҏpȝ提示完成安装后,可以随时、随Cn受移动流媒体服务了?/div>
三、手机播放流媒体文g的一般技术过E?/strong>
Q一Q?GPP标准中的协议?/div>
主要包括以下几种Q?/div>
·RTPQ实时传输协议)QRTP被定义ؓ在一对一或一对多的传输情况下工作Q其目的是提供时间信息和实现同步,例如Q音频、视频或模拟数据。RTP不处理资源预定,q且不保证实时服务的服务质量Q通常使用UDP来传送数据?/div>
·RTCPQ实时控制协议)QRTCP的主要功能是为数据的传送情冉|供反馈。接收端定期报告信息发送给发送端Q报告信息包括:接收端测量到传输q程中的不稳定情况和信息包丢q数量Q?/div>
·RTSPQ实时流协议Q:RTSP被用于徏立和控制q箋媒体的时间同步流。它为多媒体服务扮演“|络q程控制”的角艌ӀRTSP是文本协议ƈ且类似HTTPQ其主要不同之处在于RTSP是标准的媒体协议,q常利用独立传输协议Q通常是RTPQ来传输媒体数据?/div>
·SDPQ会话描q协议)QSDP是服务器端生成的描述媒体文g的编码信息以及所在的服务器的链接{信息,客户端通过它来配置播放软g的设|。它是一个简单、可扩展语法的文本协议?/div>
所有这些流媒体相关协议都是利用TCP和UDP传送。其中,RTSP是主要的协议Q在体系l构上位于RTP、RTCP之上Q属于应用层协议Q被用于建立和控制连l媒体的旉同步。它为多媒体服务扮演“|络q程控制”的角艌Ӏ?/div>
Q二QRTSP单播操作的过E描q?/div>
一ơ基本的RTSP单播操作Q其实就是用h放一个流媒体节目的过E。首先,客户端通过览一个带RTSP URL地址的网늭Ҏ来获得媒体片D늚位置。在媒体会话初始化的时候,媒体播攑֙q接到流服务器ƈ发送一个RTSP描述命o。这?#8220;描述命o”包括 了客L可以发送的cM音频信道的数量、支持的媒体cd、屏q尺寸大和q_象素{信息。流服务器通过一个SDP描述来进行反馈,反馈信息包括数量、媒 体类型和h带宽。在分析完该描述之后Q客LZ话中的每一个流发送一个RTSP安装命oQ安装命令告诉服务器在客L用于接收媒体数据的端口。流媒体 q接建立完成后,客户端发送一个播攑֑令,服务器就开始在UDP上传送媒体流QRTP包)到客L。最后,客户端可发送一个终止命令来l束媒体会话?/div>
Q三Q用户从手机上看到的程
上述RTSP操作q程对用h透明的。用户从手机上看到的只是Q当他通过WAP|站选择播放一个节目后Q手机操作系l自动启动了已安装的播放 器,播放器通过GPRS|络q接到媒体服务器Qƈ开始缓Ԍ他只需在缓冲到100%前的M时刻点击“播放”按钮Q或{待~冲?00%时播攑֙自动? 放,可以开始欣赏音视频节目?/div>
 
Ud媒体技术的应用开创了无线通信|络与互联网、视音频压羃~码技术相融合的新时代Q随着手机、PDA{移动终端品功能的不断提升Q移动流媒体技术必带lh们更多、更好的韌频体?

]]>手机视频监控pȝhttp://m.tkk7.com/jelver/articles/345875.html都市淘沙?/dc:creator>都市淘沙?/author>Mon, 07 Mar 2011 05:23:00 GMThttp://m.tkk7.com/jelver/articles/345875.htmlhttp://m.tkk7.com/jelver/comments/345875.htmlhttp://m.tkk7.com/jelver/articles/345875.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/345875.htmlhttp://m.tkk7.com/jelver/services/trackbacks/345875.html服务?/u>压羃处理后上传到互联|中Q通过|络传输到监控中心的视频监控服务?/u>Q然后用手Z|的方式Q登陆到视频监控服务?/u>然后获得监控资源列表Q然后可以选择监控的视频。当用户q入到监控画面是q能单的控制q端的云収ͼ保证自己得到惌的角度。前端的监控摄像机端是通过有线或无U的方式q接C联网Q手频查看端是用无U上|的方式实现?
    双码就是对同一视频源,我们会对它进行两ơ编码,一路可以是 D1/CIF, 另一路是 QCIF. 因当前手机带宽的限制Q我们在手机端采? QCIF 传输Q码ؓ 16Kbps-64Kbps 可调。在 PC 上传?D1/CIF, 码流?16Kbps-2Mbps 可调? 保证监视图象的清晰?
   只要您有手机Q手频监控系lؓ你实现随旉地、随心所Ʋ的看到您的住宅、仓库、工厂、道路及安全场所的实时视频,一切视频都呈现在您的手Z。凡摄像拍到的,你就能通过手机看到QQ何时间Q何地点,走到哪看到哪Q想看哪q哪?

1 、采?a target="_blank">嵌入?/u>技?Q系l稳定) Q无需电脑可以独立工作,同时支持 GPRS ?CDMA ?EDGE ?3G 手机无线|络Q也是说只要是有手机网l的地方p随时随地实现实时的视频监控?nbsp;

2 ?D1 高清晰网l视频服务器Q兼?D1 ?CIF 格式?/p>

3 ?采用 H.264 视频压羃法Q轻村֮现高清晰囑փ的低|络带宽传输 , 手机实时查看视频可达 20 帧,视频图象实时、流畅?nbsp;

4 、支持动?IP 地址?DNS Q支持局域网?Internet Q?ADSL 、有UK)

5 、可使用中心理软g实现对多台视频服务器的集中监控和理Q方便组建大型视频监控系l?/p>

6 、网l自适应技术,Ҏ|络带宽自动调整视频帧率?/p>

7 、随旉地的Ud监控Q专业的电脑q程同步监控录像功能

8 、手机端览实时囑փ的同Ӟ电脑端可同步对图像进行浏览、录像、回放、管?/p>

9 、宽实时视频传输Q支持众多型h机?/p>

10 、支持远E云台控制功能,视角更广

11 、监控点之间随意切换Q多部手机可同时监控 

12 、报警自动给指定手机发短信及l指定邮发邮g?/p>

基本功能 

实时报警Q监控场地发生意外情冉|Q通过zd视频向手机报警?/p>

d查看Q^时也可以随时随地的查看监控场地的情况?/p>

在线讄Q可以通过手机对监控设备进行设|,比如是否入R,开机关机,囑փ讄{?/p>

服务器存储:在向手机报警的同Ӟ高清晰的图片存储到服务器上Q以备查用?/p>

 q程视频监控、手频监控系l解x?br /> 如今Q以嵌入式技术ؓ依托Q以|络、通信技术ؓq_的网l视频监控,已经来成熟,应用范围来广阔。网l视频监控突破了地域的限Ӟ实现了远E? 监控Q可是,随着 “ AnyTime、AnyWhere? AnyDevice”(M旉、Q何地炏VQ何设?{概늚提出Q普通的|络视频监控已经不能满用户日益增长的多元化需求。全新的解决Ҏ?“手机 视频监控”使这个问题有了答案,q项应用在安防行业中得到迅速推q和普及Q同Ӟ她也会逐渐走入Z的家庭生zM?/p>

  手机视频服务器,该设备在开启后Q通过已连接的路由器,可直接连接到Internet|络(可独立运作于标准|络环境Q无d接计机)Q然? 拍摄到的媄韌频信号压~成H.264格式Q再发送到Internet。而用L讑֤则变成了我们日常用的手机。手机通过GPRS或者CDMA(目前? 内普遍的两种上网方式)上网后,通过查看讑֤的动态域?端口Q就可以看到手机视频服务器中拍摄到的影音文g了。用L一ơ启用这个设备时Q要通过在同一 个网l中的电脑对其进行简单的讄(包括用户名、权限、域名、端口等)Q以后每ơ启动,׃再需要设|了。实际上Q是集数据采集、网l?a target="_blank">视频~码、压~和|络q接Z体,因此严格的说他是一台网l视频服务器。她的应用范围很q,比如Q企业、商场监?q儿园、托儿所{场所的远E观?儿童、老h看护;家庭和别墅的安防监控{等?/p>

  某钻石专卖店数字监控Ҏ

  某钻石专卖店主营金银首饰和宝石等贵重饰品Qؓ了店内安全,做到能及时处理突发事Ӟ全面掌握犯罪证据Q而且考虑到公司总部与店面两个城市的跨地区管理,采用以手频服务器为数字传输方式的q程数字监控Ҏ?/p>

  随着U技的进步,以网l传输的手机视频服务器作为安防监控的W五代品,在安防界脱颖而出。手频服务器把前端的模拟信号采集Q通过g压羃 为数字信号传输。它独特的稳定性和无h职守Q随旉可以在已有的局域网和广域网上访问浏览等优点深受q大l端客户和各地工E商的喜爱。手频服务器逐步 占领安防市场?/p>

  (1)案例分析Q?/p>

  ȝ专卖店在两年以前安装了一套以视频压羃卡ؓ采集视频方式的硬盘录像解x案。随着旉的推U,无论从前端摄像机部分q是从后端的电脑LQ以压羃卡ؓ采集视频的方式毛病曾ZIP电脑L更是家常侉KQ而且视频画面效果极差Q画面速度延时严重?/p>

  加上公司总部和店面在跨地区的两个城市Q鉴于硬盘录像机|络的弊端,不能随时q行|络q程传播。公叔R导只能来往于两地奔波,而进行店面的理Q严重媄响了工作效率?/p>

  (2)|络数字解决ҎQ?/p>

  1、以塬有的线路ؓ传输视频的方式,不改变Q何的U\Q且使用塬有的摄像机Q直接在机房内用手机视频服务器连接塬有接入视频采集卡的模拟线路,讄好手频服务器IP为局域网IPQ这h地局域网内就可以实现监控和录像?/p>

  2、考虑到远E监控和录像Q必ȝ请一条普通的ADSL宽带U\。手频服务器只有一个RJ45接口Q直接接入ADSL的话Q局域网内就不能 q行监控。ؓ了实现本地远E双重监控,可在机房内设|一个普通\由器。实现局域网内本地监控,且局域网内各个电脑都能实现网上冲?/p>

  家庭监控Ҏ

  随着l济的快速发展,Z生活节奏的提高,照顾家庭的时间将来少。但CU技的高速发展可以让q程照顾孩、家庭宠物等成ؓ一U可能。h? 在可以繁忙工作的同时Q在q程׃解自己家庭概况,及时作出分析与判断。随着|络通讯技术及囑փ压羃处理技术以及传输技术的快速发展,使得家庭能够采用最 新的通讯和图像处理技术,通过|络传输数字囑փQ可为实现家庭监控系l提供高效可行而且h低廉的解x案?/p>

  家庭监控Ҏ特点:

  本方案立以互联|、宽带ADSL应用ҎQ采用手频服务器 “传统摄像?#8221;+“手机视频服务?#8221;的方式,摄像责媄像采? 手机视频服务器负责把摄像机的模拟信号q行数字压羃Q{换成数字信号Q最后手频服务器通过路由器或交换机或ADSL视频传输到局域网或互联网?/p>

  ?NO-PC架构

  ?预设二域名

  ?安装单快?/p>

  ?外围讑֤接入灉|

  ?高性能 低成?免维?更安?/p>

  家庭监控标准版方?/p>

  ׃台通过手机视频服务器ƈ在网l端通过|线q接ADSL MODEM;

  的自带拨L序连通电源后会自动连接INTERNETQ远端用户可以通过IE览器直接观看家中情c?/p>

  实际可应用的范围Q?/p>

  - 商业店铺Q商场店铺的监控Q收银、货架、出入口监控

  - 居民住宅Q室内远E图象报警、小?/ 大楼安全防范、物业的无h监控

  - 教育行业Q幼儿园、小学校的教学评伎ͼ安q程监控

  - 旅游行业Q宾馆饭店的楼层理、重Ҏ物及景点的保?/p>

  主要应用Q?/p>

  1、店市:店铺老板在家中或外地Q只要通过 Internet 或手机随时可看到店铺实景情况Q员工的工作情况Q进行远E监控和理?/p>

  2、企业:企业领导以及各部门需要随时了解员工工作情况,车间生情况、流水线q作情况{,对突发事仉要进行即时处理。不需到场Q只要上互联|或手机随时可看到外地各分部的实时情c?/p>

  3、家庭:可在办公室或外地通过互联|或手机随时看到家庭的现状。家庭窃案或其它事故发生Q可快速查扑ֈ当时录像?/p> 4、幼儿园Q家长们在家里通过互联|或手机实时监控q儿在园里情况,解决了对孩子的担?

]]>
手机视频监控pȝ需?/title><link>http://m.tkk7.com/jelver/articles/345874.html</link><dc:creator>都市淘沙?/dc:creator><author>都市淘沙?/author><pubDate>Mon, 07 Mar 2011 05:21:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/345874.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/345874.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/345874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/345874.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/345874.html</trackback:ping><description><![CDATA[<p><strong>一、手机监控Y件功能需?/strong></p> <div><strong>1.1 </strong>功能概述</div> <div>手机监控软gQ可以通过登陆手机视频<a target="_blank"><u>媒?/u></a>Q获取其转发的设备的码流q行解码输出到手机屏q上(<a target="_blank"><u>Windows Mobile</u></a>手机能够自动拨号q接上网l??/div> <div>主要功能Q?/div> <div>1、登陆手频网养IҎ所用户d的用h选择赋予的权?获取该用户可看的视频??/div> <div>2、选择视频源浏览视频,Ҏ频网兌来的码流q行解码Qƈ实时昄到手机屏q上?/div> <div>3、通过手机D键进行云台控制?/div> <div><strong>1.2 </strong><strong>性能概述</strong></div> <div>目前Q手机监控Y件运行^台是WINCEQ但考虑到项目的发展Q以及客L需求,应该可以使用J2ME技术来开发,使用的Java解码库,支持对单P帧,帧率?的QCIF视频码流的解码?/div> <div><strong>1.3 </strong><strong>q行环境</strong></div> <div>g环境Q手机或者PDA(WINCE操作pȝ)?/div> <div>*以后应该支持JAVAq_的手机监控Y?/div> <div><strong>1.4 </strong><strong><a target="_blank"><u>服务?/u></a>的配|?/strong></div> <div>  用户在用手Y件时Q应该是可以配置可以自行配置d用户、密码、服务器地址、服务器端口Q在下次dӞ不需要重新输入以上信息?/div> <div><strong>1.5 </strong><strong>实时囑փ的浏?/strong></div> <div>用户通过手机软gQ能q实时图像的览Q保证视频每U?帧以上的QCIF的图你,q能q行各通道间的切换?/div> <div><strong><font size="5">1.6 云台控制</font></strong></div> <div>通过手机可以对前端云台进行控制?/div> <div><strong><font size="5">1.7 囑փ的羃?/font></strong></div> <div>手机能通过手机菜单q行视频的羃?/div> <div><strong><font size="5">1.8 手机用户的注销</font></strong></div> <div>   用户在点L销菜单Ӟ注销所d的用P但不退Y件?/div> <div><strong><font size="5">1.9 手机视频的回?/font></strong></div> <div>用户通过手机软gq行视频的回?按时间段或文件类型进行查?特别是针Ҏ警录像的回放)</div> <div><strong><font size="5">1.10 手机软gLOGO的叠?/font></strong></div> <div>可根据用L需求更换手Y件的LOGO?br />  </div> <div><strong>二、手频网关的功能<br /> </strong></div> <div><strong>2.1 </strong>功能概述</div> <div>手机视频|关部v在监控中心计机上。它理手机d用户和DVR子码视频源Q同时可以配|视频源的码率等{参C及配|不同别用户对应的视频源请求权限和云台控制权限?/div> <div><strong>2.2 </strong>性能概述</div> <div>手机视频|关可以理的视频源最大个Cؓ5120Q?/div> <div>可以理的手机用h大个Cؓ5120Q?/div> <div>允许d的最大手机用h?12Q?/div> <div>一路视频源的最大请求数?6?一般DVR监控讑֤Ҏ一通道有连接限?</div> <div><strong>2.3 </strong>q行环境</div> <div>本系l的q行q_Q?/div> <div>g环境QPCQ主?.5G以上、主?12M以上、可用硬盘空?0G以上Q?/div> <div>软g环境QWindows 2K/XP/2003</div> <div><strong>2.4 </strong><strong>视频源配|?/strong></div> <div>用户可能通过手机视频媒体Y仉|前端DVR的基本信息,使用用户可以直接通过该Y件直接获取视频流?/div> <div><strong>2.5 </strong><strong>用户的添加与权限的修?/strong></div> <div>用户可以通过该Y件对手机软g使用的用戯行用L增减Q以及权限的配置Q包括:实时视频的浏览、云台控制、历史录像的回放Q?br /> <br />  </div> <div><strong><span>三、手机客L扩展功能<span> <br /> <br /> </span></span></strong></div> <div>3.1 量l计,昄当前传输速率及?</div> <div>3.2 前端监控点发生报警时?能够以短信或彩信(带报警发生时现场截图)形式通知到手?</div> <div>3.3 能够通过手机客户端对q程监控点进行布撤防{操?/div> <div>3.4 l合GISpȝ昄监控点位|以及周边环?从综合监控^台获取监控点信息(如危险源企业信息,应急预?</div> <div>3.5 查看当前览视频源前端关联的传感器采集的?通过采集服务器{发到手机客户?,查看实时与历史数?最好能够以曲线昄表示)</div> <img src ="http://m.tkk7.com/jelver/aggbug/345874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">都市淘沙?/a> 2011-03-07 13:21 <a href="http://m.tkk7.com/jelver/articles/345874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我看手游CP\![转帖]http://m.tkk7.com/jelver/articles/341819.html都市淘沙?/dc:creator>都市淘沙?/author>Tue, 28 Dec 2010 14:34:00 GMThttp://m.tkk7.com/jelver/articles/341819.htmlhttp://m.tkk7.com/jelver/comments/341819.htmlhttp://m.tkk7.com/jelver/articles/341819.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/341819.htmlhttp://m.tkk7.com/jelver/services/trackbacks/341819.html

http://sns.spforum.net/space.php?uid=30846&do=blog&id=17246

CPQCPQ很多朋友看我写的文章之后,L不忘了问Q那吴刚手机游戏Z在哪里呢Q唉……问的我头大。那我就认真写写?#8230;…当然Q如果你真的做了Q赚不到钱,你可千万别怪我了,没有哪个事情没有风险Q没有哪个市场是L可以q的。但看了我的文章Q促使您思考了Q了解到C西了Q或者假若去做了Q真赚到了,您就帮我挂块匑ֈ天安门城|上书四个大字CP万岁Q哈?#8230;…开个玩W了Q我不图啥,一帮鸟人,别说我吴刚装Bp了,谁说我装BQ你们合伙替我骂他!我开心!说实话,我只兛_兛_我的人的评h。别人爱骂骂去,有本事骂人的家伙也这么炒作一下,多好Q?/p>

先说个笑?/p>

    我的朋友认ؓ没有甉|U的讑֤叫无线讑֤Q我来完善一下,不需要连甉|U的讑֤能玩的游戏就叫无U游戏。至于手机游戏这个词、无U互联网q个词,看文章前先扔掉,不然看着U结Q?/p>

我从技术^台来划分Q来看机会?/p>

1?nbsp; IPHONE

休闲cL戏、女性游戏?

从单机游戏角度来_IPHONEq是存在很大Z的,但竞争也相当Ȁ烈,题材、游戏特色将是中国CPH破的重炏V千万不要指望自己在癑֮׃的RPG可以拿到APPSTORE上l卖钱。IPHONE对休闲类游戏的接U程度很高,q且x玩家也有相当的比例。我知道的是d堂的x玩?009q底?100万,占了80%。FACEBOOK?8.2%。联通IPHONE 40%x用P全球IPHONEx用户大概是46%-42%Q这要比Android 27%的女性用h例高不少?/strong>

技术特点生游戏玩法创?/strong>

IPHONE4已经推出了,我还没有拿到真机。但从技术参数来看,我关注了四点Q一、广告的植入Q二、陀ZAQ三、分辨率。四、触摸屏。头一点,我们不谈Q我重点说后三项?/strong>

陀ZA是一个重要的革新Q如果国内CP惌讨y出小品游戏赚钱,一定要充分考虑q个东西的作用。我拍脑袋一惻Ip惛_非常多好玩的东东。这个陀ZA不同以往Q它更加_Q能辨别方向、速度{。玩家的肉体与手Z动,q是多么有意思的一件事啊。CP不要d力气Q一定要做出跟以往不同玩法的游戏才能生存?/strong>

分L率导致生产工艺的变化

IPHONE4的超高分辨率Q得过去NOKIA S40?28*128术生工艺要彻底进阴沟了,q是否意味着Q手机游戏开发与PC游戏开发要通盘考虑Q至在术制作环节上都是这L。最后,触摸屏游戏,国内CP普遍储备不Q这l对不是你在触摸屏上仿真一个方向键q么单,从界面到{划Q必要针对触摸屏开发才可!

IPHONE游戏是场仗Q如果你打输了,千万不要怪市Z好,?00%是你能力的问题,1个亿的IOS装机量,我们可能无动于衷么?回避L市场Q你q敢说自己是做手机游戏的Q呵?#8230;…我对于这L事情最有兴,因ؓq是实力和脑力的比拼QCP梦寐以求的不应该如此么Q推q成本是IPHONE的最令h头痛的问题,我所知道的解决的办法Q?br style="word-wrap: break-word;" />

1Q?nbsp; 利用很多现成的广告^台?/strong>

2Q?nbsp; 多做免费游戏Q然后进行交叉营销?/strong>

3Q?nbsp; 找v外公司多做些软性宣?/strong>

4Q?nbsp; 得到APPLE的推荐支?/strong>

5Q?nbsp; 找v外信用卡Q刷……Q这个我不推荐,只是让你知道有这么回事)

2?nbsp; Android、HTML5、FLASH

在某U程度上来说Q我认ؓAndroid与HTML5、FLASH是息息相关的Q因为新版本已经支持了这些内容,选切入点是我们必要慎重的。Android在国内、在外会有量的Q现在就已经看出个所以然Q它未来在某U程度上会替代当今山寨手机的CQ或者说山寨手机也Android了!APPLE在各国的强势Q导致在价值链中,很多公司无法参与Q心生嫉恨,那么推动Android的手机,是他们ؓC多的选择之一。但成也萧何败也萧何Q由于厂商的q渡分散Q也会导致一些很讨厌的问题,但对于UCWEBq样的^台公司来_是个利好Q我现在了解到的情况Q很多国家的q营商都在找Android的游戏,希望有个清单供他们选择?br style="word-wrap: break-word;" />

具体说说QAndroid手机上用什么开发最好,我觉得还是FLASH吧!FLASH很多人都_APPLE不支持一定走不远Q但我看也未必,APPLE对待HTML5和APPSTORE的态度是很微妙的。况且,HTML5的各U开攑ֺ用,开发工兯得可怜,q行效率或者还不如FLASHQ而FLASH有了PC上庞大的客户,q有FLASH LITE的过度,在近阶段是不可以攑ּ的。当Ӟ如果CP们还qK-JAVA不松手,1-2q就有被边缘化的风险了。我跟不CP谈过FLASH的情况,他们后来使用了FLASH开发游戏,都高呼FLASH开发游戏简直就感觉M天堂。从我的视野看到手机游戏公司Q明珠、拉阔、呈天游、我们顽石都已经推出或准备推出WEB FLASH的网怺Qƈ且效果不错。我认ؓq是在当下一个最好的跨^台、跨讑֤、跨地区国家q营的解x案。做K-JAVA的开发h员,h紧放弃,明珠老板KJ是SUN公司出来的,都没那么深感情,你们何必呢,呵呵……

说到HTML5Q这是个好东西,是腐朽HTML的一ơ质的飞跃了Q但是但是,q东西能否NB取决于GOOGLE与APPLE的态度QAPPLE如何让他攑ּAPPSTORELHTML5q是件很隄事情Q更何况大力推HTML5是帮了GOOGLEq是帮自己都难说。往往业界大腕?#8220;支持”的事Q一般成不了Q因为各自都有自q算盘,但一家公司死命推的东西往往成功。就如同我在ADOBE愤青朋友潘说的Q应该吃里的看锅里的,对HTML5密切保持xQ当然FLASH的优势还q远不止q些Q后面我q有?/strong>

3?nbsp; WAPQSYMBIAN

不可否认QSYMBIAN江河日下Q但瘦死的骡子比马大q个道理大家都懂Q与WAP相同Q它们依然统领着国内甚至是v外相当大的一块市场,而这块市Z然有巨大的需求。WAP|游、SYMBIAN|游我个h的体会,依然很有p。另外,刚得到国家大力打d寨手机和走私芯片的情况,如果力度大的话加之SYMBIAN手机大幅降hQ相信对SYMBIANq_的国内装机量会有提升作用Q是不是回光q照׃好说了。WAP不用说了QQQ、斯凯这Lq_用户量简直是惊h的,没有了单机游戏,它们要玩点啥Q最后说一下,OVIq东西太烂了QNOKIA打算用这个拥׃联网Q呵?#8230;…不过q东西在中国本土化做的真不错Q完全SP模式化了QAPPLE 该感谢这些SPQ你们在中国参与毁掉了OVI。呵?#8230;…不说牢骚了。我只是觉得我曾l那么挚qQOQテQ今天这般天圎ͼ?#8230;…2000q我开始做SYMBIAN游戏了!NNDQ?/strong>

从厂商角度划?/strong>

1?nbsp; MTK斯凯的^?br style="word-wrap: break-word;" />

l过了计贏V预|等一pd事g之后Q斯凯的q_也{型了Q我觉得转型q是非常成功的,|游Q还是网游!因ؓ只有q样才能l箋赚钱Q只有这h能彻底抛弃小额付费,加强其^C势,_住用户。当然这个^台有其技术方面的不成熟,不可否认Q这是一个好q_有特色的q_。用h量的,而这些用L“饥”E度很不是一般。别误解我的意思,我是说对游戏的求,而不是对黄色游戏的求。如果斯凯短视到做这些,那这q_不做也Ş了,明明从一个用戯n上,可以一q赚?00块,千万不要让不良内容赚C100块就怺锅!Z么这个^台好Q从公布的数字来看,一个网游月收入过400万应该是块肉吧?众CP可以好好研究一下如何在上面开发有意思的|游产品Q别怕开发辛苦,哪有不辛苦赚来的钱呢Q让开发h员克服障,回报是可以保障的。这个^Cq去做单机时候的q_思想已经不同了,帮他们做q告Q有兴趣的直接联l他们?/strong>

2?nbsp; QQq_

QQq_q用说么Q但我说的不是单机游戏,我说的还是网游,QQC֌是个令h感觉恐怖的玩意QSNS 的FEEL 太可怕了Q对|游的推动是z水般的。剩下就看你的品怎麽样了Q我的徏议,差异性,别去想你跟谁关系好,谁关pdQ品烂、关pd好,上线了也完蛋Q关pM般,产品能赚钱,人家能不好好推么Q这是生意了。这与单机游戏讲排名是两回事QNq前Q我们在QQ上线了一Ƒ֤败的产品WAP|游天道Q不照样下线么!

3?nbsp; UCWEBq_

UCWEB游戏q_的端倪,大家应该已经看出来了些吧Q那是ZFLASHQ但l过我的技术分析,他的那个FLASH是假的,呵呵……Z么这么说呢,因ؓ不是ADOBE的FLASH PLAYERQ也对,要完全仿真出来一个FLASH PLAYER的解释环境,可真够难的。所以UCWEB只是部分仿真。他的技术实现方法有如针对WEB。通过服务器解释FLASH文gQ然后筛选后再发l客Lq行自己的解释?br style="word-wrap: break-word;" />

好歹我做q程序员Q技术我是半瓶子醋,但这我懂Q哈?#8230;…如果是这P服务器的消耗是巨大的。UCWEB是不可能允许用户随便讉KM的FLASHQ而由他承担服务器成本的。除非他傻,呵呵……那么q块肉,UCWEB要吃Q他会怎麽吃呢Q还是要与众CP分n了。他一定还是要让CP 自己架设服务器,然后他帮你推q,你的FLASH要针对他的浏览器做一些优化,{等{?#8230;…Q这事估计也不久q了。所以,我认为CP的FLASH布局要提上日E了?/strong>

4?nbsp; 日本手机SNS

DENAQMIXIQGREEq些公司d都很NBQ尤其是GREE说自׃开攑^収ͼ因ؓ无法保证产品品质Q今q呢Q所有的日本SNS手机q_都开放了Q咱国内有家叫热酷公司的阛_农场不就宣称自己在MIXIq_月收入过百万金么?是啊……q也是手机游戏,不是么?用FLASH LITE怎麽了?我看挺好Q但日本游戏咱做q,质量、翻译、策划要求都很高Q没思想准备Q一q半载你不下来Q但如果你磕下来呢?我们很多人的梦想不是是赚日本h的钱Q然后再L苍井IZQ哈?#8230;…太三八了。最后说一下,惌公司长治久安Q一定要开辟v外战场!Q政{趋紧,同志们要早做思想准备?/strong>

5?nbsp; FACEBOOK

不多_全球值钱的游戏公司,VC风头上的游戏公司无一不是在FACEBOOK上争天下了,Z说一句,他还是FLASH的游戏,q是|游Q?/strong>

你可以看出我对很多东西情有独钟,是这LQ如果你担心风险Q你犹UQ也没关p,你有好游戏想在IPHONE 或者FLASH上做Q我来买单,有天你自己摸明白了,自己q也成。M……开放你的思维Q别在一条船上歅R世界很大,赚钱的机会很多,写点东西我的A献吧……q些内容也是我在CGDC上要讲的主要内容Q乖乖,一个听课证要好几千Q虽然没q我兜,但总要有些q货才好了。我的Blog很有料的Q?/strong>



]]>
JUnit ?Android JUnit [转]http://m.tkk7.com/jelver/articles/334511.html都市淘沙?/dc:creator>都市淘沙?/author>Tue, 12 Oct 2010 01:27:00 GMThttp://m.tkk7.com/jelver/articles/334511.htmlhttp://m.tkk7.com/jelver/comments/334511.htmlhttp://m.tkk7.com/jelver/articles/334511.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/334511.htmlhttp://m.tkk7.com/jelver/services/trackbacks/334511.html阅读全文

]]>
socket, nio socket 及nio socket框架MINAȝ (?http://m.tkk7.com/jelver/articles/122358.html都市淘沙?/dc:creator>都市淘沙?/author>Wed, 06 Jun 2007 06:31:00 GMThttp://m.tkk7.com/jelver/articles/122358.htmlhttp://m.tkk7.com/jelver/comments/122358.htmlhttp://m.tkk7.com/jelver/articles/122358.html#Feedback1http://m.tkk7.com/jelver/comments/commentRss/122358.htmlhttp://m.tkk7.com/jelver/services/trackbacks/122358.htmlhttp://blog.csdn.net/lcllcl987/archive/2007/04/16/1566114.aspx
nio学习Q?br>最q花了点旉研究了一下nioQ及其开源框架MINAQ现把心得ȝ如下Q?br>1Q传lsocket:d式通信
每徏立一个Socketq接Ӟ同时创徏一个新U程对该Socketq行单独通信Q采用阻塞的方式通信Q?br>q种方式h很高的响应速度Qƈ且控制v来也很简单,在连接数较少的时候非常有效,但是如果
Ҏ一个连接都产生一个线E的无疑是对pȝ资源的一U浪费,如果q接数较多将会出现资源不的情况
example:
server code:

public class MultiUserServer extends Thread {
 private Socket client;
 
 public MultiUserServer(Socket c) {
  this.client = c;
 }

 public void run() {
  try {
   BufferedReader in = new BufferedReader(new InputStreamReader(client
     .getInputStream()));
   PrintWriter out = new PrintWriter(client.getOutputStream());
   // Mutil User but can't parallel
   while (true) {
    String str = in.readLine();
    System.out.println(str);
    SocketLog.debug("receive message: " + str);
    out.println("has receive....");
    out.flush();
    if (str.equals("end"))
     break;
   }
   client.close();
  } catch (IOException ex) {
  }
 }

 public static void main(String[] args) throws IOException {
  int port = 5678;
  if (args.length > 0)
   port = Integer.parseInt(args[0]);
  ServerSocket server = new ServerSocket(port);
  SocketLog.debug("the server socket application is created!");
  while (true) {
   // transfer location change Single User or Multi User
   MultiUserServer mu = new MultiUserServer(server.accept());
   mu.start();
  }
 }
}

client code:

public class Client {

 static Socket server;

 public static void main(String[] args) throws Exception {
  
  //set socket proxy.
  String proxyHost = "192.168.254.212";
  String proxyPort = "1080";
  System.getProperties().put("socksProxySet","true");
  System.getProperties().put("socksProxyHost",proxyHost);
  System.getProperties().put("socksProxyPort",proxyPort);
  
  String host = "132.201.69.80";
  int port = 13086;
  if (args.length > 1)
  {
   host = args[0];
   port = Integer.parseInt(args[1]);
  }
  System.out.println("connetioning:" + host + ":" + port);
  server = new Socket(host, port);
  BufferedReader in = new BufferedReader(new InputStreamReader(server
    .getInputStream()));
  PrintWriter out = new PrintWriter(server.getOutputStream());
  BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
  while (true) {
   String str = wt.readLine();
   out.println(str);
   out.flush();
   if (str.equals("end")) {
    break;
   }
   System.out.println(in.readLine());
  }
  server.close();
 }
}

2.nio:非阻塞通讯模式
Q.QNIO 设计背后的基矻I反应器模式,用于事g多\分离和分z体系l构模式?
反应器模式的核心功能如下Q?br>事件多路分?
事件分zֈ各自相应的事件处理程?

NIO 的非d I/O 机制是围l?选择器和 通道构徏的?Channel c表C服务器和客h之间?br>一U通信机制。Selector cL Channel 的多路复用器?Selector cd传入客户求多路分
用ƈ它们分zֈ各自的请求处理程序?br>通道(Channel c?Q表C服务器和客h之间的一U通信机制?
选择?Selectorc?Q是 Channel 的多路复用器。Selector cd传入的客hh多\分用q将它们
分派到各自的h处理E序?/p>

单的来说Q?/p>

NIO是一个基于事件的IO架构Q最基本的思想是Q有事g我通知你,你再d你的事情Q?br>而且NIO的主U程只有一个,不像传统的模型,需要多个线E以应对客户端请求,也减?br>了JVM的工作量?br>当Channel注册至Selector以后Q经典的调用Ҏ如下Q?/p>

        while (somecondition) {
            int n = selector.select(TIMEOUT);
            if (n == 0)
                continue;
            for (Iterator iter = selector.selectedKeys().iterator(); iter
                    .hasNext();) {
                if (key.isAcceptable())
                    doAcceptable(key);
                if (key.isConnectable())
                    doConnectable(key);
                if (key.isValid() && key.isReadable())
                    doReadable(key);
                if (key.isValid() && key.isWritable())
                    doWritable(key);
                iter.remove();
            }
        }
nio中取得事仉知Q就是在selector的select事g中完成的。在selector事g时有一个线E?br>向操作系l询问,selector中注册的Channel&&SelectionKey的键值对的各U事件是否有发生Q?br>如果有则d到selector的selectedKeys属性Set中去Qƈq回本次有多个感兴的事情发生?br>如果发现q个?gt;0Q表C有事g发生Q马上P代selectedKeys中的SelectionKeyQ?br>ҎKey中的表示的事Ӟ来做相应的处理?br>实际上,q段说明表明了异步socket的核心,卛_步socket不过是将多个socket的调度(或者还有他们的U程调度Q?br>全部交给操作pȝ自己d成,异步的核心SelectorQ不q是这些调度收集、分发而已?br>2.2 nio example:
server codeQ?/p>


public class NonBlockingServer
{
    public Selector sel = null;
    public ServerSocketChannel server = null;
    public SocketChannel socket = null;
    public int port = 4900;
    String result = null;


    public NonBlockingServer()
    {
  System.out.println("Inside default ctor");
    }
   
 public NonBlockingServer(int port)
    {
  System.out.println("Inside the other ctor");
  this.port = port;
    }

    public void initializeOperations() throws IOException,UnknownHostException
    {
  System.out.println("Inside initialization");
  sel = Selector.open();
  server = ServerSocketChannel.open();
  server.configureBlocking(false);
  InetAddress ia = InetAddress.getLocalHost();
  InetSocketAddress isa = new InetSocketAddress(ia,port);
  server.socket().bind(isa);
    }
   
 public void startServer() throws IOException
    {
  System.out.println("Inside startserver");
        initializeOperations();
  System.out.println("Abt to block on select()");
  SelectionKey acceptKey = server.register(sel, SelectionKey.OP_ACCEPT ); 
 
  while (acceptKey.selector().select() > 0 )
  { 
    
   Set readyKeys = sel.selectedKeys();
   Iterator it = readyKeys.iterator();

   while (it.hasNext()) {
    SelectionKey key = (SelectionKey)it.next();
    it.remove();
               
    if (key.isAcceptable()) {
     System.out.println("Key is Acceptable");
     ServerSocketChannel ssc = (ServerSocketChannel) key.channel();
     socket = (SocketChannel) ssc.accept();
     socket.configureBlocking(false);
     SelectionKey another = socket.register(sel,SelectionKey.OP_READ|SelectionKey.OP_WRITE);
    }
    if (key.isReadable()) {
     System.out.println("Key is readable");
     String ret = readMessage(key);
     if (ret.length() > 0) {
      writeMessage(socket,ret);
     }
    }
    if (key.isWritable()) {
     System.out.println("THe key is writable");
     String ret = readMessage(key);
     socket = (SocketChannel)key.channel();
     if (result.length() > 0 ) {
      writeMessage(socket,ret);
     }
    }
   }
  }
    }

    public void writeMessage(SocketChannel socket,String ret)
    {
  System.out.println("Inside the loop");

  if (ret.equals("quit") || ret.equals("shutdown")) {
   return;
  }
  try
  {

   String s = "This is context from server!-----------------------------------------";
   Charset set = Charset.forName("us-ascii");
   CharsetDecoder dec = set.newDecoder();
   CharBuffer charBuf = dec.decode(ByteBuffer.wrap(s.getBytes()));
   System.out.println(charBuf.toString());
   int nBytes = socket.write(ByteBuffer.wrap((charBuf.toString()).getBytes()));
   System.out.println("nBytes = "+nBytes);
    result = null;
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }

    }
 
    public String readMessage(SelectionKey key)
    {
  int nBytes = 0;
  socket = (SocketChannel)key.channel();
        ByteBuffer buf = ByteBuffer.allocate(1024);
  try
  {
            nBytes = socket.read(buf);
   buf.flip();
   Charset charset = Charset.forName("us-ascii");
   CharsetDecoder decoder = charset.newDecoder();
   CharBuffer charBuffer = decoder.decode(buf);
   result = charBuffer.toString();
    
        }
  catch(IOException e)
  {
   e.printStackTrace();
  }
  return result;
    }

    public static void main(String args[])
    {
     NonBlockingServer nb;
     if (args.length < 1)
     {
      nb = new NonBlockingServer();
     }
     else
     {
      int port = Integer.parseInt(args[0]);
      nb = new NonBlockingServer(port);
     }
  
  try
  {
   nb.startServer();
   System.out.println("the nonBlocking server is started!");
  }
  catch (IOException e)
  {
   e.printStackTrace();
   System.exit(-1);
  }
  
 }
}

client code:

public class Client {
 public SocketChannel client = null;

 public InetSocketAddress isa = null;

 public RecvThread rt = null;

 private String host;

 private int port;

 public Client(String host, int port) {
  this.host = host;
  this.port = port;
 }

 public void makeConnection() {
  String proxyHost = "192.168.254.212";
  String proxyPort = "1080";
  System.getProperties().put("socksProxySet", "true");
  System.getProperties().put("socksProxyHost", proxyHost);
  System.getProperties().put("socksProxyPort", proxyPort);

  int result = 0;
  try {
   client = SocketChannel.open();
   isa = new InetSocketAddress(host, port);
   client.connect(isa);
   client.configureBlocking(false);
   receiveMessage();
  } catch (UnknownHostException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  long begin = System.currentTimeMillis();

  sendMessage();

  long end = System.currentTimeMillis();
  long userTime = end - begin;
  System.out.println("use tiem: " + userTime);
  try {
   interruptThread();
   client.close();
   System.exit(0);
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 public int sendMessage() {
    System.out.println("Inside SendMessage");
  String msg = null;
  ByteBuffer bytebuf;
  int nBytes = 0;
  try {
   msg = "It's message from client!";
   System.out.println("msg is "+msg);
   bytebuf = ByteBuffer.wrap(msg.getBytes());
   for (int i = 0; i < 1000; i++) {
    nBytes = client.write(bytebuf);
    System.out.println(i + " finished");
   }
   interruptThread();
   try {
    Thread.sleep(5000);
   } catch (Exception e) {
    e.printStackTrace();
   }
   client.close();
   return -1;

  } catch (IOException e) {
   e.printStackTrace();
  }

  return nBytes;

 }

 public void receiveMessage() {
  rt = new RecvThread("Receive THread", client);
  rt.start();

 }

 public void interruptThread() {
  rt.val = false;
 }

 public static void main(String args[]) {
  if (args.length < 2) {
   System.err.println("You should put 2 args: host,port");
  } else {
   String host = args[0];
   int port = Integer.parseInt(args[1]);
   Client cl = new Client(host, port);
   cl.makeConnection();
  }
  BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
  String msg;

 }

 public class RecvThread extends Thread {
  public SocketChannel sc = null;

  public boolean val = true;

  public RecvThread(String str, SocketChannel client) {
   super(str);
   sc = client;
  }

  public void run() {
   int nBytes = 0;
   ByteBuffer buf = ByteBuffer.allocate(2048);
   try {
    while (val) {
     while ((nBytes = nBytes = client.read(buf)) > 0) {
      buf.flip();
      Charset charset = Charset.forName("us-ascii");
      CharsetDecoder decoder = charset.newDecoder();
      CharBuffer charBuffer = decoder.decode(buf);
      String result = charBuffer.toString();
      System.out.println("the server return: " + result);
      buf.flip();

     }
    }

   } catch (IOException e) {
    e.printStackTrace();

   }

  }
 }
}
3QSocket|络框架 MINA
MINA是一个网l应用框Ӟ在不牺牲性能和可扩展性的前提下用于解军_下问题:
1Q快速开发自q英勇?br>2Q高可维护性,高可复用性:|络I/O~码Q消息的~?解码Q业务逻辑互相分离?br>3Q相对容易的q行单元试?/p>

 

3.1 IoFiltersQ?br>IoFilter为MINA的功能扩展提供了接口。它拦截所有的IO事gq行事g的预处理和后处理(AOP)。我们可以把它想象成
Servlet的filters?br>IoFilter能够实现以下几种目的Q?br>事g日志
性能?br>数据转换(e.g. SSL support)Qcodec
防火?#8230;{等

3.2 codec: ProtocolCodecFactory
MINA提供了方便的Protocol支持。如上说Ԍcodec在IoFilters中设|?br>通过它的Encoder和DecoderQ可以方便的扩展q支持各U基于Socket的网l协议,比如HTTP服务器、FTP服务器、Telnet服务器等{?/p>

要实现自q~码/解码?codec)只需要实现interface: ProtocolCodecFactory卛_.
在MINA 1.0版本QMINA已经实现了几个常用的(codec factory):

DemuxingProtocolCodecFactory,
NettyCodecFactory,
ObjectSerializationCodecFactory,
TextLineCodecFactory
 
其中Q?br>TextLineCodecFactory:
 A ProtocolCodecFactory that performs encoding and decoding between a text line data and a Java
 string object. This codec is useful especially when you work with a text-based protocols such as SMTP and IMAP.

ObjectSerializationCodecFactory:
A ProtocolCodecFactory that serializes and deserializes Java objects. This codec is very useful when
you have to prototype your application rapidly without any specific codec.

DemuxingProtocolCodecFactoryQ?br>A composite ProtocolCodecFactory that consists of multiple MessageEncoders and MessageDecoders. ProtocolEncoder
and ProtocolDecoder this factory returns demultiplex incoming messages and buffers to appropriate MessageEncoders
and MessageDecoders.

NettyCodecFactory:
A MINA ProtocolCodecFactory that provides encoder and decoder for Netty2 Messages and MessageRecognizers.

3.3 business logic: IoHandler

MINA中,所有的业务逻辑都有实现了IoHandler的class完成
interfaceHandles:
 all protocol events fired by MINA. There are 6 event handler methods, and they are all invoked by MINA automatically.
 当事件发生时Q将触发IoHandler中的Ҏ:
 sessionCreated, sessionOpened, sessionClosed, sessionIdle, exceptionCaught, messageReceived, messageSent
MINA 1.O中,IoHandler的实现类Q?br>ChainedIoHandler, DemuxingIoHandler, IoHandlerAdapter, SingleSessionIoHandlerDelegate, StreamIoHandler
具体l节可参考javadoc?/p>

3.4   MINA的高U主题:U程模式
MINA通过它灵zȝfilter机制来提供多U线E模型?br>没有U程池过滤器被用时MINAq行在一个单U程模式?br>如果d了一个IoThreadPoolFilter到IoAcceptorQ将得到一个leader-follower模式的线E池?br>如果再添加一个ProtocolThreadPoolFilterQserver有两个U程池;
一?IoThreadPoolFilter)被用于对message对象q行转换Q另外一?ProtocolThreadPoolFilter)被用于处理业务逻辑?
SimpleServiceRegistry加上IoThreadPoolFilter和ProtocolThreadPoolFilter的缺省实现即可适用于需
要高伸羃性的应用。如果想使用自己的线E模型,请参考SimpleServiceRegistry的源代码Qƈ且自?/p>

初始化Acceptor?/p>

IoThreadPoolFilter threadPool = new IoThreadPoolFilter();threadPool.start();
IoAcceptor acceptor = new SocketAcceptor();
acceptor.getFilterChain().addLast( "threadPool", threadPool);
ProtocolThreadPoolFilter threadPool2 = new ProtocolThreadPoolFilter();
threadPool2.start();
ProtocolAcceptor acceptor2 = new IoProtocolAcceptor( acceptor );
acceptor2.getFilterChain().addLast( "threadPool", threadPool2 );
...
threadPool2.stop();
threadPool.stop();


采用MINAq行socket开发,一般步骤如下:
1Q?br>server:
IoAcceptor acceptor = new SocketAcceptor(); //建立client接收?br>or client:
SocketConnector connector = new SocketConnector();  //建立一个连接器
2Qserver的属性配|:
        SocketAcceptorConfig cfg = new SocketAcceptorConfig();
        cfg.setReuseAddress(true);
        cfg.getFilterChain().addLast(
                    "codec",
                    new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) ); //对象序列?codec factory
        cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
3Q绑定address和business logic
server:
        acceptor.bind(
                new InetSocketAddress( SERVER_PORT ),
                new ServerSessionHandler( ), cfg ); // l定address和handler

client:
        connector.connect(new InetSocketAddress( HOSTNAME, PORT ),
                        new ClientSessionHandler(msg), cfg );

下面的这个简单的example演示client和server传递object的过E:
Message.java
public class Message implements Serializable {

    private int type;
    private int status;
    private String msgBody;
   
    public Message(int type, int status, String msgBody)
    {
        this.type = type;
        this.status = status;
        this.msgBody = msgBody;
    }

    public String getMsgBody() {
        return msgBody;
    }

    public void setMsgBody(String msgBody) {
        this.msgBody = msgBody;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }
}

Client.java
public class Client
{
    private static final String HOSTNAME = "localhost";
    private static final int PORT = 8080;
    private static final int CONNECT_TIMEOUT = 30; // seconds


    public static void main( String[] args ) throws Throwable
    {
        SocketConnector connector = new SocketConnector();       
        // Configure the service.
        SocketConnectorConfig cfg = new SocketConnectorConfig();
        cfg.setConnectTimeout( CONNECT_TIMEOUT );
          cfg.getFilterChain().addLast(
                    "codec",
                    new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );

        cfg.getFilterChain().addLast( "logger", new LoggingFilter() );
       
        IoSession session;
        Message msg = new Message(0,1,"hello");
        connector.connect(new InetSocketAddress( HOSTNAME, PORT ),
                        new ClientSessionHandler(msg), cfg );

    }
}

ClientSessionHandler.java
public class ClientSessionHandler extends IoHandlerAdapter
{
    private Object msg;
   
    public ClientSessionHandler(Object msg)
    {
        this.msg = msg;
    }


    public void sessionOpened( IoSession session )
    {
        session.write(this.msg);
    }

    public void messageReceived( IoSession session, Object message )
    {
        System.out.println("in messageReceived!");
        Message rm = (Message ) message;       
        SessionLog.debug(session, rm.getMsgBody());
        System.out.println("message is: " + rm.getMsgBody());
        session.write(rm);
    }

    public void exceptionCaught( IoSession session, Throwable cause )
    {
        session.close();
    }
}

Server.java
public class Server
{
    private static final int SERVER_PORT = 8080;

    public static void main( String[] args ) throws Throwable
    {
        IoAcceptor acceptor = new SocketAcceptor();
       
        // Prepare the service configuration.
        SocketAcceptorConfig cfg = new SocketAcceptorConfig();
        cfg.setReuseAddress( true );

        cfg.getFilterChain().addLast(
                    "codec",
                    new ProtocolCodecFilter( new ObjectSerializationCodecFactory() ) );
        cfg.getFilterChain().addLast( "logger", new LoggingFilter() );

        acceptor.bind(
                new InetSocketAddress( SERVER_PORT ),
                new ServerSessionHandler( ), cfg );

        System.out.println( "The server Listening on port " + SERVER_PORT );
    }
}

ServerSessionHandler.java
public class ServerSessionHandler extends IoHandlerAdapter
{
    public void sessionOpened( IoSession session )
    {
        // set idle time to 60 seconds
        session.setIdleTime( IdleStatus.BOTH_IDLE, 60 );
        session.setAttribute("times",new Integer(0));
    }

    public void messageReceived( IoSession session, Object message )
    {
        System.out.println("in messageReceived");
        int times = ((Integer)(session.getAttribute("times"))).intValue();
        System.out.println("tiems = " + times);
        // communicate 30 times,then close the session.
        if (times < 30)
        {
            times++;
            session.setAttribute("times", new Integer(times));          
         Message msg;
         msg = (Message) message;
         msg.setMsgBody("in server side: " + msg.getMsgBody()); 
         System.out.println("begin send msg: " + msg.getMsgBody());
         session.write(msg);
        }
        else
        {
            session.close();
        }
    }

    public void sessionIdle( IoSession session, IdleStatus status )
    {
        SessionLog.info( session, "Disconnecting the idle." );
        // disconnect an idle client
        session.close();
    }

    public void exceptionCaught( IoSession session, Throwable cause )
    {
        // close the connection on exceptional situation
        session.close();
    }
}
MINA自己附带的Demo已经很好的说明了它的q用?br>值得一提的是它的SumUpQ客L发送几个数字,服务端求和后q返回结果。这个简单的E序演示了如何自己实现CODEC?/p>

补充提示Q?br>下蝲q运行MINA的demoE序q颇非周?
q行MINA demo appli擦tionQ?br>1:在JDK5
产生错误:
Exception in thread "main" java.lang.NoClassDefFoundError: edu/emory/mathcs/backport/java/util/concurrent/Executor
 at org.apache.mina.example.reverser.Main.main(Main.java:44)
 
察看mina的QA email:
http://www.mail-archive.com/mina-dev@directory.apache.org/msg02252.html

原来需要下?backport-util-concurrent.jarq加入classpath
http://dcl.mathcs.emory.edu/util/backport-util-concurrent/

l箋q行q是报错:
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

原来MINA采用了slf4j目作ؓlogQl下?br>slf4j-simple.jar{,q加入classpath:
http://www.slf4j.org/download.html



]]>
վ֩ģ壺 ƷһëƬ| ޾ƷƵѹۿ| 18Ůˬˬˬҹվ| AV鶹| Ļ| ձ޳ɸһ| 鶹Ʒѿ| þþþ޾ƷŮ| 99ƷһƵ| ޾ƷĻ| þҹƵ| AV㽶һ| СƵ߹ۿ| jizzѹۿ| ޳ߵӰ| պϵ| | ֻˬִַ̼ | AvרDVD| þùӾƷŮ| þþþ޾Ʒվ| Ʒþþþþþþ| һҺ| ѱ̬Ƶַվ| һëƬڲ| СƵ߹ۿ| ŮоƷƵվ| ڵƵѲ| þþþavëƬ| 7x7x7x߹ۿ| þþ޾ҺҺҺ| ŷ͵Ʒ | þþþù| avƬ߹ۿ| þþ޾Ʒ| ߹ۿѾƷ| avһ| պĻۺ| þþþþ޾Ʒ| ˳˵Ӱ| ѿƬ߹ۿ|