Hessian示例:Java和C#通信


一個簡單的利用Hessian在Java和C#之間通信的例子,服務端為Java,客戶端為C#。

資源下載

先要准備好C#和Java的第三方類庫:http://hessian.caucho.com/

Hssiancharp.dll

hessian-4.0.37.jar

 

Hessian服務端

打開eclipse創建一個Dynamic Web Project,將hessian-4.0.37.jar放到lib下,大概如圖所示:

創建一個接口:Hello.java

package hessian.test.server;

import hessian.test.client.HelloBean;

public interface Hello {
    public String sayHello(String smt);   
    public void printHello(String smt);  
    public void sayHello2(int bean);
    public HelloBean sayHello3(HelloBean bean);
}

Hello接口的一個實現:HelloImpl.java

package hessian.test.server;

import hessian.test.client.HelloBean;

public class HelloImpl implements Hello {
    public String sayHello(String smt) {
        return smt != null ? "hello " + smt : "hello hessian";
    }

    public void printHello(String smt) {
        System.out.println("Hello " + smt);
    }

    //不能有重載
    public void sayHello2(int bean) {
        System.out.println(bean);
    }

    public HelloBean sayHello3(HelloBean bean) {
        HelloBean result=new HelloBean();
        result.setName("cyy");
        
        System.out.print(bean.getName());
        return result;
    }
}

一個Java Bean:HelloBean.java

package hessian.test.client;

import java.io.Serializable;

//該類必須實現Serializable接口,能進行序列化。
public class HelloBean implements Serializable{
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

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客戶端

打開Visual Studio創建一個C#控制台程序,引用Hessiancharp.dll,大概如圖所示:

定義一個與服務端對應Hello接口:Hello.cs

using System;

namespace hessian.test.client
{
    interface Hello
    {
        string sayHello(string smt);
        void printHello(string smt);
        void sayHello2(int bean);
        HelloBean sayHello3(HelloBean bean);
    }
}

一個與服務端HelloBean對應的HelloBean.cs:

using System;

//需要相同的命名空間
namespace hessian.test.client
{
    //該類必須和Hessian服務端中Java類一致
    public class HelloBean
    {
        //字段名相同
        private String name;

        //具有相同的geter和seter
        public String getName()
        {
            return name;
        }

        public void setName(String name)
        {
            this.name = name;
        }
    }
}

測試代碼:Program.cs

using System;
using hessiancsharp.client;

namespace hessian.test.client
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = @"http://localhost:8080/HessianServer/hessian";
            CHessianProxyFactory factory = new CHessianProxyFactory();

            Hello test = (Hello)factory.Create(typeof(Hello), url);
            Console.WriteLine(test.sayHello("zhanjindong"));//打印從服務器端獲取的字符串   
            test.printHello("Hessian"); //在服務器端控制台打印 "Hello Hessian"   
            test.sayHello2(12);

            //傳遞對象
            HelloBean bean = new HelloBean();
            bean.setName("zhanjindong");

            HelloBean result = test.sayHello3(bean);
            Console.WriteLine(result.getName());
        }
    }
}

測試結果:

注意事項

示例還是很簡單的,但是有幾點需要注意的:

接口方法不能重載

public interface Hello {
    public void printHello(String smt);
    public String sayHello(String smt);
    public void sayHello2(int bean);
    public HelloBean sayHello3(HelloBean bean);
}

sayHello和sayHello2必須名稱不一樣。

 

對象的命名空間要一致 

Hello接口中的sayHello3用到了HelloBean那么在Java服務端和C#客戶端中兩個HelloBean類所在的命名空間要一致

 

類的結構要一致

示例中的HelloBean在C#中的實現和在Java中一模一樣,相同的字段名,相同的geter和seter。

 

傳遞的對象需要序列化

 

盡量使用簡單的基本的數據類型

Hessian會將Java Bean中的List<T>和數組類型都處理為C#中的ArrayList,所以如果傳遞的對象中有List<T>的話,再轉型的時候會報下面這樣的錯誤:

 

示例代碼下載

點這里下載上面示例的代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM