`
linliuwei
  • 浏览: 33166 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用hessian php与Java通信

阅读更多
去年2009-07-13在百度空间写的一篇hessian的使用总结,今天把它转过来

公司因业务需求准备开放一些API接口让代理商使用,周末抽了些时间了解了一下这方面的技术后,决定采用caucho.com的Hessian实现(hessian使用方便又高效)

测试环境
  • Window XP
  • JDK 1.6
  • Resin3.1.9
  • Spring2.0.8
  • hessian-3.0.20.jar(这个版本要与spring的对应,不要一味的追求最新版,我因为这个,不知是好还是坏的毛病吃了N多苦头)
  • HessianPHP-1.0.5-RC2
  • Apache2.2
  • PHP5.3.0

刚开始跑Java服务器端和客服端的测试都很顺利,但是当使用php5.3做为客户端访问Java时出现了好几个问题
include_once '../dist/Hessian.php';
include_once '../dist/HessianClient.php';

Hessian :: mapRemoteType('com.hisupplier.showroom.webservice.QueryParams', 'QueryParams');
Hessian :: mapRemoteType('com.hisupplier.showroom.webservice.ListResult', 'ListResult');
Hessian :: mapRemoteType('com.hisupplier.showroom.entity.Product', 'Product');
Hessian :: mapRemoteType('com.hisupplier.commons.page.Page', 'Page');

try {
    $params = new QueryParams(114);

    $url = "http://guiyou.jiaming.com/webService";
    $proxy = new HessianClient($url);
    echo "<br>";
    print_r($proxy->hello($params));
    echo "<br>";
    print_r($proxy->getProduct($params)); 
    echo "<br>";
    print_r($proxy->getList($params)); //要命的问题出在这里
} catch (HttpError $ex) {
    ...
}

public interface ShowroomAPI {
    String hello(QueryParams params);
    ListResult<Product> getList(QueryParams params);
    Product getProduct(QueryParams params);
}

第1个问题
因为php5.2.x版本后自带了DateTime类,和 HessianPHP 中的发生冲突
解决:改文件DateTime.php 为 HessianDateTime.php,类DateTime 为 HessianDateTime

第2个问题
PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in G:\\php\\HessianPHP\\dist\\Hessian.php on line 74
解决:将date() 方法都改为 date_default_timezone_set()

第3个问题
Exception: Hessian Parser, Malformed reply: expected r Code: 2 exception 'HessianError' with message 'Hessian Parser, Malformed reply: expected r' in E:\workspace\php-test\dist\Protocol.php:339 Stack trace: 
#0 E:\workspace\php-test\dist\HessianClient.php(215): HessianParser->parseReply() 
#1 E:\workspace\php-test\dist\Filter.php(159): HessianProxy->executeCall('getList', Array) 
#2 E:\workspace\php-test\dist\Filter.php(73): ProxyFilter->execute(Object(HessianProxy), Object(FilterChain)) 
#3 E:\workspace\php-test\dist\Filter.php(191): FilterChain->doFilter(Object(HessianProxy)) 
#4 E:\workspace\php-test\dist\Filter.php(73): PHPErrorReportingFilter->execute(Object(HessianProxy), Object(FilterChain)) 
#5 E:\workspace\php-test\dist\HessianClient.php(182): FilterChain->doFilter(Object(HessianProxy)) 
#6 E:\workspace\php-test\dist\HessianClient5.php(94): HessianProxy->call('getList', Array) 
#7 [internal function]: HessianClient->__call('getList', Array) 
#8 E:\workspace\php-test\tests\test.php(23): HessianClient->getList(Object(QueryParams)) 
#9 {main}

google, baidu了半天也没找到相关的文章,后来把apache和php分别降到2.0和5.1还是不行,最后快放弃了试了一下yahoo,哦!my god佛祖保佑阿门,让我找了一了篇文章
引用

Chunked http responses cause a protocol parse error

Http.php is written to perform an HTTP POST using HTTP/1.1 which means that
the Hessian client must support a HTTP header of "Transfer-Encoding:
chunked".

Protocol::parseReply() is written as follows:

if($this->read(1) != 'r') {
return new HessianError('Hessian Parser, Malformed reply: expected
r',HESSIAN_PARSER_ERROR,0,$this->stream);
}

which will fail because the first line of a chunked response will contain
the chunk length. Protocol::parseReply() needs to be written to support
chunking.

At the moment the workaround I have is to set HTTP/1.0 in Http::POST.

解决:把Http.php中的1.1改为1.0
在Http.php第200行: $out = "POST $this->url HTTP/1.1\r\n";

原来是因为http/1.1中Transfer-Encoding:chunked编码的包是分段发送的,我最后一个方法$proxy->getList($params) Java服务器端返回的数据量太大了,php这里没接收完整引起的。
3
1
分享到:
评论
2 楼 xin_jing 2013-08-04  
  帮下忙,我想看下你的Hessian.php,我是php新手,又要用到hessian的php;可以发我邮箱258384374@QQ.com
1 楼 youjianbo_han_87 2013-06-20  
最后一点很好啊。

相关推荐

    hessian php与java通讯demo源码

    总之,这个"PHP与Java通信Demo源码"是一个很好的学习资源,帮助开发者理解如何在PHP和Java之间使用Hessian协议进行通信。通过分析和实践这些示例代码,你可以更好地掌握Hessian的工作原理和使用方式,为你的跨语言...

    java调用hessianphp写得web service

    在IT行业中,Web服务是一种广泛使用的通信协议,...这个过程简化了Java与PHP之间的通信,使得跨语言的集成变得更为便捷。在实际开发中,根据具体需求,可能还需要处理异常、安全、性能优化等问题,但基本步骤如上所述。

    Hessian学习笔记

    1. **二进制序列化**:Hessian使用高效的二进制格式进行序列化和反序列化,与基于文本的序列化协议(如JSON或XML)相比,它能显著减少网络传输的数据量。二进制序列化的优势在于数据紧凑,解析速度快,但同时也降低...

    用Hessian协议实现Android手机与J2EE系统集成的研究.pdf

    Hessian协议支持多种编程语言,如Java、C、C++、C#、.NET、Flash、PHP等,并提供相应的API支持包,便于开发者集成到各自的应用环境中。Hessian协议的特点包括:无需额外模式或接口定义的可序列化类型、自描述性、...

    Flex + Hessian 学习笔记(二)

    在Flex应用中集成Hessian,开发者可以实现跨域的服务调用,让Flex客户端能够与Java、PHP、.NET等后端服务器进行通信。Hessian的优势在于其简洁的二进制格式,比XML-RPC或SOAP等基于文本的协议更为高效。 "source...

    二进制Web服务Hessian刘骥讲座--(附源码)

    1. **二进制编码**:与基于XML的Web服务相比,Hessian使用二进制编码来表示数据,减少了网络传输的数据量,提高了通信速度。这种编码方式对常见的数据类型(如整数、字符串、日期、对象等)都有优化,使得序列化和反...

    java开源包8

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    hessian 在PHP中的使用介绍

    Hessian是语言无关的,这意味着它可以被多种编程环境如Java、PHP等支持。 在PHP中使用Hessian,需要注意以下几点: 1. **安装HessianPHP库**:与SOAP服务不同,PHP并没有内置对Hessian的支持。你需要从第三方源,...

    java开源包4

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包101

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包6

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包9

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包5

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包10

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包3

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包1

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    Java资源包01

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包2

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    java开源包11

    PHPJava Bridge php调用java类 Java批量作业执行框架 MyBatchFramework MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史...

    Java常用的Jar包

    Hessian是一种轻量级的RPC协议,用于Java和C++之间进行二进制序列化通信。Quercus是用PHP编写的,但运行在Java虚拟机上的PHP解释器,用于在Java环境中执行PHP代码。 5. **commons-dbcp-1.2.1**: Apache Commons ...

Global site tag (gtag.js) - Google Analytics