[hessdroid]Android下使用Hessian与Java服务端通讯的传值测试


前言

  至此hessian与Java服务端通讯全部测试完成,主要是传值方面的测试,包括中文字符、VO对象、HashMap、List<String>和String[]的双向传值测试。

 

声明

  欢迎转载,但请保留文章原始出处:)

    博客园:http://www.cnblogs.com

    农民伯伯: http://www.cnblogs.com/over140/ 

 

正文

  关于Hessian以及hessdroid请参考本博文章:[hessdroid]Android下使用Hessian与Java服务端通讯(http://www.cnblogs.com/over140/archive/2010/07/30/1788563.html)。

  一、测试结果截图

    1.1  服务端控制台输出截图

    

    1.2  客户端 测试对象传出 截图

    

 

  二、通讯接口

    2.1  BasicAPI

public interface BasicAPI {
    
/*
     * 
     
*/
    
public String hello();
    
    
/*
     * 测试中文字符
     
*/
    
public String TestChinese(String str);
    
    
/*
     * 测试对象传入
     
*/
    
public void TestObject(TestVO vo);
    
    
/*
     * 测试对象传出
     
*/
    
public TestVO TestObject();
    
    
/*
     * 测试HashMap
     
*/
    
public HashMap TestHashMap(HashMap map);
    
    
/*
     * 测试数组
     
*/
    
public String[] TestArray(String[] strArray);
    
    
/*
     * 测试泛型
     
*/
    
public List<String> TestList(List<String> list);
    
}

    2.2  TestVO

public class TestVO implements Serializable {
    
public int Id;
    
public String Title;
    
public String Content;
}

 

  三、服务端(Java Web Server)

public class BasicService  extends HessianServlet implements BasicAPI {

     
/**
     * 
     
*/
    
private static final long serialVersionUID = -8301199876420831947L;
    
private String _greeting = "Hello, world";

      
public void setGreeting(String greeting)
      {
        _greeting 
= greeting;
      }

      
public String hello()
      {
        
return _greeting;
      }

    
/*
     * 测试中文传输
     * @see com.BasicAPI#TestChinese(java.lang.String)
     
*/
    @Override
    
public String TestChinese(String str) {
        System.out.println(
"TestChinese:"+str);
        
return "欢迎来到服务端!";
    }

    
/*
     * 测试HashMap
     * @see com.BasicAPI#TestHashMap(java.util.HashMap)
     
*/
    @Override
    
public HashMap TestHashMap(HashMap map) {
        System.out.println(
"TestHashMap:"+map.get("abc"));
        map.put(
"result""ok");
        
return map;
    }

    
/*
     * 测试TestObject传入
     * @see com.BasicAPI#TestObject(com.TestVO)
     
*/
    @Override
    
public void TestObject(TestVO vo) {
        System.out.println(
"TestObjectEx:"+vo.Id);
    }

    
/*
     * 测试TestObject传出
     * @see com.BasicAPI#TestObject()
     
*/
    @Override
    
public TestVO TestObject() {
        System.out.println(
"TestObjectEx Return TestVO");
        TestVO vo 
= new TestVO();
        vo.Id 
= 1;
        vo.Title 
= "title";
        vo.Content 
= "Content";
        
return vo;
    }

    
/*
     * 测试List<String>
     * @see com.BasicAPI#TestList(java.util.List)
     
*/
    @Override
    
public List<String> TestList(List<String> list) {
        System.out.println(
"TestList:"+list.get(0));
        list.add(
"addOne");
        
return list;
    }

    
/*
     * 测试String[]
     * @see com.BasicAPI#TestArray(java.lang.String[])
     
*/
    @Override
    
public String[] TestArray(String[] strArray) {
        System.out.println(
"TestArray:"+strArray[0]);
        strArray[
0= "Change Form Server";
        
return strArray;
    }

}

    代码说明:

      a).  关于服务端的配置请参照上篇文章:http://www.cnblogs.com/over140/archive/2010/07/30/1788563.html。

 

  四、客户端(Android)

        String url = "http://192.168.1.1:8080/HessianServer/hello.do";
        HessianProxyFactory factory 
= new HessianProxyFactory();
        
try {
            factory.setDebug(
true);
            factory.setReadTimeout(
1000);
            BasicAPI basic 
= (BasicAPI)factory.create(BasicAPI.class, url,getClassLoader());
            
//Hello World
            
//Toast.makeText(this, "调用结果:"+basic.hello(), Toast.LENGTH_LONG).show();
            
            
//测试中文字符传输
//            Toast.makeText(this, "测试中文字符:"+basic.TestChinese("中文字符!"), Toast.LENGTH_LONG).show();
            
            
//测试对象传入
//            TestVO vo = new TestVO();
//            vo.Id= 1;
//            factory.setOverloadEnabled(true);
//            basic.TestObject(vo);
            
            
//测试对象传出
            factory.setHessian2Reply(false);
            TestVO vo 
= basic.TestObject();
            Toast.makeText(
this"TestObject:"+vo.Title, Toast.LENGTH_LONG).show();
            
            
//测试List泛型
//            List<String> list = new ArrayList<String>() ;
//            list.add("1个元素");
//            factory.setHessian2Reply(false);
//            list = basic.TestList(list);
//            Toast.makeText(this, "TestObject:"+list.size(), Toast.LENGTH_LONG).show();
            
            
//测试Hashmap
//            HashMap map = new HashMap();
//            map.put("abc", "123");
//            map = basic.TestHashMap(map);
//            Toast.makeText(this, "result:"+map.get("result"), Toast.LENGTH_LONG).show();
            
            
//测试数组
//            String[] strArray = new String[]{"Send To Server"};
//            factory.setHessian2Reply(false);
//            strArray = basic.TestArray(strArray);
//            Toast.makeText(this, "TestArray:"+strArray[0], Toast.LENGTH_LONG).show();

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

    代码说明:

      a).  客户端的文章也请参照上篇文章。

      b).  这里就在一个函数里面测试的,分别解注测试即可,这里例子全部测试通过。

      c).  需要特别注意String[]、List<String>以及TestVO的传出,需要加上"factory.setHessian2Reply(false);"这行代码,否则Android客户端传入到Java服务端没有问题,但是服务端返回客户端就报错,诸如0x75之类的错误。

      d).  另外如果有函数重载的话需要设置"factory.setOverloadEnabled(true);"。这里TestObject()这个地方并没有设置,也能调用成功,但是TestObject(TestVO vo)就必须设置了,这里猜想是不是有默认行为。

 

维护

  2011-1-8

    在数据量较多的情况下(上百上千条)使用二维字符串数组效率较高,对象数组、XML串、JSON效率都较低,注意部署时把“factory.setDebug(true);”去掉或设置为false!

  2011-5-20

    在调试的情况下,如果上传的数据量较大(超过100条)可能引发异常,但是去掉调试又能正常运行,找不到原因,所以建议调试的时候把上传的数据量改小,分批上传,发布的时候可以改大。


结束

   本来以为可以很快结束测试,结果卡客户端代码说明c里面的问题了,也是从错误中reply中猜测出来,这个错误还是我把服务端hessian从3.0.20换到最新的4.0.7才显示出来,不过现在解决了,又切换回老版本的了 :)

posted @ 2010-08-04 14:58 农民伯伯 阅读(...) 评论(...) 编辑 收藏