我的EAServer在防火墙的后面,怎么办?

看到这个标题,我想,很多人会有同感:是呀,我的eas服务器就是在防火墙的后面,谁会把eas服务器直接放到公网上呢?

我想,如果你的eas也是防火墙的后面,你一定会遇到这个问题,connection变量执行connecttoserver返回0,也就是可以正常连接到eas服务器,但执行createinstance的时候确返回50,无法创建组件实例,后面的没有办法执行了。怎么回事?好好的代码,都调试了上百遍了,开发状态下一点问题没有,甚至将程序连接到内网的eas服务器上,又没有问题了。或则你会再做一次试验,将eas服务器直接放到公网上,让eas直接在公网ip上监听,呵呵,重大发现,通过了!

可在你高兴的同时,你同样也会感到沮丧,难道eas只能直接暴露在公网上?

是呀,这个问题严重了,或许你已经开始骂sybase是笨猪了。但事实是这样的吗?

不错,你冤枉sybase了,人家早就考虑到这个问题了,在eas的开发文档里,有一节里专门讲解了这个问题,文档里为了能把问题说明白,还特意画了几个网络结构示意图。什么?你不知道?!!那你还怨sybase?

那到底该如何解决这个问题呢?

其实很简单,看看Connection对象的options参数的设置,里面有这么两项:

ORBProxyHost Specifies the machine name or the IP address of an SSL proxy.
ORBProxyPort Specifies the port number of the SSL proxy.

是的,就是这两个家伙,它可以帮你解决问题。

可能你会说了,这两个选项参数是供SSL连接用的呀。不错,但同时它还能解决你的问题,还有什么比能解决你的问题更让你兴奋得呢?

现在,跟我做,1234,2234,3234,再来一遍.......!

跑题了,不是做健身操,是解决那个让你头疼的该死的问题!

或许你的程序在连接eas服务器和创建组件实例的时候的代码大致如下:

connection lconn

lconn = create connection

lconn.application=""

lconn.driver="jaguar"

lconn.location="iiop://202.102.*.*:9000"

lconn.connecttoserver()

lconn.createinstance(in_p, "pkg/com")

是的,你的代码没有错,这在局域网或则eas直接在公网上可以正常运行,但如果防火墙上做了端口映射,你的代码就会在lconn.createinstance(in_p, "pkg/com")的时候返回50,创建组件失败了。

为了解决你的问题,你需要在lconn.connecttoserver()之前,增加如下这行代码:

lconn.options="ORBProxyHost='202.102.*.*',ORBProxyPort='9000'"

好了,就这么简单,再运行一下你的程序,看看,是否可以正常运行了?

Congratulations!!笑了吧,是不是心情很爽,解决问题就是这么简单!

好了,请你再切换到将程序连接到你的局域网的eas,傻眼了吧,又出错了?!

是的,肯定出错,你没有做地址映射,非要让程序按照地址映射的方式访问eas,不错才怪!那怎么解决这个问题呢?还问我?自己想想!你那肩膀上扛着的那玩意是干嘛用的?

怎么,还是想不到怎么解决这个问题?看看eas的管理器,eas管理器的登陆界面上有一个use proxy的复选框,人家就是这么解决的,你呢?

好了,按说,问题到这里,应该是得到了完美解决。可你就不想知道为什么会这样吗?所谓知其然,还要知其所以然,知之为知之,不知为不知,是知也!!完了,又跑题了!好回到这个问题上来,到底是什么原因导致这个问题呢?其实eas的开发文档里也没有说的太明白,只是告诉我们该如何解决。

经过我的分析,其实问题的根源是这样的。

可能你也发现了,通过端口映射搭建的eas,虽然无法创建组件实例,但http访问eas上的网页是没有问题的,是的,你也发现了。其实原因也很简单,因为http协议是无状态的,但iiop协议是有状态的。什么是有状态网络连接协议?你可以在百度上google一下,我这里就不再罗嗦了。

实际上,当connection对象执行connecttoserver的时候,iiop协议会返回eas服务器的地址和端口号,因为eas在内网ip监听,所以connection对象通过iiop协议返回的eas服务器地址就是这个内网地址和内网端口,当connection对象执行createinstance的时候,实际上是去找上次带过来的那个内网ip,想想,你的客户端怎么可能访问到人家的内网里面呢?否则还要什么公网IP!!这样一来,实际上connection在执行createinstance的时候,就去客户端所在的局域网里去找eas了,那怎么会有?创建失败,返回50就是它唯一的选择。你通过设置lconn.options="ORBProxyHost='202.102.*.*',ORBProxyPort='9000'",实际上就是告诉connection对象,去这个地址去找eas,而这个地址又被防火墙影射到内网实际的eas服务器上了,OK了,找到了eas服务器,就没有问题了。

事情有时候就是这么简单,可你可能想破脑袋都不知道该如何解决。

不过,要说sybase没有一点责任也不对,至少,sybase应该在pb的帮助文件里,将这两个选项参数说的更加明白一些。sybase高估了我们中国的程序员,很多人看不明白eas的开发文档,甚至很多人可能都不知道eas还有一套开发文档!

转载于:https://my.oschina.net/u/1464512/blog/916740

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值