看到這個標題,我想,不少人會有同感:是呀,個人eas服務器就是在防火牆的後面,誰會把eas服務器直接放到公網上呢?程序員
我想,若是你的eas也是防火牆的後面,你必定會遇到這個問題,connection變量執行connecttoserver返回0,也就是能夠正常鏈接到eas服務器,但執行createinstance的時候確返回50,沒法建立組件實例,後面的沒有辦法執行了。怎麼回事?好好的代碼,都調試了上百遍了,開發狀態下一點問題沒有,甚至將程序鏈接到內網的eas服務器上,又沒有問題了。或則你會再作一次試驗,將eas服務器直接放到公網上,讓eas直接在公網ip上監聽,呵呵,重大發現,經過了!服務器
可在你高興的同時,你一樣也會感到沮喪,難道eas只能直接暴露在公網上?網絡
是呀,這個問題嚴重了,或許你已經開始罵sybase是笨豬了。但事實是這樣的嗎?app
不錯,你冤枉sybase了,人家早就考慮到這個問題了,在eas的開發文檔裏,有一節裏專門講解了這個問題,文檔裏爲了能把問題說明白,還特地畫了幾個網絡結構示意圖。什麼?你不知道?!!那你還怨sybase?google
那到底該如何解決這個問題呢?調試
其實很簡單,看看Connection對象的options參數的設置,裏面有這麼兩項:server
ORBProxyHost Specifies the machine name or the IP address of an SSL proxy.
ORBProxyPort Specifies the port number of the SSL proxy.對象
是的,就是這兩個傢伙,它能夠幫你解決問題。ip
可能你會說了,這兩個選項參數是供SSL鏈接用的呀。不錯,但同時它還能解決你的問題,還有什麼比能解決你的問題更讓你興奮得呢?ci
如今,跟我作,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還有一套開發文檔!