遠端調用協定。 有多有用,多普遍就不擺了。
大概過程:
1. 調用用戶端句柄,傳輸參數。
2. 封裝參數等消息為網絡傳輸格式傳給遠端主機
3. 伺服器句柄得到消息并解析參數
4. 在伺服器段執行要調用的代碼,并把結果傳回給伺服器句柄
5. 伺服器句柄封裝傳回結果并用網絡傳輸給用戶端
6. 用戶端解析并進行其他處理
可見之問題主要有,通信方式、句柄實作、以及消息封裝和解析(序列化及反序列化)
直接用socket走tcp/ip 或者是udp協定, 例如rmi
走http協定, hessian。 好處不用防火牆再開端口了
在下面的例子中,使用java socket。這樣可以看到更基礎的内容。
句柄部分我們可以使用動态代理,在調用用戶端方法的時候使用動态代理來調用遠端方法
這個也有很多種,比如java自帶的序列化機制,實作了serializable接口的類,都能夠進行序列化
對于java序列化的原理可以看下下面的博文:
http://www.java3z.com/cwbwebhome/article/article8/862.html
是java處理二進制的一貫風格,定義了标志位表示後面有多長的内容表示了一個什麼,然後是具體的内容。
java的反序列化。
最好的辦法當然是看objectinputstream的源代碼了。
大概的流程是:
1. readobject0 入口
2. 然後就是一段一段讀取然後解析了。一般最開始讀取class readclass,讀取這個類的class接口
3. readordinaryobject 使用newinstance來建立執行個體
4. 然後用defaultreadfields 中的desc.setobjfieldvalues内容來個這個執行個體的字段指派。
5. 這是一個循環的過程,知道把對象中所有的内容都還原。
還可以有其他的方式,比如webservice技術是使用了soap協定來進行傳輸的,使用的是類似于xml格式的方式描述消息内容的(是以消息内容會比較臃腫)
hessian是使用了二進制的方式進行了序列化,它使用了自己的規則,該規則可以用其他語言實作,是一個簡單而且高效的協定。
細節連結如下:http://hessian.caucho.com/doc/hessian-serialization.html
在下面的例子中使用objectinputstream來進行序列化操作。
啟動socket并且給每個請求建立一個處理線程:
然後定義傳遞的消息内容,要包含了用戶端要告訴伺服器端的内容,最少要包含,調用的接口名,調用的方法名,以及方法參數。該對象如下:
伺服器端處理線程,将會出去參數對象,然後通過反射來得到具體的執行個體對象以及調用需要調用的方法。
伺服器端配置檔案,主要是配置接口對應了哪個實作類:
使用動态代理,給每一個方法調用都變為遠端調用。
代理将會封裝遠端參數,把調用的接口,方法名,參數傳給遠端,并且獲得傳回值
最後是調用部分,獲得代理類。
下面是用作測試的接口及實作類的代碼:
最後就是源代碼的下載下傳路徑了:
http://download.csdn.net/detail/three_man/8059871