hessian php与Java通信
2015-08-05 16:03
721 查看
公司因业务需求准备开放一些API接口让代理商使用,周末抽了些时间了解了一下这方面的技术后,决定采用caucho.com的Hessian实现(hessian使用方便又高效)
测试环境
Window XP
hessian-3.0.7.jar(这个版本要与spring的对应,不要一味的追求最新版,我因为这个,不知是好还是坏的毛病吃了N多苦头)
HessianPHP-2.0.3
Apache2.2
PHP5.3.0
刚开始跑Java服务器端和客服端的测试都很顺利,但是当使用php5.3做为客户端访问Java时出现了好几个问题
Php代码 HessianPHP-1.0.5
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) {
...
}
Php代码 HessianPHP-2.0.5
require_once 'HessianPHP_v2.0.3/src/HessianClient.php';
require_once 'HessianPHP_v2.0.3/src/HessianOptions.php';
require_once 'HessianPHP_v2.0.3/src/HessianTypeMap.php';
$testurl = 'http://127.0.0.1/Service/hessian/userInfoService';
$handler = new HessianTypeMap();
$handler->mapType('User', 'com.ub.common.sys.entity.User');
$proxy = new HessianClient($testurl);
$user2=$proxy->getUserByUserId('01');
print_r($user2);
echo $user2->userId;
echo $user2->getUserId();
Java代码
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个问题
Php代码
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这里没接收完整引起的。
测试环境
Window XP
hessian-3.0.7.jar(这个版本要与spring的对应,不要一味的追求最新版,我因为这个,不知是好还是坏的毛病吃了N多苦头)
HessianPHP-2.0.3
Apache2.2
PHP5.3.0
刚开始跑Java服务器端和客服端的测试都很顺利,但是当使用php5.3做为客户端访问Java时出现了好几个问题
Php代码 HessianPHP-1.0.5
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) {
...
}
Php代码 HessianPHP-2.0.5
require_once 'HessianPHP_v2.0.3/src/HessianClient.php';
require_once 'HessianPHP_v2.0.3/src/HessianOptions.php';
require_once 'HessianPHP_v2.0.3/src/HessianTypeMap.php';
$testurl = 'http://127.0.0.1/Service/hessian/userInfoService';
$handler = new HessianTypeMap();
$handler->mapType('User', 'com.ub.common.sys.entity.User');
$proxy = new HessianClient($testurl);
$user2=$proxy->getUserByUserId('01');
print_r($user2);
echo $user2->userId;
echo $user2->getUserId();
Java代码
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个问题
Php代码
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这里没接收完整引起的。
相关文章推荐
- php为图片添加水印
- 使用php-java-bridge让PHP5支持java
- php 遍历一个文件夹下面的子文件
- php 实例说明 socket通信机制
- ubuntu安装ftp服务器(一般配置)
- 深入浅出讲解:php的socket通信
- LayoutParams的用法,及LayoutInflater区别
- php 反射
- listView.setLayoutParams
- contentprovider数据共享机制
- PHP学习资料汇总
- 74 php 上传文件空值判断
- PHP处理会话函数大总结
- Commons-net FTPClient completePendingCommand()经常使程序死掉的原因分析以及解决方式
- PHP中$_SERVER的详细参数与说明
- 最新抓取淘宝价格数据,图片标题的就更好抓了整合就好
- ACM1089:A+B for Input-Output Practice (I)
- php spl之迭代器iterator
- 简单分页原理 php
- php-fpm参数优化