hessian c java_java和c#使用hessian通信的方法
本文实例讲述了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 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 getBeanList(){
ArrayList beans = new ArrayList();
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 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 helloBeans;
//private Map helloBeanMap;
private int number;
public int getNumber(){
return number;
}
public ArrayList getHelloBeans(){
return helloBeans;
}
public void setData(ArrayList beans, int num){
this.number = num;
this.helloBeans = beans;
// helloBeanMap = new HashMap();
// for (HelloBean helloBean : beans) {
// if(!helloBeanMap.containsKey(helloBean.getName()))
// {
// helloBeanMap.put(helloBean.getName(), helloBean);
// }
// }
}
}
web.xml内容:
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">
hessian server
hessian
com.caucho.hessian.server.HessianServlet
service-class
hessian.test.server.HelloImpl
hessian
/hessian
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 helloBeanMap;
private int number;
public int GetNumber()
{
return number;
}
public HelloBean[] GetBeans()
{
return helloBeans;
}
//public Dictionary 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 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函数内部实现不一致导致的,具体原因不明。
感兴趣的朋友可以测试一下本文实例,源码点击此处本站下载。
hessian c java_java和c#使用hessian通信的方法相关推荐
- 子组件调用父组件方法_vue父子组件通信以及非父子组件通信的方法
组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...
- java condition详解_Java使用Condition控制线程通信的方法实例详解
Java使用Condition控制线程通信的方法实例详解 发布于 2020-4-20| 复制链接 摘记: 本文实例讲述了Java使用Condition控制线程通信的方法.分享给大家供大家参考,具体如下 ...
- iic裸机与linux通信,基于IIC协议的Linux操作系统与裸机通信的方法
主权项: 1.一种基于IIC协议的Linux操作系统与裸机通信的方法,其特征在于,包括如下步骤:步骤S1,对采用Linux系统的多个硬件和裸机同时挂载在总线上,包括:配置一个主机设备和多个从机设备,每 ...
- 基于VC++开发串口通信的方法
串行通信中的关键是串行通信设备的初始化.数据的发送和接收及其实现方式. 在Dos环境下,用户可以直接对通信设备编程,可以通过查询中断的方式使用通信设备.但是Windows不提倡应用程序直接控制硬件,而 ...
- android php 实时通信,Android_Android实现Activity之间通信的方法,本文实例讲述了Android实现Activi - phpStudy...
Android实现Activity之间通信的方法 本文实例讲述了Android实现Activity之间通信的方法.分享给大家供大家参考.具体如下: 在一个Activity中可以使用系统提供的start ...
- 一种即时通信数据传输方法、客户端、服务器及系统
一种即时通信数据传输方法.客户端.服务器及系统 摘要 本发明实施例提供一种即时通信数据传输方法.客户端.服务器及系统,其中,方法可以包括:向服务器发送传输控制协议TCP连接建立请求,建立与所述服务器 ...
- 评估人-自主系统团队通信的方法(1)
译者:关天海,何瑞麟,庄琰,刘欣,段承序,王玉虎,于栖洋,胡少波 摘要 对团队通信的评估可以为团队动态.凝聚力.信任和联合任务的绩效提供关键的见解.尽管许多基于通信的措施已经在人类团队中进行了测试和验 ...
- 西门子S7300PLC转以太网连接CHNet-S7300MD实现以太网通信配置方法
西门子S7300PLC转以太网连接CHNet-S7300MD实现以太网通信配置方法 产品简介 兴达易控CHNet-S7300MD用于西门子S7-200/SMART S7-200/S7-300/S7-4 ...
- vue父子组件通信以及非父子组件通信的方法
组件是 vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.一般来说,组件可以有以下几种关系,父子关系.兄弟关系和隔代关系,简化点可以分为父子关系和 ...
最新文章
- 如何隐藏system函数的窗口
- 面向对象设计原则之5-接口隔离原则
- html页面forEach用法,!foreach循环用在HTML中,请高手协助
- linux镜像下载和vmware虚拟主机部署
- 中继段光缆测试与用户光缆测试有什么区别?
- LoRaWAN协议格式
- 计算机键盘重复设置,教你操作win10系统电脑键盘打字时总是出现重复字符的方案...
- 【番外篇】利率二叉树模型对冲
- 血管老化30岁就开始!别怕,吃它就能搞定,让血管保持年轻~
- 教你DIY中文增强版Geexbox,且安装为硬盘版
- 世界上最大的开源基金会 Apache 是如何运作的?
- 自动排课系统V2.0基本完善了
- 哇咔咔!用Android手机控制电脑。
- Android注册页面
- LINUX 字体装在哪个文件夹里
- Centos服务器 查看不到IP地址
- 1024 科学计数法 (20 分) 完全解析(C++详细思路)
- 树莓派之更改开机画面
- RK3568触摸屏驱动调试总结
- 适用于AbpBoilerplate的阿里云腾讯云Sms短信服务