国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java和c#使用hessian通信

2019-11-14 21:08:41
字體:
來源:轉載
供稿:網友
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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 榕江县| 仁布县| 乌鲁木齐市| 多伦县| 桃江县| 饶平县| 南安市| 海林市| 英山县| 浦东新区| 易门县| 蒙自县| 吉隆县| 策勒县| 佳木斯市| 柳林县| 海兴县| 大宁县| 韩城市| 宿州市| 中卫市| 梁山县| 乌审旗| 稻城县| 阿勒泰市| 房产| 光泽县| 阿拉善右旗| 太和县| 金乡县| 澳门| 景泰县| 买车| 关岭| 大田县| 东乌珠穆沁旗| 长兴县| 蓝田县| 淮南市| 岳阳县| 西平县|