当前位置: 移动技术网 > IT编程>开发语言>c# > java和c#使用hessian通信的方法

java和c#使用hessian通信的方法

2019年07月18日  | 移动技术网IT编程  | 我要评论

本文实例讲述了java和c#使用hessian通信的方法,是非常实用的技巧。分享给大家供大家参考。具体分析如下:

首先,hessian主页为:http://hessian.caucho.com/

下面通过一个简单的例子学习hessian服务:服务端为java,客户端为c#。

先要准备好c#和java的第三方类库,下载地址:http://hessian.caucho.com/

下载 hssiancharp.dll及hessian-4.0.37.jar

hessian服务端(java):

打开eclipse创建一个dynamic web project,将hessian-4.0.37.jar放到lib下,大概如图所示:

创建一个通信接口ihello:

package hessian.test.server;
import java.util.arraylist;
public interface ihello {
  string sayhello(string msg);  
  void sayhello2(int bean);
  void print(string msg); 
  hellobean getdata(hellobean bean);
  arraylist<hellobean> getbeanlist();
  complexdata getcomplexdata();
  
}

ihello接口的一个实现:helloimpl.java

package hessian.test.server;
import java.util.arraylist;
public class helloimpl implements ihello{
  public string sayhello(string msg){
    return "hello " + msg;
  }
  public void sayhello2(int bean){
    system.out.println("hello " + bean);
  }
  public void print(string msg){
    system.out.println(msg);
  }
  public hellobean getdata(hellobean bean){
    hellobean result = new hellobean();
    result.setname("lu xiaoxun a new name");
    result.setage(26);
    system.out.print(bean.getname());
    return result;
  }
  public arraylist<hellobean> getbeanlist(){
    arraylist<hellobean> beans = new arraylist<hellobean>();
    
    hellobean b1 = new hellobean();
    b1.setname("lu1");
    b1.setage(26);
    beans.add(b1);
    
    hellobean b2 = new hellobean();
    b2.setname("lu2");
    b2.setage(27);
    beans.add(b2);
    
    return beans;
  }
  public complexdata getcomplexdata(){
    complexdata data = new complexdata();
    arraylist<hellobean> beans = getbeanlist();
    data.setdata(beans, beans.size());
    return data;
  }
}

定义用来进行数据传输的类,两个类都必须实现serializable接口:

hellobean.java

package hessian.test.server;
import java.io.serializable;
public class hellobean implements serializable {
  private static final long serialversionuid = 570423789882653763l;
  private string name;
  private int age;
  public string getname() {
    return name;
  }
  public void setname(string name) {
    this.name = name;
  }
  public int getage(){
    return age;
  }
  public void setage(int age){
    this.age = age;
  }
}

complexdata.java

package hessian.test.server;
import java.io.serializable;
import java.util.arraylist;
import java.util.hashmap;
import java.util.map;

public class complexdata implements serializable{
  private static final long serialversionuid = 1l;
  private arraylist<hellobean> hellobeans;
  //private map<string, hellobean> hellobeanmap;
  private int number;
  public int getnumber(){
    return number;
  }
  public arraylist<hellobean> gethellobeans(){
    return hellobeans;
  }
  public void setdata(arraylist<hellobean> beans, int num){
    this.number = num;
    this.hellobeans = beans;
//    hellobeanmap = new hashmap<string, hellobean>();
//    for (hellobean hellobean : beans) {
//      if(!hellobeanmap.containskey(hellobean.getname()))
//      {
//        hellobeanmap.put(hellobean.getname(), hellobean);
//      }
//    }
  }
}

web.xml内容:

<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee" 
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemalocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="webapp_id" version="3.0">
  <display-name>hessian server</display-name>
  <servlet>
    <servlet-name>hessian</servlet-name>
    <servlet-class>com.caucho.hessian.server.hessianservlet</servlet-class>
    <init-param>
      <param-name>service-class</param-name>
      <param-value>hessian.test.server.helloimpl</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>hessian</servlet-name>
    <url-pattern>/hessian</url-pattern>
  </servlet-mapping>
</web-app>

