真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javarpc實(shí)戰(zhàn)代碼 javacpp

java webservice例子,例子完整,最好有注釋,demo也行!但是一定要完整!謝謝!

剛好 我這兩天也在學(xué)webservice,給你一個(gè)我才學(xué)的例子

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、南譙ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的南譙網(wǎng)站制作公司

1.解壓axis壓縮包,然后解壓,取出里面的webapps里面的axis項(xiàng)目放到tomcat中的webapps中,然后啟動(dòng)tomcat

項(xiàng)目的發(fā)布有兩種形式

1.即時(shí)發(fā)布

直接在axis中放置java源文件,注意后綴名字改為.jws.注意源文件中不要有任何的導(dǎo)包語(yǔ)句

詳細(xì)步驟如下

1.直接在axis目錄下編寫java源文件,寫好后把后綴名改為jws。如Demo.jws

2.重啟動(dòng)服務(wù)器,在瀏覽器中輸入,點(diǎn)開(kāi)后得到一個(gè)網(wǎng)址

3.在myeclipse中導(dǎo)入網(wǎng)址,可以執(zhí)行里面的方法就可以了。

2.定制發(fā)布

編寫要發(fā)布為服務(wù)器javaBean

編寫生成class文件放在tomcat中的axis中的webinf中的classes中

編寫deploy.wsdd文件描述服務(wù)器的名稱入口等信息。

詳細(xì)步驟

以一個(gè)add為例子

1.編寫javaBean代碼

public class add {

public Integer getAdd(Integer a, Integer b){

return a+b;

}

}

2.將class文件放入axis中的webinf下的classes中

注意,如果該類有包的話,就要建立相應(yīng)的文件名,如

package com.ssh.webservice

那么classes文件下就要有相應(yīng)的com文件夾,ssh文件夾,webservice文件夾

3.寫上他的描述文件wsdd文件

描述文件直接放到classes中即可,名字為deploy.wsdd,文件為

deployment xmlns="" xmlns:java=""

service name="Add" provider="java:RPC"

list中顯示的名字

parameter name="className" value="add"/

調(diào)用的類

parameter name="allowedMethods" value="*"/

指定調(diào)用的方法

/service

/deployment

4.編寫批處理文件.bat文件,如下

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\axis.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\axis-ant.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\commons-discovery-0.2.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\commons-logging-1.0.4.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\jaxrpc.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\log4j-1.2.8.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\lib\saaj.jar;

set classpath=%classpath%;E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\libwsdl4j-1.5.1.jar

java org.apache.axis.client.AdminClient E:\ur2001Tomcat\apache-tomcat-6.0.32\webapps\axis\WEB-INF\classes\deploy.wsdd

然后運(yùn)行該批處理文件

5.啟動(dòng)服務(wù)器,在瀏覽器中輸入項(xiàng)目的發(fā)布地址,如就會(huì)有已個(gè)list,然后點(diǎn)進(jìn)方法

6.編寫客戶端代碼,如下

package com.ssh.client;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import javax.xml.namespace.QName;

public class TestClient

{

public static void main(String [] args) {

try {

String endpoint =

"";

這個(gè)地址是值xml文件中的最后一行的local地址

Service service = new Service();

Call call = (Call) service.createCall();

call.setTargetEndpointAddress( new java點(diǎn)虐 .URL(endpoint) );

call.setOperationName(new QName("getMessage") );

指定調(diào)用的方法

String ret = (String) call.invoke( new Object[] { } );

如果有參數(shù)需要傳入的話直接在括號(hào)里面寫上1,2,2等

System.out.println(ret);

} catch (Exception e) {

System.err.println(e.toString());

}

}

}

我這里還有webservice的教學(xué)視屏,要的話說(shuō)一聲

java protobuf 定義rpc服務(wù)怎么調(diào)用

1.,選擇其中的win版本下載,我選擇的是protoc-2.4.1-win32.zip

2.下載一個(gè)protobuf-java-2.4.1.jar文件(注意,要與你剛才下的proto.exe版本相同)

然后就開(kāi)始開(kāi)發(fā)了。

步驟:

1.用記事本編寫一個(gè).proto文件:

}如:編寫的是test.proto

package protobuf;

option java_package = "com.sq.protobuf";

option java_outer_classname = "FirstProtobuf";

