`

hessian 的夸语言使用(PHP服务端 | C#客户端)

阅读更多

      本人资深老代码。

      用hessian差不多有5个年头了,基本上可以算是出来就在用吧。这玩意做RPC确实方便,而且能跨语言。曾经在企业工作,大部分都是用java、C#做开发。用hessian的时候发现了不少坑,感觉都趟过了。现在突然有个小东西更适合用php做服务端,前端用C#,自然就想起来用hessian了。

 

      于是两边同时开发,php这边就用直接实现了server端,测试用php做了简单的client。完美通过,中文部分用urlencode先保证程序能跑起来。C#这边驾轻就熟一次性撸完。本来很顺溜的进行对接了,结果发现C#这边一直报SystemNetWebException.任何提示都没有。吐老血。。。

 

      怎么办?这时候再换其他的不太合适,用webservice这东西体积太大,安全性也不高。一边不爽一边看了看php的hessian实现代码。发现代码量不大,那应该C#这边也没什么大问题。于是下载了一份最新的C#的hessian实现,一步步调试吧。最后发现C#的实现确实挺简单的,只是用了固定的规则拼接方法名和参数,然后直接发送http请求,并没有做太多的加密解密规则,那就好办。

 

      打开了php的实现部分,用最笨的办法一步步调试。最后发现错误出现在HessianObjectFactory.php的detectVersion方法,简单阅读,这个方法是来检查版本的。先去掉,默认设置为不检查。

随后发现错误依然报,继续调试php。发现在HessianObjectFactory创建的时候会初始化两个默认属性

function __construct(){
		$this->protocols = array(
			'2'=>array($this,'loadVersion2'), '1'=>array($this,'loadVersion1')
		);
		$this->transports = array(
			'CURL' => 'HessianCURLTransport',
			'curl' => 'HessianCURLTransport',
			'http' => 'HessianHttpStreamTransport'
		);
	}
	

       这一看就肯定有问题呢,在php的hessian实现包里有两个文件夹“hessian1”,“hessian2”不用说,肯定有两个不同的标准来实现的。再看transports有CURL和http两种协议,这完全不用考虑肯定是HTTP的流实现,因为在C#端已经看了。 那回过头来就再尝试一下不同版本的不同协议咯。

 

      首先,看了一下 在初始化工厂的时候是可以设置选择哪个版本哪个协议来初始化hessian实例的。如果不填写的话会有默认的HessianOptions对象呗创建。于是看了一下HessianOptions.php的代码。比较简单最上面就出现了

/**
 * Configuration options for use in Hessian services, both client and server
 */
class HessianOptions{
	public $version = 1;//2;
	/**
	 * Name of the transport to use
	 * @var string
	 */
	public $transport = 'http';//'CURL';

 先直接改这部分吧。先把$transport默认值改为http,在C#端测试一下,还是有错误,但是已经变了,错误是hessian相关的,那再把$version换成1。再试C#调用。成功了!

 

      整个过程本人带着怒气调试,基本无脑!试两次后发现确实成功了。好吧!算是经验记录。忘各位同仁在使用hessian少掉坑!

 

总结一下:只需要修改默认配置即可,HessianOptions.php中修改public $version = 1;public $transport = 'http';即可支持C#进行客户端调用。主要是满足C#的传递方式。

 

 

在此,再总结一下hessian的一些特性:

 

1.在调试C#源码的时候发现hessian在C#的实现上是支持重载的,因为在传递方法名和参数的拼接时发现中间有一段是表示如果支持重载,则在方法名拼接时在方法名后面增加0,1这种下标并且在参数之间增加_。不过在php的server实现里面并没有看见重载配置,所以至少C#用hessian是支持重载的,这和官方前几年的文档不一样,应该是近期新增的功能。

public object DoBurlapMethodCall(object[] arrMethodArgs, MethodInfo methodInfo)
        {
            Type[] argumentTypes = GetArgTypes(arrMethodArgs);
            Stream sInStream = null;
            Stream sOutStream = null;

            try
            {
                WebRequest webRequest = this.OpenConnection(m_uriBurlapServiceUri);
               

                webRequest.ContentType = "text/xml";
                webRequest.Method = "POST";
             

                MemoryStream memoryStream = new MemoryStream(2048);

                CBurlapOutput cBurlapOutput = this.GetBurlapOutput(memoryStream);
                string strMethodName = methodInfo.Name;
                if (m_CBurlapProxyFactory.IsOverloadEnabled)
                {// 可以发现IsOverloadEnabled就是启用是否重载的了
                    if (arrMethodArgs != null)
                    {
                        strMethodName = strMethodName + "__" + arrMethodArgs.Length;
                    }
                    else
                    {
                        strMethodName = strMethodName + "__0";
                    }
                }

                cBurlapOutput.Call(strMethodName, arrMethodArgs);

                try
                {
                    webRequest.ContentLength = memoryStream.ToArray().Length;
                    sOutStream = webRequest.GetRequestStream();
                    memoryStream.WriteTo(sOutStream);

                }
                catch (Exception e)
                {
                    throw new CBurlapException("Exception by sending request to the service with URI:\n" +
                        this.URI.ToString() + "\n" + e.Message);
                }

 

2.在以往的经验里面发现java和C#做互相调用时java的Map类型对应为C#的Hashtable。很多人说java无法用Map这点是不对的。

 

3.在java中的package名称和C#中的namespace是需要一致的,但是本人在测试C#和C#进行hessian调用时发现两者的namespace并不需要一致,只要保证ClassName相同即可完成调用。

 

4.很多人说hessian比较稳定,快速;其实hessian也就是用http进行通讯的快速倒是可以,毕竟数据使用了二进制压缩传输。但是稳定就说不上了,曾经有项目在用的时候发现100次调用失败率超过7%。毕竟http协议建立连接是比较慢切耗费资源的。但是在考虑到开发的时间成本上,不大的项目直接用hessian是很不错的选择。

 

5.hessian的数据体积是有限制的,特别是在PHP、nodejs等较轻量级的语言上,过大的数据会直接传送失败,这和服务容器的配置一定要把握好。

 

6.在中文传输上,hessian没有太好的去考虑解决,毕竟是老外开发。最偷懒的解决方法就是通讯都用utf8,在发现中文依然处理不了的时候使用urlencode进行编码吧,收到后再解码。

分享到:
评论

相关推荐

    hessian服务端 客户端 可运行

    在这个“hessian服务端 客户端 可运行”的压缩包文件中,很可能包含了一个完整的示例,让我们来详细探讨Hessian在服务端和客户端的实现及其重要性。 首先,我们来理解一下Hessian服务端。在Java中,Hessian服务端...

    hessian demo 包括服务端和客户端

    在Java中,Hessian客户端可以使用HessianProxyFactory来创建一个代理对象,这个代理对象就像是本地对象一样调用服务端的方法。例如,在`hessionclient`目录下,可能有客户端代码,通过URL连接到服务端,创建Hessian ...

    hessian java +c# 数据测试

    本文将深入探讨Hessian在Java服务端与C#客户端之间的应用,以及如何处理不同类型的数据,如简单数据类型、自定义对象、List和Map。 首先,Hessian是由Apache软件基金会的 Burlap项目发展而来的一种基于HTTP的二进制...

    hessian服务器和客户端

    在本项目中,我们探讨的是基于C#实现的Hessian服务端和客户端,已经在IIS环境下进行了测试并成功通过。 1. **Hessian协议**:Hessian是由Caucho公司开发的一种轻量级、高效的二进制协议,主要用于Web服务。它支持...

    C#中Hessian的使用例子

    在.NET开发环境中,C#是一种常用的编程语言,而Hessian是一种二进制的远程方法调用(Remote Method Invocation,RMI)协议。Hessian能够帮助开发者实现高效的、跨平台的数据交换,尤其适用于分布式系统中的服务调用...

    Hessian协议的C#源代码

    Hessian协议是http://caucho.com/公司开发的一种实用的web服务技术,它采用二进制数据,传输效率比较高,简单易用,是C#.NET/IIS环境快速开发web服务应用的一种解决方案。...在服务端、客户端项目中引用此DLL文件即可。

    Hessian 使用小结

    1. **添加依赖**:首先,客户端和服务端都需要引入Hessian的jar包,以便使用其提供的API和功能。 2. **服务端设置**:在服务端,需要定义业务接口,并创建该接口的实现类。这个实现类需要继承`HessianServlet`,...

    spring springmvc hessian rpc客户端及服务端示例demo

    本示例着重介绍如何在Spring和SpringMVC框架中集成Hessian RPC,以实现客户端和服务端的通信。 Hessian是一种轻量级的二进制Web服务协议,由Caucho公司开发。它具有较高的传输效率,支持Java和.NET等多种语言,特别...

    使用hessian进行服务器-客户端通讯

    4. **建立连接**:客户端通过URL(通常包括服务端的IP地址和端口号,以及Hessian服务的路径)与服务器建立连接。这个URL就是客户端调用Hessian服务的入口。 5. **调用服务**:一旦连接建立,客户端就可以像调用本地...

    hessian 服务器 客户端 demo

    综上所述,"hessian 服务器 客户端 demo"是一个演示如何使用Hessian协议实现服务器和客户端之间的RPC通信的示例。这个压缩包可能包含了服务器和客户端的代码实现,帮助开发者了解和学习如何在实际项目中应用Hessian...

    【Android】使用Hessian与Java服务端通讯

    本文将详细介绍如何在Android客户端中使用Hessian与Java服务端进行通讯。 **一、Hessian概述** Hessian是由Caucho公司开发的一种基于HTTP的二进制RPC协议。它的主要优点包括: 1. **压缩传输**: Hessian采用二进制...

    用hessian c#桌面程序调用J2EE后台服务

    标题中的“用Hessian C#桌面程序调用J2EE后台服务”涉及到的是跨平台通信技术,特别是使用Hessian协议来实现C#客户端与Java(J2EE)服务器之间的交互。Hessian是一种二进制的远程过程调用(RPC)协议,由BEA Systems...

    Hessian实战应用之获取客户端请求URL和重新转发客户端请求

    下面是一个简单的示例,展示了如何在Hessian服务端获取客户端请求的URL: ```java import com.caucho.hessian.server.HessianServlet; import javax.servlet.http.HttpServletRequest; public class ...

    hessian php与java通讯demo源码

    - **客户端**:在PHP代码中,使用`php-hessian`库创建一个客户端实例,指定服务器的URL和服务接口。 - **通信**:客户端通过Hessian协议发送请求到服务器,服务器接收到请求后执行对应的方法,并返回结果。 - **...

    Hessian应用

    - **客户端调用**:客户端通过Hessian客户端库连接到服务端,调用服务端提供的方法,并接收返回的结果。 #### 上传文件功能 在Hessian中实现文件上传功能也是一个常见的应用场景。这里我们可以设想一个简单的文件...

    Java和c#使用hessian通信

    一个简单的例子学习hessian服务:服务端为Java,客户端为C#。  先要准备好C#和Java的第三方类库:http://hessian.caucho.com/  Hssiancharp.dll  hessian-4.0.37.jar  Hessian服务端(java)  打开eclipse...

    hessian 使用实例

    Hessian提供了一种简单、快速的方式将Java对象序列化为字节流,然后在服务端和客户端之间进行传输。这种方式比XML或JSON等文本格式更加高效,因为它的数据体积小,解析速度快。 ### Hessian的基本原理 Hessian协议...

    hessian

    在【描述】中提到的博客链接,可能详细介绍了如何使用Hessian进行客户端和服务端的交互。通常,使用Hessian的步骤包括: 1. **安装库**:在项目中引入Hessian的相应库,例如对于Java项目,可以添加Caucho的Hessian库...

    hessian案例,hessian案例

    通过简单的API,开发者可以轻松地创建服务端接口并暴露为Hessian服务,同时在客户端通过HessianProxyFactory来创建代理对象,调用远程服务就像调用本地方法一样。 3. **Python中的Hessian**:Python也有对应的...

    HessianCSharp_Test.rar_Hessian java

    描述中提到的“.Net使用Hessian调用JAVA的函数”,意味着这个压缩包可能包含了C#代码,这些代码实现了通过Hessian协议调用Java服务端的方法。这通常涉及到序列化和反序列化对象,以及处理跨语言的接口调用。 在标签...

Global site tag (gtag.js) - Google Analytics