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

 更新时间:2020年6月25日 11:34  点击:1748

本文实例讲述了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函数内部实现不一致导致的,具体原因不明。

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

[!--infotagslink--]

相关文章

  • Java实现经典游戏复杂迷宫

    这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
  • C#实现简单的登录界面

    我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
  • 浅谈C# 字段和属性

    这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
  • C#中截取字符串的的基本方法详解

    这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
  • java 运行报错has been compiled by a more recent version of the Java Runtime

    java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • C#实现简单的Http请求实例

    这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
  • C#中new的几种用法详解

    本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
  • 使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)

    这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • 在java中获取List集合中最大的日期时间操作

    这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • C#和JavaScript实现交互的方法

    最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 轻松学习C#的基础入门

    轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
  • C#变量命名规则小结

    本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
  • c#中(&&,||)与(&,|)的区别详解

    这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
  • C# 中如何取绝对值函数

    本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
  • C#绘制曲线图的方法

    这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25