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

 

测试代码:HessianTest.rar

 

作者: 阿凡卢
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/p/3969982.html
相关文章
|
10天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
6月前
|
安全 Java 调度
Java多线程编程的默契对话:线程通信的艺术
Java多线程编程的默契对话:线程通信的艺术
38 0
|
7月前
|
网络协议 Java
Java TCP通信详解
TCP(Transmission Control Protocol)是一种面向连接的、可靠的网络传输协议,它提供了端到端的数据传输和可靠性保证。TCP通信适用于对数据传输的可靠性和完整性要求较高的场景,如文件传输、网页浏览等。本文将详细介绍Java中如何使用TCP协议进行网络通信,包括TCP套接字、服务器和客户端的创建、数据传输等。
129 0
|
7月前
|
Java
Java的Socket进行通信
下面是一个使用Java的Socket进行通信的简单示例
|
7月前
|
缓存 Dubbo Java
Java面试题顶级理解!Dubbo注册中心挂了,服务还可以继续通信吗?
什么情况?一位工作了 5 年的 Java 程序员,竟然回答不出这个问题?说“Dubbo注册中心挂了, 服务之间还可以继续通信吗”?今天,我话2分钟时间给大家来聊一聊。
190 0
|
2月前
|
并行计算 Java API
深入理解Java多线程编程:创建、状态管理、同步与通信
深入理解Java多线程编程:创建、状态管理、同步与通信
|
7月前
|
网络协议 Java
Java UDP通信详解
UDP(User Datagram Protocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。
128 0
|
8月前
|
网络协议 Java
Java实现TCP通信的文件上传 之 代码优化开启多线程
Java实现TCP通信的文件上传 之 代码优化开启多线程
|
4月前
|
网络协议 安全 Java
Java网络编程入门指南:TCP/IP协议与Socket通信
Java网络编程入门指南:TCP/IP协议与Socket通信
55 1
|
9月前
|
网络协议 Java
【JavaSE】Java基础语法(四十一):TCP通信程序
1. TCP发送数据 Java中的TCP通信 Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。 Java为客户端提供了Socket类,为服务器端提供了ServerSocket类