message testBuf {

required int32 ID = 1;

required string Url = 2;

}

將其放在與剛解壓的protoc.exe同級(jí)目錄中。

2.在cmd中,到protoc-2.4.1-win32文件夾下,

執(zhí)行

E:\protoc-2.4.1-win32 protoc.exe --java_out=./ test.proto

則可以找到的一個(gè)生成的FirstProtobuf.java文件。

3.在MyEclipse中新建一個(gè)java project,建立包c(diǎn)om.sq.protobuf,然后將剛才生成的FirstProtobuf.java文件放在其下面。

此時(shí)會(huì)報(bào)錯(cuò),因?yàn)闆](méi)有引入jar包,在package視圖下,將protobuf-java-2.4.1.jar引入,即可解決問(wèn)題。

jsonrpc java怎么運(yùn)行

JSON-RPC-Java 由兩個(gè)對(duì)用戶可視化的組件構(gòu)成,它們是JSONRPCBridge和JSONRPCServlet,二者的協(xié)調(diào)實(shí)現(xiàn)了JSON服務(wù)器端對(duì)請(qǐng)求對(duì)象的處理,并響應(yīng)給用戶。

JSONRPCBridge是一個(gè)擁有服務(wù)器端導(dǎo)出給特定客戶端的對(duì)象的引用的session對(duì)象,它接收服務(wù)器(也就是JSONRPCServlet)傳來(lái)的JSON-RPC請(qǐng)求,然后其把JSON對(duì)象解碼(unmarshalling)為Java對(duì)象,再扮演方法調(diào)用的角色,還要把方法調(diào)用返回的Java對(duì)象結(jié)果組碼(marshall)為JSON對(duì)象傳給客戶端處理。而具體的從Java對(duì)象到Javascript對(duì)象的類型轉(zhuǎn)換由負(fù)責(zé)串行化的串行化類Serializer處理。

JSONRPCBridge必須放置在HttpSession對(duì)象中,并且注冊(cè)屬性名為“JSONRPCBridge”,以使JSONRPCServlet能夠定位負(fù)責(zé)調(diào)用導(dǎo)出到客戶端的Java對(duì)象的橋。為此,為了導(dǎo)出一個(gè)對(duì)象的所有實(shí)例和靜態(tài)方法到客戶端,應(yīng)該有如下的代碼: JSONRPCBridge.registerObject("myObject", myObject);

為了導(dǎo)出一個(gè)類的所有的靜態(tài)方法,應(yīng)該:JSONRPCBridge.registerClass(("myObject", myObject);

如果registerObject和registerClass被多次調(diào)用為有相同鍵值的對(duì)象使用,那么其將被最新賦值的對(duì)象所更新。

在JSON中,還可以使用單例模式的globalBridge來(lái)為所有的HTTP客戶端導(dǎo)出所有的實(shí)例方法。其可以用來(lái)注冊(cè)工廠類,但使用時(shí)要注意認(rèn)證與安全問(wèn)題。使用時(shí)如下標(biāo)識(shí):JSONRPCBridge.getGlobalBridge().registerObject("myObject",myObject); 同上其還可以導(dǎo)出所有的靜態(tài)方法。

該協(xié)議中最重要的一部分還有就是Servlet了,現(xiàn)在就來(lái)簡(jiǎn)單的介紹一下:

在該協(xié)議中,JSONRPCServlet充當(dāng)傳送器,處理通過(guò)HTTP傳輸過(guò)來(lái)的JSON

如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的RPC框

0,服務(wù)接口定義---Echo.java

/*

* 定義了服務(wù)器提供的服務(wù)類型 */public interface Echo { ? ?public String echo(String string);

}

一,客戶端代碼分析--實(shí)現(xiàn)類:MainClient.java

客戶端實(shí)現(xiàn)包括:獲得一個(gè)代理對(duì)象,并使用該代理對(duì)象調(diào)用服務(wù)器的服務(wù)。獲取代理對(duì)象時(shí),需要指定被代理的類(相當(dāng)于服務(wù)器端提供的服務(wù)名),Server IP,Port,這樣客戶端就能找到服務(wù)端的服務(wù)了。

延伸:分布式環(huán)境下,Client如何打到Server的服務(wù)?---因?yàn)?,在服?wù)器中運(yùn)行的某些服務(wù)不像標(biāo)準(zhǔn)服務(wù)有著固定的端口,如HTTP的80端口。

