java遠程調用接口的原理和范例,謝謝
java遠程調用接口的原理和范例,謝謝
Java 遠程處理 Java遠程方法調用(RMI)提供了Java程序語言的遠程通訊功能,這種特性使客戶機上運行的程序可以調用遠程服務器上的對象,使Java編程人員能夠在**環(huán)境中分布操作。 創(chuàng)建一個簡單的Java分布式遠程方法調用程序可以按以下幾個步驟操作, 一、定義遠程接口: 在 Java 中,遠程對象是實現遠程接口的類的實例, 遠程接口聲明每個要遠程調用的方法。
在需要創(chuàng)建一個遠程對象的時候,我們通過傳遞一個接口來隱藏基層的實施細節(jié),客戶通過接口句柄發(fā)送消息即可。
遠程接口具有如下特點: 1) 遠程接口必須為public屬性。如果不這樣,除非客戶端與遠程接口在同一個包內,否則 當試圖裝入實現該遠程接口的遠程對象時,調用會得到錯誤結果。 2) 遠程接口必須擴展接口java.rmi.Remote。 3) 除與應用程序本身特定的例外之外,遠程接口中的每個方法都必須在自己的throws從句中 聲明java.rmi.RemoteException。
(或 RemoteException 的父類)。 4) 作為參數或返回值傳遞的一個遠程對象(不管是直接,還是本地對象中嵌入)必須聲明為遠 程接口,而不應聲明為實施類。 下面是遠程接口的定義[java] view plaincopypackage test; import java.rmi.Remote; import java.rmi.RemoteException; import java.math.BigInteger; public interface Fib extends Remote { public int getFib(int n) throws RemoteException; // public BigInteger getFib(BigInteger n) throws RemoteException; } 二、實現遠程接口: 遠程對象實現類必須擴展遠程對象java.rmi.UnicastRemoteObject類,并實現所定義的遠程接口。
遠程對象的實現類中包含實現每個遠程接口所指定的遠程方法的代碼。這個類也可以含有附加的方法,但客戶只能使用遠程接口中的方法。因為客戶是指向接口的一個句柄,而不是它的哪個類。
必須為遠程對象定義構造函數,即使只準備定義一個默認構造函數,用它調用基礎類構造函數。因為基礎類構造函數可能會拋出 java.rmi.RemoteException,所以即使別無它用必須拋出java.rmi.RemoteException例外。 以下是遠程對象實現類的聲明:[java] view plaincopypackage test; import java.math.BigInteger; import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class FibImp extends UnicastRemoteObject implements Fib { public FibImp() throws RemoteException { super(); } public int getFib(int n) throws RemoteException { return n+2; } } 三、編寫服務器類: 包含 main 方法的類可以是實現類自身,也可以完全是另一個類。
下面通過RmiSampleServer 來創(chuàng)建一個遠程對象的實例,并通過java.rmi.registry.LocateRegistry類的createRegistry 方法從指定端口號啟動注冊服務程序,也可以通過執(zhí)行 rmiregistry 命令啟動注冊服務程序,注冊服務程序的缺省運行端口為 1099。必須將遠程對象名字綁定到對遠程對象的引用上: Naming.rebind(\”//localhost:8808/SAMPLE-SERVER\” , Server); 以下是服務器類的聲明:[java] view plaincopypackage test; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; public class FibonacciServer { /** * @param args */ public static void main(String[百科] args) { try { LocateRegistry.createRegistry(8804); FibImp f = new FibImp(); // 注冊到 registry 中 Naming.rebind(\”//localhost:8804/SAMPLE-SERVER\”, f); System.out.println(\”fib server ready\”); } catch (RemoteException re) { System.out.println(\”Exception in FibonacciImpl.main: \” + re); } catch (MalformedURLException e) { System.out.println(\”MalformedURLException \” + e); } } } 四、編寫使用遠程服務的客戶機類: 客戶機類的主要功能有兩個,一是通過Naming.lookup方法來構造注冊服務程序 stub 程序實例,二是調用服務器遠程對象上的遠程方法。
遠程接口調用有哪些方法
我來談談自己的看法。–由于一個企業(yè)級的應用,他比較大,然后EJB是部署在某個服務器上,提供一個遠程調用的接口,內部一套你設計的流程來組織數據,反饋給調用的地方。
如何調用呢?一般是WEB APP,直接調用它的一個借口類,EJB必須發(fā)布成JAR包,包含在WEB-APP里面。
調用的時候,才能夠找到EJB中對應的方法這些。–EJB組件式獨立部署的。做幾個小東西,嚴格的按照流程,發(fā)布到不同的服務器上,體會下吧。
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 objectCall soapCall = new Call();// Use SOAP encodingsoapCall.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);// This is the remote object we\’re asking for the pricesoapCall.setTargetObjectURI(\”urn:xmethods-caSynrochnized\”);// This is the name of the method on the above objectsoapCall.setMethodName(\”getUser\”);// We need to send the ISBN number as an input parameter to the methodVector soapParams = new Vector();// name, type, value, encoding styleParameter i**nParam = new Parameter(\”userName\”, String.class, user, null);soapParams.addElement(i**nParam);soapCall.setParams(soapParams);try {// Invoke the remote method on the objectResponse 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 resultParameter soapResult = soapResponse.getReturnValue ();// get a string from the resultreturn 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.a**x.WSDL原本的網址是http://www.webservicex.net/globalweather.a**x?WSDL,中間個各問號,但是Linux下面它不能解析,所以去掉問號,改為點號。那么就會出現4個文件:GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java其中GlobalWeatherSoap.java是我們最為關心的接口文件,如果你對RMI等SOAP實現的具體細節(jié)不感興趣,那么你只需要看接口文件即可,在使用的時候,引入這個接口即可,就好像使用本地類一樣。
SpringBoot如何使用Feign實現遠程接口調用
什么是Feign?與 Ribbon ?樣,Feign 也是由 Netflflix 提供的,Feign 是?個聲明式、模版化的 Web Service 客戶端,它簡化了開發(fā)者編寫 Web 服務客戶端的操作,開發(fā)者可以通過簡單的接?和注解來調? HTTP API, Spring Cloud Feign,它整合了 Ribbon 和 Hystrix,具有可插拔、基于注解、負載均衡、服務熔斷等?系列便捷功能。 (1)Feign 是?個聲明式的 Web Service 客戶端; (2)?持 Feign 注解、Spring MVC 注解、JAX-RS 注解; (3)Feign 基于 Ribbon 實現,使?起來更加簡單; (4)Feign 集成了 Hystrix,具備服務熔斷降級的功能。
pom.xml application.yaml User UserController 啟動類 瀏覽器訪問 : http://localhost:8081/api/server/getUserInfo pom.xml application.yaml UserFeignClient TestController 啟動類 瀏覽器訪問: http://localhost:8082/api/client/get 這樣就實現了通過feign client來調用遠程(第三方)接口了。
如何調用別人寫好的接口
下面是一個例子,要根據你自己的接口來顯示調用using System;using System.Collections.Generic;using System.Text;//顯示接口實現namespace interfaceDemo{ public interface InterfaceA { void MethodA();//抽象方法 void MethodB();// } public interface InterfaceB { void MethodB();//抽象方法,與interfaceA接口方法同名 void MethodC(); } public class ClassC : InterfaceA, InterfaceB { public void MethodA()//實現接口中的方法 { Console.WriteLine(\”實現接口InterfaceA的MethodA方法\”); } public void MethodC()//實現接口中的方法 { Console.WriteLine(\”實現接口InterfaceB的MethodC方法\”); } void InterfaceA.MethodB()//顯示地指明實現的是那個接口的方法,注意不能有public { Console.WriteLine(\”實現接口InterfaceA的MethodB方法\”); } void InterfaceB.MethodB()//顯示地指明實現的是那個接口的方法,注意不能有public { Console.WriteLine(\”實現接口InterfaceB的MethodB方法\”); } } class ShowInterfaceImplement//測試類 { static void Main(string[] args) { ClassC c = new ClassC();//實例化對象 c.MethodA(); c.MethodC(); //顯示接口實現 InterfaceA interA=new ClassC();//接口通過實現接口的類進行實例化 interA.MethodB();//調用接口A的方法 InterfaceB interB=new ClassC(); interB.MethodB();//調用接口B的方法 Console.ReadLine(); } }}