java的遠程調用
『壹』 java怎麼遠程調用webservice介面
Java通過WSDL文件來調用webservice:
注意,以下的代碼並沒有經過真正的測試,只是說明這些情況,不同版本的Axis相差很大,大家最好以apache網站上的例子為准,這里僅僅用於說明其基本用法。
1,直接AXIS調用遠程的web service
這種方法比較適合那些高手,他們能直接看懂XML格式的WSDL文件,我自己是看不懂的,尤其我不是專門搞這行的,即使一段時間看懂,後來也就忘記了。直接調用模式如下:
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
public class caClient {
public static void main(String[] args) {
try {
String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";
//直接引用遠程的wsdl文件
//以下都是套路
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(endpoint);
call.setOperationName("addUser");//WSDL裡面描述的介面名稱
call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,
javax.xml.rpc.ParameterMode.IN);//介面的參數
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//設置返回類型
String temp = "測試人員";
String result = (String)call.invoke(new Object[]{temp});
//給方法傳遞參數,並且調用方法
System.out.println("result is "+result);
}
catch (Exception e) {
System.err.println(e.toString());
}
}
}
2,直接SOAP調用遠程的webservice
這種模式我從來沒有見過,也沒有試過,但是網路上有人貼出來,我也轉過來
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.rpc.*;
import java.io.*;
import java.net.*;
import java.util.Vector;
public class caService{
public static String getService(String user) {
URL url = null;
try {
url=new URL("http://192.168.0.100:8080/ca3/services/caSynrochnized");
} catch (MalformedURLException mue) {
return mue.getMessage();
}
// This is the main SOAP object
Call soapCall = new Call();
// Use SOAP encoding
soapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
// This is the remote object we're asking for the price
soapCall.setTargetObjectURI("urn:xmethods-caSynrochnized");
// This is the name of the method on the above object
soapCall.setMethodName("getUser");
// We need to send the ISBN number as an input parameter to the method
Vector soapParams = new Vector();
// name, type, value, encoding style
Parameter isbnParam = new Parameter("userName", String.class, user, null);
soapParams.addElement(isbnParam);
soapCall.setParams(soapParams);
try {
// Invoke the remote method on the object
Response soapResponse = soapCall.invoke(url,"");
// Check to see if there is an error, return "N/A"
if (soapResponse.generatedFault()) {
Fault fault = soapResponse.getFault();
String f = fault.getFaultString();
return f;
} else {
// read result
Parameter soapResult = soapResponse.getReturnValue ();
// get a string from the result
return soapResult.getValue().toString();
}
} catch (SOAPException se) {
return se.getMessage();
}
}
}
3,使用wsdl2java把WSDL文件轉成本地類,然後像本地類一樣使用,即可。
這是像我這種懶人最喜歡的方式,仍然以前面的global weather report為例。
首先 java org.apache.axis.wsdl.WSDL2Java http://www.webservicex.net/globalweather.asmx.WSDL
原本的網址是http://www.webservicex.net/globalweather.asmx?WSDL,中間個各問號,但是linux下面它不能解析,所以去掉問號,改為點號。
那麼就會出現4個文件:
GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java
其中GlobalWeatherSoap.java是我們最為關心的介面文件,如果你對RMI等SOAP實現的具體細節不感興趣,那麼你只需要看介面文件即可,在使用的時候,引入這個介面即可,就好像使用本地類一樣。
『貳』 JAVA 遠程 調用的幾種實現方式簡析 詳細�0�3
基本原理 要實現網路機器間的通訊,首先得來看看計算機系統網路通信的基本原理,在底層層面去看,網路通信需要做的就是將流從一台計算機傳輸到另外一台計算機,基於傳輸協議和網路 IO 來實現,其中傳輸協議比較出名的有 http、tcp、 udp 等等,http、tcp、udp 都是在基於Socket 概念上為某類應用場景而擴展出的傳輸協議,網路IO,主要有bio、nio、aio 三種方式,所有的分布式應用通訊都基於這個原理而實現,只是為了應用的易用,各種語言通常都會提供一些更為貼近應用易用的應用層協議。 應用級協議 遠程服務通訊,需要達到的目標是在一台計算機發起請求,另外一台機器在接收到請求後進行相應的處理並將結果返回給請求端,這其中又會有諸如 onewayrequest、同步請求、非同步請求等等請求方式,按照網路通信原理,需要實現這個需要做的就是將請求轉換成流,通過傳輸協議傳輸至遠端,遠端計算機在接收到請求的流後進行處理,處理完畢後將結果轉化為流,並通過傳輸協議返回給調用端。原理是這樣的,但為了應用的方便,業界推出了很多基於此原理之上的應用級的協議,使得大家可以不用去直接操作這么底層的東西,通常應用級的遠程通信協議會提供: 1.為了避免直接做流操作這么麻煩,提供一種更加易用或貼合語言的標准傳輸格式;2.網路通信機制的實現,就是替你完成了將傳輸格式轉化為流,通過某種傳輸協議傳輸至遠端計算機,遠端計算機在接收到流後轉化為傳輸格式,並進行存儲或以某種方式通知遠端計算機。 所以在學習應用級的遠程通信協議時,我們可以帶著這幾個問題進行學習: 1.傳輸的標准格式是什麼?2.怎麼樣將請求轉化為傳輸的流?3.怎麼接收和處理流?4.傳輸協議是? 不過應用級的遠程通信協議並不會在傳輸協議上做什麼多大的改進,主要是在流操作方面,讓應用層生成流和處理流的這個過程更加的貼合所使用的語言或標准,至於傳輸協議則通常都是可選的,在java 領域中知名的有:RMI、 XML-RPC、Binary-RPC、SOAP、CORBA、JMS,來具體的看看這些遠程通信的應用級協議: RMIRMI 是個典型的為java 定製的遠程通信協議,我們都知道,在 singlevm 中,我們可以通過直接調用javaobjectinstance 來實現通信,那麼在遠程通信時,如果也能按照這種方式當然是最好了,這種遠程通信的機製成為RPC(RemoteProcereCall),RMI 正是朝著這個目標而誕生的。 來看下基於RMI 的一次完整的遠程通信過程的原理: 1.客戶端發起請求,請求轉交至RMI 客戶端的stub 類;2.stub 類將請求的介面、方法、參數等信息進行序列化;3.基於socket 將序列化後的流傳輸至伺服器端;4.伺服器端接收到流後轉發至相應的skelton 類;5.skelton 類將請求的信息反序列化後調用實際的處理類;6.處理類處理完畢後將結果返回給 skelton 類;7.Skelton 類將結果序列化,通過socket 將流傳送給客戶端的 stub;8.stub 在接收到流後反序列化,將反序列化後的JavaObject 返回給調用者。 根據原理來回答下之前學習應用級協議帶著的幾個問題: 1.傳輸的標准格式是什麼?是JavaObjectStream。2.怎麼樣將請求轉化為傳輸的流?基於Java 串列化機制將請求的javaobject 信息轉化為流。3.怎麼接收和處理流?根據採用的協議啟動相應的監聽埠,當有流進入後基於Java 串列化機制將流進行反序列化,並根據RMI 協議獲取到相應的處理對象信息,進行調用並處理,處理完畢後的結果同樣基於java 串列化機制進行返回。4.傳輸協議是?Socket。 XML-RPCXML-RPC 也是一種和RMI 類似的遠程調用的協議,它和RMI 的不同之處在於它以標準的 xml 格式來定義請求的信息(請求的對象、方法、參數等),這樣的好處是什麼呢,就是在跨語言通訊的時候也可以使用。 來看下XML-RPC 協議的一次遠程通信過程: 1.客戶端發起請求,按照XML-RPC 協議將請求信息進行填充;2.填充完畢後將xml 轉化為流,通過傳輸協議進行傳輸;3.接收到在接收到流後轉換為xml,按照XML-RPC 協議獲取請求的信息並進行處理;4.處理完畢後將結果按照XML- RPC 協議寫入xml 中並返回。 同樣來回答問題: 1.傳輸的標准格式是?標准格式的XML。2.怎麼樣將請求轉化為傳輸的流? 將XML 轉化為流。3.怎麼接收和處理流?通過監聽的埠獲取到請求的流,轉化為XML,並根據協議獲取請求的信息,進行處理並將結果寫入XML 中返回。4. 傳輸協議是?Http。 Binary-RPCBinary-RPC 看名字就知道和XML-RPC 是差不多的了,不同之處僅在於傳輸的標准格式由XML 轉為了二進制的格式。 同樣來回答問題: 1.傳輸的標准格式是?標准格式的二進制文件。2.怎麼樣將請求轉化為傳輸的流?將二進制格式文件轉化為流。3.怎麼接收和處理流?通過監聽的埠獲取到請求的流,轉化為二進制文件,根據協議獲取請求的信息,進行處理並將結果寫入XML 中返回。4.傳輸協議是?Http。 SOAPSOAP 原意為SimpleObjectAccessProtocol,是一個用於分布式環境的、輕量級的、基於XML 進行信息交換的通信協議,可以認為SOAP 是XMLRPC 的高級版,兩者的原理完全相同,都是http+XML,不同的僅在於兩者定義的XML 規范不同,SOAP 也是Webservice 採用的服務調用協議標准,因此在此就不多加闡述了。 (公用對象請求代理[調度]程序體系結構),是一組用來定義"分布式對象系統"的標准,由 OMG(ObjectMenagementGroup)作為發起和標准制定單位。CORBA 的目的是定義一套協議,符合這個協議的對象可以互相交互,不論它們是用什麼樣的語言寫的,不論它們運行於什麼樣的機器和操作系統。CORBA 在我看來是個類似於SOA 的體系架構,涵蓋可選的遠程通信協議,但其本身不能列入通信協議這里來講,而且CORBA 基本淘汰,再加上對CORBA 也不怎麼懂,在此就不進行闡述了。 JMSJMS 呢,是實現java 領域遠程通信的一種手段和方法,基於JMS 實現遠程通信時和RPC 是不同的,雖然可以做到RPC 的效果,但因為不是從協議級別定義的,因此我們不認為JMS 是個RPC 協議,但它確實是個遠程通信協議,在其他的語言體系中也存在著類似JMS 的東西,可以統一的將這類機制稱為消息機制,而消息機制呢,通常是高並發、分布式領域推薦的一種通信機制,這里的主要一個問題是容錯(詳細見ErLang 論文)。 來看JMS 中的一次遠程通信的過程: 1.客戶端將請求轉化為符合JMS 規定的Message;2.通過JMSAPI 將Message 放入JMSQueue 或Topic 中;3.如為JMSQueue,則發送中相應的目標Queue 中,如為Topic,則發送給訂閱了此Topic 的JMSQueue。4.處理端則通過輪訓 JMSQueue,來獲取消息,接收到消息後根據JMS 協議來解析Message 並處理。 回答問題: 1.傳輸的標准格式是?JMS 規定的Message。2.怎麼樣將請求轉化為傳輸的流?將參數信息放入Message 中即可。3.怎麼接收和處理流?輪訓JMSQueue 來接收Message,接收到後進行處理,處理完畢後仍然是以Message 的方式放入 Queue 中發送或Multicast。4.傳輸協議是?不限。 基於JMS 也是常用的實現遠程非同步調用的方法之一。
『叄』 java的遠程調試是基於什麼協議
RMI是java語言本身提供的遠程通訊協議,穩定高效,是EJB的基礎。但它只能用於JAVA程序之間的通訊。
Hessian和Burlap是caucho公司提供的開源協議,基於HTTP傳輸,服務端不用開防火牆埠。協議的規范公開,可以用於任意語言。
Httpinvoker是SpringFramework提供的遠程通訊協議,只能用於JAVA程序間的通訊,且服務端和客戶端必須使用SpringFramework。
Web service是連接異構系統或異構語言的首選協議,它使用SOAP形式通訊,可以用於任何語言,目前的許多開發工具對其的支持也很好。
RMI > Httpinvoker >= Hessian >> Burlap >> web service
RMI不愧是JAVA的首選遠程調用協議,非常高效穩定,特別是在大數據量的情況下,與其他通訊協議的差距尤為明顯。
HttpInvoker使用java的序列化技術傳輸對象,與RMI在本質上是一致的。從效率上看,兩者也相差無幾,HttpInvoker與RMI的傳輸時間基本持平。
Hessian在傳輸少量對象時,比RMI還要快速高效,但傳輸數據結構復雜的對象或大量數據對象時,較RMI要慢20%左右。
Burlap僅在傳輸1條數據時速度尚可,通常情況下,它的毫時是RMI的3倍。
Web Service的效率低下是眾所周知的,平均來看,Web Service的通訊毫時是RMI的10倍。
二、結果分析
1、直接調用
直接調用的所有毫時都接近0,這說明程序處理幾乎沒有花費時間,記錄的全部時間都是遠程調用耗費的。
2、RMI調用
與設想的一樣,RMI理所當然是最快的,在幾乎所有的情況下,它的毫時都是最少的。特別是在數據結構復雜,數據量大的情況下,與其他協議的差距尤為明顯。
為了充分發揮RMI的性能,另外做了測試類,不使用Spring,用原始的RMI形式 (繼承UnicastRemoteObject對象)提供服務並遠程調用,與Spring對POJO包裝成的RMI進行效率比較。結果顯示:兩者基本持 平,Spring提供的服務還稍快些。
初步認為,這是因為Spring的代理和緩存機制比較強大,節省了對象重新獲取的時間。
3、Hessian調用
caucho公司的resin伺服器號稱是最快的伺服器,在java領域有一定的知名 度。Hessian做為resin的組成部分,其設計也非常精簡高效,實際運行情況也證明了這一點。平均來看,Hessian較RMI要慢20%左右,但 這只是在數據量特別大,數據結構很復雜的情況下才能體現出來,中等或少量數據時,Hessian並不比RMI慢。
Hessian的好處是精簡高效,可以跨語言使用,而且協議規范公開,我們可以針對任意語言開發對其協議的實現。目前已有實現的語言有:java, c++, .net, python, ruby。還沒有delphi的實現。
另外,Hessian與WEB伺服器結合非常好,藉助WEB伺服器的成熟功能,在處理大 量用戶並發訪問時會有很大優勢,在資源分配,線程排隊,異常處理等方面都可以由成熟的WEB伺服器保證。而RMI本身並不提供多線程的伺服器。而 且,RMI需要開防火牆埠,Hessian不用。
4、Burlap調用
Burlap與Hessian都是caucho公司的開源產品,只不過Hessian採用二進制的方式,而Burlap採用xml的格式。
測試結果顯示,Burlap在數據結構不復雜,數據量中等的情況下,效率還是可以接受的,但如果數據量大,效率會急劇下降。平均計算,Burlap的調用毫時是RMI的3倍。
我認為,其效率低有兩方面的原因,一個是XML數據描述內容太多,同樣的數據結構,其傳輸量要大很多;另一方面,眾所周知,對xml的解析是比較費資源的,特別對於大數據量情況下更是如此。
5、HttpInvoker調用
HttpInvoker是SpringFramework提供的JAVA遠程調用方法,使用java的序列化機制處理對象的傳輸。從測試結果看,其效率還是可以的,與RMI基本持平。
不過,它只能用於JAVA語言之間的通訊,而且,要求客戶端和服務端都使用SPRING框架。
另外,HttpInvoker 並沒有經過實踐的檢驗,目前還沒有找到應用該協議的項目。
6、web service調用
本次測試選用了apache的AXIS組件作為WEB SERVICE的實現,AXIS在WEB SERVICE領域相對成熟老牌。
為了僅測試數據傳輸和編碼、解碼的時間,客戶端和服務端都使用了緩存,對象只需實例化一次。但是,測試結果顯示,web service的效率還是要比其他通訊協議慢10倍。
如果考慮到多個引用指向同一對象的傳輸情況,web service要落後更多。因為RMI,Hessian等協議都可以傳遞引用,而web service有多少個引用,就要復制多少份對象實體。
Web service傳輸的冗餘信息過多是其速度慢的原因之一,監控發現,同樣的訪問請求,描述相同的數據,web service返回的數據量是hessian協議的6.5倍。另外,WEB SERVICE的處理也很毫時,目前的xml解析器效率普遍不高,處理xml <-> bean很毫資源。從測試結果看,異地調用比本地調用要快,也從側面說明了其毫時主要用在編碼和解碼xml文件上。這比冗餘信息更為嚴重,冗餘信息佔用的 只是網路帶寬,而每次調用的資源耗費直接影響到伺服器的負載能力。(MS的工程師曾說過,用WEB SERVICE不能負載100個以上的並發用戶。)
測試過程中還發現,web service編碼不甚方便,對非基本類型需要逐個注冊序列化和反序列化類,很麻煩,生成stub更累,不如spring + RMI/hessian處理那麼流暢簡潔。而且,web service不支持集合類型,只能用數組,不方便。
ITjob學。到的
『肆』 java如何遠程調用。。。。。。。。。
RMI遠程調用。你查一下這個。
或是webservices
下邊是一個例子,運行server,
再運行client,可以得到對象。
-------------------------------------------------------
import java.rmi.Remote;
import java.rmi.registry.LocateRegistry;
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Server {
public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(2099);
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.rmi.registry.RegistryContextFactory");
System.setProperty(Context.PROVIDER_URL, "rmi://localhost:2099");
Context ctx = new InitialContext();
ctx.bind("systemStartTime", new RemoteDate());
ctx.close();
while (true)
Thread.sleep(1000);
}
}
class RemoteDate extends Date implements Remote {
}
--------------------
import java.util.Date;
import javax.naming.Context;
import javax.naming.InitialContext;
public class Client {
public static void main(String[] args) throws Exception {
Context ctx = new InitialContext();
Date startTime = (Date) ctx
.lookup("rmi://localhost:2099/systemStartTime");
System.out.println(startTime);
}
}
『伍』 java遠程調用
這個可能純 java 有點毛病,一般這得用 UDP 做。每個包在底層會有些協議數據可用,而這些到了 java 層就沒有了。你只需要知道這個數據包從你發出時是什麼時間,蓋個章,到了客戶端,它從協議數據中知道這個包共花了多少時間才到達。
『陸』 java中遠程調用servlet是怎麼解決
在J2EE世界中要實現遠程方法調用的手段很多,如Spring:Hessian/Burlap, RMI, and JAX-RPC, JMS ,webservice。等等,你可能有過編寫EJB的經驗或對RMI有所了解,如果你使用過Spring框架的遠程調用,你可能你各種遠程調用方法就比較清楚和了解,可是你未必嘗試過一切都是自己構造來實現遠程調用,這里我們嘗試同過編寫一個簡單的Servlet(極其簡單)通過http實現遠程方法調用。希望對於servlet你有一個新的認識,在下一篇文章中,我會嘗試給你另一個servlet的新的應用。[@more@]讓我們先從這個servlet開始:
public class RemoteServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,java.io.IOException{
System.out.print("BaseDataServlet service received a remote request");
ObjectInputStream in = new ObjectInputStream(req.getInputStream());
resp.setContentType("application/octest-stream");
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(byteout);
Request request;
try {
request = (Request)in.readObject();//讀取遠程調用請求的封裝對象
//System.out.println(":n"+request.toString()); RequestProcessor processor=new RequestProcessor();//請求解析對象 out.writeObject(processor.processorLocalhost(request));//執行請求並回寫結果 out.flush();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
『柒』 用java 怎麼調用遠程計算機上的一個程序啊
如果是a要調b的服務就用webservice,可以用axis2,CXF,xfire;反過來如果b調用a,可以用rmi遠程方法調用,這可以讓你調用遠程jvm內的類。
『捌』 Java Linux遠程調用win執行UI
java通過winrm4j遠程連接win執行命令
在Linux /UNIX/WINDOWS系統中,一般通過遠程連接的方式在遠端執行腳本命令或者其他,是通過SSH或者Telnet。筆者之前寫過幾遍運用JAVA使用SSH或者TELNET連接操作系統執行命令的博客。但這些協議之間存在的差別的。
在LINUX、UNIX系統中一般通過SSH協議來登錄、執行命令;
而在Windows操作系統中,由於沒有自帶SSH協議,一般通過Telnet協議去登錄、執行命令;但是Telnet服務默認是不開啟的。所以在大規模環境中,操作比較麻煩。另外Telnet協議存在安全問題。
如果不需要執行命令,而是通過遠程桌面的形式來操作windows,可以使用RDP協議,java有一個開源的項目properJavaRDP,可以在web頁面或者GUI形式提供實現方案。
『玖』 java 遠程調用,具體實現
1、使用java代碼通過ssh登陸linux並執行命令,正常情況下sshd服務都會有,知道用戶密碼就可以使用這種方式了。
2、要在遠程linux伺服器上執行命令,可以在linux伺服器上啟動一個服務做執行腳本的代理,不斷接受來自你這個項目發來的腳本信息,然後執行,再把結果返回給你項目中去。
第一種:以消息隊列的方式發送這些腳本信息,linux代理不斷接受,並返回結果。項目同時要不斷接受結果。
第二種:項目中產生的腳本,直接記錄到資料庫,linux上的代理訪問這個資料庫,獲取腳本信息,並將執行結果寫入資料庫。項目中輪詢執行結果。
上面我說的消息隊列可以採用activemq,或者rabbitmq這些。
命令執行,java中直接Runtime.getRuntime().exec(command);就行了。
『拾』 java為什麼要用遠程調用
因為提供服務的機器和需要服務的機器一般都不是一台。兩台機器需要進行數據傳輸,所以需要遠程過程調用,簡稱RPC