一種解決方法是:在運(yùn)行服務(wù)的每臺(tái)機(jī)器上都運(yùn)行一個(gè)特殊的守護(hù)進(jìn)程,該守護(hù)進(jìn)程負(fù)責(zé)跟蹤位于該機(jī)器中每一項(xiàng)服務(wù)所使用的端口;此外,守護(hù)進(jìn)程還監(jiān)聽(tīng)一個(gè)特定的已經(jīng)端口,Client通過(guò)這個(gè)端口與守護(hù)進(jìn)程聯(lián)系,請(qǐng)求得到指定服務(wù)的端口。

復(fù)雜的RPC實(shí)現(xiàn)框架中,比如可以把服務(wù)注冊(cè)到ZooKeeper中,Client也從ZooKeeper中查詢服務(wù)。參考:一個(gè)更復(fù)雜的RPC框架實(shí)現(xiàn)

Echo echo = RPC.getProxy(Echo.class, "127.0.0.1", 20382);

System.out.println(echo.echo("hello,hello"));//使用代理對(duì)象調(diào)用服務(wù)器的服務(wù).并將結(jié)果輸出

二,服務(wù)器端分析--實(shí)現(xiàn)類:MainServer.java

服務(wù)器實(shí)現(xiàn)包括:創(chuàng)建一個(gè)服務(wù)器對(duì)象,將它能提供的服務(wù)注冊(cè),并啟動(dòng)進(jìn)程監(jiān)聽(tīng)客戶端的連接

Server server = new RPC.RPCServer(); ? ? ? ?/*

* server 啟動(dòng)后,需要注冊(cè)server端能夠提供的服務(wù),這樣client使用 服務(wù)的名字、

* 服務(wù)器的IP、以及服務(wù)所運(yùn)行的端口 來(lái)調(diào)用 server 的服務(wù) ? ? ? ? */

server.register(Echo.class, RemoteEcho.class);//注冊(cè)服務(wù)的名字

server.register(AnOtherEchoService.class, AnOtherEchoServiceImpl.class);

server.start();//啟動(dòng)server

三,服務(wù)器監(jiān)聽(tīng)Client連接分析----實(shí)現(xiàn)類:Listener.java

當(dāng)server.start()后,它要?jiǎng)?chuàng)建一個(gè)Listener對(duì)象,這是一個(gè)線程類,該線程用來(lái)監(jiān)聽(tīng)Client連接。

public void start() {

System.out.println("啟動(dòng)服務(wù)器");

/*

* server 啟動(dòng)時(shí),需要Listener監(jiān)聽(tīng)是否有client的請(qǐng)求連接

* listener 是一個(gè)線程,由它來(lái)監(jiān)聽(tīng)連接 ? ? ? ? ? ? */

listener = new Listener(this); ? ? ? ? ? ?this.isRuning = true;

listener.start();//listener 是一個(gè)線程類,start()后會(huì)執(zhí)行線程的run方法

}

其實(shí),監(jiān)聽(tīng)連接就是JAVA ServerSocket類和Socket類提供的相關(guān)功能而已。

/*

* accept()是一個(gè)阻塞方法,server_socket 一直等待client 是否有連接到來(lái) */

Socket client = server_socket.accept();//建立一條TCP連接

四,動(dòng)態(tài)代理對(duì)象 生成---RPC.java

客戶端只需要編寫生成代理對(duì)象,用代理對(duì)象去調(diào)用遠(yuǎn)程服務(wù)的代碼即可。但是,底層的功能如:建立連接,序列化(本例中也沒(méi)有考慮),跨語(yǔ)言調(diào)用(未考慮)...是由RPC框架完成的。

當(dāng)MainClient 語(yǔ)句:RPC.getProxy(Echo.class, "127.0.0.1", 20382);執(zhí)行時(shí),會(huì)由