hessian客户端(c#):

定义一个与服务端对应的ihello接口:ihello.cs

  public interface ihello
  {
    string sayhello(string msg);
    void sayhello2(int bean);
    void print(string msg);
    hellobean getdata(hellobean bean);
    hellobean[] getbeanlist();
    complexdata getcomplexdata();
  }

定义与服务器端一致的的通信数据类:

hellobean.cs:

using system;
using system.collections.generic;
using system.linq;
using system.text;

namespace hessian.test.server
{
  public class hellobean
  {
    public string name 
    {
      set { name = value; }
      get { return name; }
    }

    private string name; //类型和名称需要和服务器端一致

    public int age
    {
      set { age = value; }
      get { return age; }
    }

    private int age; //类型和名称需要和服务器端一致

    public override string tostring()
    {
      return "name: "+ name + " age: " + age;
    }

  }
}

complexdata.cs:

using system;
using system.collections.generic;
using system.linq;
using system.text;

namespace hessian.test.server
{
  public class complexdata
  {
    private hellobean[] hellobeans;

    //private dictionary<string, hellobean> hellobeanmap;

    private int number;

    public int getnumber()
    {
      return number;
    }

    public hellobean[] getbeans()
    {
      return hellobeans;
    }

    //public dictionary<string, hellobean> getbeansdic()
    //{
    //  return hellobeanmap;
    //}
  }
}

在主项目中添加hessiancsharp.dll引用。

测试代码:

using system;
using system.collections.generic;
using system.linq;
using system.text;

using hessiancsharp.client;
using hessian.test.server;

namespace hessianclienttest
{
  class program
  {
    static void main(string[] args)
    {
      string url = @"http://localhost:8080/hessianservertest/hessian";
      chessianproxyfactory factory = new chessianproxyfactory();

      ihello test = (ihello)factory.create(typeof(ihello), url);

      //test function
      console.writeline(test.sayhello("lu"));  //打印从服务器端获取的字符串
      test.sayhello2(12);            //在服务器端控制台打印 "hello 12"  
      test.print("hessian");          //在服务器端控制台打印 "hessian" 

      //test object
      hellobean bean = new hellobean();
      //bean.setname("lu xiaoxun");
      bean.name = "luxiaoxun";
      hellobean result = test.getdata(bean);
      console.writeline(result.name);
      console.writeline(result.age);
      console.writeline(result);

      //test object array
      hellobean[] beans = test.getbeanlist();
      if (beans != null)
      {
        foreach (hellobean data in beans)
        {
          console.writeline(data.tostring());
        }
      }

      //test complex data
      complexdata complexdata = test.getcomplexdata();
      if (complexdata != null)
      {
        console.writeline("array number: " + complexdata.getnumber());

        hellobean[] comarray = complexdata.getbeans();
        if (comarray != null)
        {
          foreach (hellobean data in comarray)
          {
            console.writeline(data.tostring());
          }
        }

        //dictionary<string, hellobean> hellobeanmap = complexdata.getbeansdic();
        //if (hellobeanmap != null)
        //{
        //  foreach (string key in hellobeanmap.keys)
        //  {
        //    console.writeline(hellobeanmap[key].gethellobeaninfo());
        //  }
        //}
      }

      console.readkey();
    }
  }
}

测试结果如下图所示:

注意事项:

1、服务端和客户端用于数据传递的对象的命名空间要一致

ihello接口所在命名空间服务端和客户端可以不一致,但是ihello中用到的hellobean和complexdata在java服务端和c#客户端中两个hellobean类所在的命名空间要一致。

2、类的字段要一致

用于数据传输的类的字段名和字段类型要一致(修饰类型可以不一致)。

3、服务端的类要序列化

4、尽量使用基本的数据类型
从上面的测试可以看出,传递基本的类型没有问题,传递普通的类对象没有问题,传递arraylist的时候也没有问题(c#客户端使用array数组),但是传递hashmap字典的时候会有问题,c#这边使用dictionary没法对应一致,可能是由于hash函数内部实现不一致导致的,具体原因不明。

感兴趣的朋友可以测试一下本文实例,源码点击此处。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网