HESSIAN的VC++ 用戶端與JAVA服務端通訊實現
最近碰到一項目,需要與JAVA服務端通訊,JAVA服務端使用的協議是HESSIAN。沒聽過,Google一下找到其官方網站(http://hessian.caucho.com/)簡略一看,類似於C#的web servers,二進位WEB服務,再Google一下,效率比web servers 要高和SOCKET 差不多。
轉正題,官方文檔支援C++實現(不支援你丫也好意思)下了源碼大致看了下,baidu一把,支援hessian支援HTTP協議,將協議封裝在HTTP封包中,通過HTTP通道傳送。因為他是採用二進位編碼沒有多餘的資料,資料量比SOAP協議少得多(這個項目還用到SOAP協議)。 既然支援HTTP協議,心想支援當然可以用MFC裡面封裝好的HTTP 類庫來處理CHttpConnection 和CInternetSession 看了下HESSIAN源碼 無非就是裝傳入字串進行轉化 再POST到服務端,下了一個demo 改一下,一調 服務端 返回確實是返回了,不過返回的是 500錯誤(未知的伺服器錯誤) ,找半天也不知道什麼原因,繼續GOOGLE之,發現了CURL 這個好東東(http://curl.haxx.se/),支援DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP,LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS 這多協議。這NB,但哥不會用啊。又只好看例子,下demo 好吧弄著一調,服務端一調可以了。廢話說完,進入正題。主要流程如下:
調用 start_call(method)對要遠程調用的方法名運行字元轉換,具體轉換可以看hessian源碼
調用 set_parameter(mc,param)將參數字串進行轉換 並和轉換後的遠程方法名進行拼接。
調用complete_call(string strParam) 為字串設定結束標識 加z
傳出資料準備完成。該主角登場CURL
調用curl_easy_setopt分別設定CURLOPT_URL CURLOPT_POSTFIELDS, CURLOPT_POSTFIELDSIZE 參數含義參見官方網站,
_res=curl_easy_perform(_curl) 向遠程網站發送http封包
若返回成功 調用hessian_input 裡面的 函數 接收資料
auto_ptr<input_stream> sis(new string_input_stream(_http_result));
hessian_input hes_in(sis);
hes_in.start_reply();
result = hes_in.get_result();
hes_in.complete_reply();
好吧完事了 看著蠻容易,實際也不是太難,主要是之前不知道還有CURL這個東東。如果還需要協助可以發郵件給我luoj166@163.com 。下一篇寫VC++調用JAVA 的webservers 帶HTTP 頭驗證