/*

* @param Class[]{} 該參數(shù)聲明了動(dòng)態(tài)生成的代理對(duì)象實(shí)現(xiàn)了的接口,即 clazz 所代表的接口類型 .

* 這表明了生成的代理對(duì)象它是一個(gè)它所實(shí)現(xiàn)了的接口類型的對(duì)象

* 從而就可以用它來(lái)調(diào)用它所實(shí)現(xiàn)的接口中定義的方法

*

* @param handler 生成代理實(shí)例對(duì)象時(shí)需要傳遞一個(gè)handler參數(shù)

* 這樣當(dāng)該 代理實(shí)例對(duì)象調(diào)用接口中定義的方法時(shí),將會(huì)委托給InvocationHandler 接口中聲明的invoke方法

* 此時(shí),InvocationHandler 的invoke 方法將會(huì)被自動(dòng)調(diào)用 ? ? ? ? */

T t = (T) Proxy.newProxyInstance(RPC.class.getClassLoader(), new Class[] {clazz}, handler); ? ? ? ?return t;

返回該代理對(duì)象,然后就會(huì)委托第三個(gè)參數(shù) handler 自動(dòng)執(zhí)行 invoke(),invoke將客戶端調(diào)用的所有相關(guān)信息封裝到Invocation 對(duì)象中(后面分析)。然后執(zhí)行第16行代碼發(fā)起連接。

1 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 2 ? ? ? ? ? ? ? ? Invocation invo = new Invocation(); 3 ?? ? ? ? ? ? ? ?invo.setInterfaces(clazz); 4 ? ? ? ? ? ? ? ? ?5 ? ? ? ? ? ? ? ? //利用反射機(jī)制將java.lang.reflect.Method 所代表的方法名,參數(shù) 封裝到 Invocation invo對(duì)象中 6 ? ? ? ? ? ? ? ? invo.setMethod(new org.jy.rpc.protocal.Method(method.getName(),method.getParameterTypes())); 7 ?? ? ? ? ? ? ? ?invo.setParams(args); 8 ? ? ? ? ? ? ? ? ?9 ? ? ? ? ? ? ? ? /*10 ?? ? ? ? ? ? ? ? * 當(dāng)把需要調(diào)用的遠(yuǎn)程server端的方法名和參數(shù)封裝到invo之后,Client 對(duì)象 就可以把 invo 作為參數(shù) 傳遞給服務(wù)器了.11 ?? ? ? ? ? ? ? ? * 為什么需要這樣做呢?InvocationHandler 的invoke方法是自動(dòng)執(zhí)行的,在該方法里面,它根據(jù)生成的代理對(duì)象 proxy (第一個(gè)參數(shù))12 ?? ? ? ? ? ? ? ? * 所實(shí)現(xiàn)的接口(由 Proxy.newProxyInstance()的第二個(gè)參數(shù)指定) 就可以知道這個(gè)接口中定義了哪些方法13 ?? ? ? ? ? ? ? ? * InvocationHandler 的 invoke 方法的第二個(gè)參數(shù)Method method 就可以解析出接口中的方法名和參數(shù)了14 ?? ? ? ? ? ? ? ? * 把它們封裝進(jìn)Invocation invo對(duì)象中,再將 invo 作為 client.invoke(invo)的參數(shù) 發(fā)送到服務(wù)器方15 ? ? ? ? ? ? ? ? ?*/16 ? ? ? ? ? ? ? ? client.invoke(invo);//invoke 先調(diào)用init發(fā)起一個(gè)Socket連接,再將invo 發(fā)送至輸出流中17 ? ? ? ? ? ? ? ? return invo.getResult();18 ? ? ? ? ? ? }

五,“客戶端存根”--Client.java

最重要的是它的 invoke方法(注意與InvocationHandler的invoke()區(qū)分)。它負(fù)責(zé)建立連接,打開(kāi)輸入、輸出流,向服務(wù)器發(fā)送字節(jié)數(shù)據(jù)。

1 ? ? public void invoke(Invocation invo) throws UnknownHostException, IOException, ClassNotFoundException {2 ?? ? ? ?init();3 ? ? ? ? System.out.println("寫入數(shù)據(jù)");4 ? ? ? ? oos.writeObject(invo);//將Client 需要調(diào)用的Server的 接口、方法、參數(shù) 封裝起來(lái) 發(fā)給服務(wù)器5 ?? ? ? ?oos.flush();6 ? ? ? ? ois = new ObjectInputStream(socket.getInputStream());//用來(lái)接收從 server 返回 回來(lái)的執(zhí)行結(jié)果 的輸入流7 ? ? ? ? Invocation result = (Invocation) ois.readObject();8 ? ? ? ? invo.setResult(result.getResult());//將結(jié)果 保存到 Invocation result對(duì)象中9 ? ? }

六,“服務(wù)器存根“---實(shí)現(xiàn)類:RPCServer.java

上面提到,服務(wù)器通過(guò)Listener監(jiān)聽(tīng)客戶端連接,當(dāng)建立客戶端連接后,Socket client = server_socket.accept(); 不再阻塞,服務(wù)器調(diào)用它的call()方法完成客戶端請(qǐng)求的功能。也即,客戶端請(qǐng)求的結(jié)果實(shí)際上是在服務(wù)器執(zhí)行生成的。返回的結(jié)果是在Client.java 的 invoke() 方法里被讀取出來(lái) 。call()再一次用到了JAVA反射(第11行) 參考:JAVA動(dòng)態(tài)代理

1 public void call(Invocation invo) { 2 ?? ? ? ? ? ?System.out.println(invo.getClass().getName()); 3 ? ? ? ? ? ? Object obj = serviceEngine.get(invo.getInterfaces().getName()); 4 ? ? ? ? ? ? if(obj!=null) { 5 ? ? ? ? ? ? ? ? try { 6 ? ? ? ? ? ? ? ? ? ? Method m = obj.getClass().getMethod(invo.getMethod().getMethodName(), invo.getMethod().getParams()); 7 ? ? ? ? ? ? ? ? ? ? /* 8 ?? ? ? ? ? ? ? ? ? ? * 利用JAVA反射機(jī)制來(lái)執(zhí)行java.lang.reflect.Method 所代表的方法 9 ?? ? ? ? ? ? ? ? ? ? * @param result : 執(zhí)行實(shí)際方法后 得到的 服務(wù)的執(zhí)行結(jié)果10 ? ? ? ? ? ? ? ? ? ? ?*/11 ? ? ? ? ? ? ? ? ? ? Object result = m.invoke(obj, invo.getParams());12 ? ? ? ? ? ? ? ? ? ? invo.setResult(result);//將服務(wù)的執(zhí)行結(jié)果封裝到invo對(duì)象中。在后面的代碼中,將該對(duì)象寫入到輸出流中13 ? ? ? ? ? ? ? ? } catch (Throwable th) {14 ?? ? ? ? ? ? ? ? ? ?th.printStackTrace();15 ?? ? ? ? ? ? ? ?}16 ? ? ? ? ? ? } else {17 ? ? ? ? ? ? ? ? throw new IllegalArgumentException("has no these class");18 ?? ? ? ? ? ?}19 ? ? ? ? }

七,”RPC 編碼、解碼,協(xié)議的定義“---Invocation.java?? Method.java

其實(shí),這里并不是那種實(shí)用的開(kāi)源RPC框架如Thrift中所指的編碼、IDL……上面兩個(gè)類只是RPC實(shí)現(xiàn)過(guò)程中輔助完成Java動(dòng)態(tài)代理的實(shí)現(xiàn),說(shuō)白了就是封裝客戶端需要調(diào)用的方法,然后指定生成的代理對(duì)象需要實(shí)現(xiàn)的接口(服務(wù)).

八,總結(jié):

先運(yùn)行MainServer.java啟動(dòng)服務(wù)器,然后,再運(yùn)行MainClient.java 啟動(dòng)一個(gè)客戶端連接服務(wù)器就可以看到執(zhí)行結(jié)果。

當(dāng)需要添加新的服務(wù)時(shí):按以下步驟即可:①定義服務(wù)接口及其實(shí)現(xiàn)類,如:AnOtherEchoService.java? ②:在MainServer.java中注冊(cè)新添加的服務(wù)。

③:在MainClient.java中編寫獲得新服務(wù)的代理對(duì)象的代碼,并用該代理對(duì)象調(diào)用新服務(wù)接口中聲明的方法。

這樣,在客戶端就能夠遠(yuǎn)程地調(diào)用服務(wù)器上的一個(gè)新服務(wù)了。


標(biāo)題名稱:javarpc實(shí)戰(zhàn)代碼 javacpp
網(wǎng)頁(yè)地址:http://weahome.cn/article/ddjidph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部