遠(yuǎn)程調(diào)用代碼java,遠(yuǎn)程代碼執(zhí)行

JAVA 遠(yuǎn)程 調(diào)用的幾種實(shí)現(xiàn)方式簡(jiǎn)析 詳細(xì)?0?3

基本原理 要實(shí)現(xiàn)網(wǎng)絡(luò)機(jī)器間的通訊,首先得來看看計(jì)算機(jī)系統(tǒng)網(wǎng)絡(luò)通信的基本原理,在底層層面去看,網(wǎng)絡(luò)通信需要做的就是將流從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硗庖慌_(tái)計(jì)算機(jī),基于傳輸協(xié)議和網(wǎng)絡(luò) IO 來實(shí)現(xiàn),其中傳輸協(xié)議比較出名的有 http、tcp、 udp 等等,http、tcp、udp 都是在基于Socket 概念上為某類應(yīng)用場(chǎng)景而擴(kuò)展出的傳輸協(xié)議,網(wǎng)絡(luò)IO,主要有bio、nio、aio 三種方式,所有的分布式應(yīng)用通訊都基于這個(gè)原理而實(shí)現(xiàn),只是為了應(yīng)用的易用,各種語言通常都會(huì)提供一些更為貼近應(yīng)用易用的應(yīng)用層協(xié)議。 應(yīng)用級(jí)協(xié)議 遠(yuǎn)程服務(wù)通訊,需要達(dá)到的目標(biāo)是在一臺(tái)計(jì)算機(jī)發(fā)起請(qǐng)求,另外一臺(tái)機(jī)器在接收到請(qǐng)求后進(jìn)行相應(yīng)的處理并將結(jié)果返回給請(qǐng)求端,這其中又會(huì)有諸如 onewayrequest、同步請(qǐng)求、異步請(qǐng)求等等請(qǐng)求方式,按照網(wǎng)絡(luò)通信原理,需要實(shí)現(xiàn)這個(gè)需要做的就是將請(qǐng)求轉(zhuǎn)換成流,通過傳輸協(xié)議傳輸至遠(yuǎn)端,遠(yuǎn)端計(jì)算機(jī)在接收到請(qǐng)求的流后進(jìn)行處理,處理完畢后將結(jié)果轉(zhuǎn)化為流,并通過傳輸協(xié)議返回給調(diào)用端。原理是這樣的,但為了應(yīng)用的方便,業(yè)界推出了很多基于此原理之上的應(yīng)用級(jí)的協(xié)議,使得大家可以不用去直接操作這么底層的東西,通常應(yīng)用級(jí)的遠(yuǎn)程通信協(xié)議會(huì)提供: 1.為了避免直接做流操作這么麻煩,提供一種更加易用或貼合語言的標(biāo)準(zhǔn)傳輸格式;2.網(wǎng)絡(luò)通信機(jī)制的實(shí)現(xiàn),就是替你完成了將傳輸格式轉(zhuǎn)化為流,通過某種傳輸協(xié)議傳輸至遠(yuǎn)端計(jì)算機(jī),遠(yuǎn)端計(jì)算機(jī)在接收到流后轉(zhuǎn)化為傳輸格式,并進(jìn)行存儲(chǔ)或以某種方式通知遠(yuǎn)端計(jì)算機(jī)。 所以在學(xué)習(xí)應(yīng)用級(jí)的遠(yuǎn)程通信協(xié)議時(shí),我們可以帶著這幾個(gè)問題進(jìn)行學(xué)習(xí): 1.傳輸?shù)臉?biāo)準(zhǔn)格式是什么?2.怎么樣將請(qǐng)求轉(zhuǎn)化為傳輸?shù)牧?3.怎么接收和處理流?4.傳輸協(xié)議是? 不過應(yīng)用級(jí)的遠(yuǎn)程通信協(xié)議并不會(huì)在傳輸協(xié)議上做什么多大的改進(jìn),主要是在流操作方面,讓應(yīng)用層生成流和處理流的這個(gè)過程更加的貼合所使用的語言或標(biāo)準(zhǔn),至于傳輸協(xié)議則通常都是可選的,在java 領(lǐng)域中知名的有:RMI、 XML-RPC、Binary-RPC、SOAP、CORBA、JMS,來具體的看看這些遠(yuǎn)程通信的應(yīng)用級(jí)協(xié)議: RMIRMI 是個(gè)典型的為java 定制的遠(yuǎn)程通信協(xié)議,我們都知道,在 singlevm 中,我們可以通過直接調(diào)用javaobjectinstance 來實(shí)現(xiàn)通信,那么在遠(yuǎn)程通信時(shí),如果也能按照這種方式當(dāng)然是最好了,這種遠(yuǎn)程通信的機(jī)制成為RPC(RemoteProcedureCall),RMI 正是朝著這個(gè)目標(biāo)而誕生的。 來看下基于RMI 的一次完整的遠(yuǎn)程通信過程的原理: 1.客戶端發(fā)起請(qǐng)求,請(qǐng)求轉(zhuǎn)交至RMI 客戶端的stub 類;2.stub 類將請(qǐng)求的接口、方法、參數(shù)等信息進(jìn)行序列化;3.基于socket 將序列化后的流傳輸至服務(wù)器端;4.服務(wù)器端接收到流后轉(zhuǎn)發(fā)至相應(yīng)的skelton 類;5.skelton 類將請(qǐng)求的信息反序列化后調(diào)用實(shí)際的處理類;6.處理類處理完畢后將結(jié)果返回給 skelton 類;7.Skelton 類將結(jié)果序列化,通過socket 將流傳送給客戶端的 stub;8.stub 在接收到流后反序列化,將反序列化后的JavaObject 返回給調(diào)用者。 根據(jù)原理來回答下之前學(xué)習(xí)應(yīng)用級(jí)協(xié)議帶著的幾個(gè)問題: 1.傳輸?shù)臉?biāo)準(zhǔn)格式是什么?是JavaObjectStream。2.怎么樣將請(qǐng)求轉(zhuǎn)化為傳輸?shù)牧?基于Java 串行化機(jī)制將請(qǐng)求的javaobject 信息轉(zhuǎn)化為流。3.怎么接收和處理流?根據(jù)采用的協(xié)議啟動(dòng)相應(yīng)的監(jiān)聽端口,當(dāng)有流進(jìn)入后基于Java 串行化機(jī)制將流進(jìn)行反序列化,并根據(jù)RMI 協(xié)議獲取到相應(yīng)的處理對(duì)象信息,進(jìn)行調(diào)用并處理,處理完畢后的結(jié)果同樣基于java 串行化機(jī)制進(jìn)行返回。4.傳輸協(xié)議是?Socket。 XML-RPCXML-RPC 也是一種和RMI 類似的遠(yuǎn)程調(diào)用的協(xié)議,它和RMI 的不同之處在于它以標(biāo)準(zhǔn)的 xml 格式來定義請(qǐng)求的信息(請(qǐng)求的對(duì)象、方法、參數(shù)等),這樣的好處是什么呢,就是在跨語言通訊的時(shí)候也可以使用。 來看下XML-RPC 協(xié)議的一次遠(yuǎn)程通信過程: 1.客戶端發(fā)起請(qǐng)求,按照XML-RPC 協(xié)議將請(qǐng)求信息進(jìn)行填充;2.填充完畢后將xml 轉(zhuǎn)化為流,通過傳輸協(xié)議進(jìn)行傳輸;3.接收到在接收到流后轉(zhuǎn)換為xml,按照XML-RPC 協(xié)議獲取請(qǐng)求的信息并進(jìn)行處理;4.處理完畢后將結(jié)果按照XML- RPC 協(xié)議寫入xml 中并返回。 同樣來回答問題: 1.傳輸?shù)臉?biāo)準(zhǔn)格式是?標(biāo)準(zhǔn)格式的XML。2.怎么樣將請(qǐng)求轉(zhuǎn)化為傳輸?shù)牧? 將XML 轉(zhuǎn)化為流。3.怎么接收和處理流?通過監(jiān)聽的端口獲取到請(qǐng)求的流,轉(zhuǎn)化為XML,并根據(jù)協(xié)議獲取請(qǐng)求的信息,進(jìn)行處理并將結(jié)果寫入XML 中返回。4. 傳輸協(xié)議是?Http。 Binary-RPCBinary-RPC 看名字就知道和XML-RPC 是差不多的了,不同之處僅在于傳輸?shù)臉?biāo)準(zhǔn)格式由XML 轉(zhuǎn)為了二進(jìn)制的格式。 同樣來回答問題: 1.傳輸?shù)臉?biāo)準(zhǔn)格式是?標(biāo)準(zhǔn)格式的二進(jìn)制文件。2.怎么樣將請(qǐng)求轉(zhuǎn)化為傳輸?shù)牧?將二進(jìn)制格式文件轉(zhuǎn)化為流。3.怎么接收和處理流?通過監(jiān)聽的端口獲取到請(qǐng)求的流,轉(zhuǎn)化為二進(jìn)制文件,根據(jù)協(xié)議獲取請(qǐng)求的信息,進(jìn)行處理并將結(jié)果寫入XML 中返回。4.傳輸協(xié)議是?Http。 SOAPSOAP 原意為SimpleObjectAccessProtocol,是一個(gè)用于分布式環(huán)境的、輕量級(jí)的、基于XML 進(jìn)行信息交換的通信協(xié)議,可以認(rèn)為SOAP 是XMLRPC 的高級(jí)版,兩者的原理完全相同,都是http+XML,不同的僅在于兩者定義的XML 規(guī)范不同,SOAP 也是Webservice 采用的服務(wù)調(diào)用協(xié)議標(biāo)準(zhǔn),因此在此就不多加闡述了。 CORBACommonObjectRequestBrokerArchitecture(公用對(duì)象請(qǐng)求代理[調(diào)度]程序體系結(jié)構(gòu)),是一組用來定義"分布式對(duì)象系統(tǒng)"的標(biāo)準(zhǔn),由 OMG(ObjectMenagementGroup)作為發(fā)起和標(biāo)準(zhǔn)制定單位。CORBA 的目的是定義一套協(xié)議,符合這個(gè)協(xié)議的對(duì)象可以互相交互,不論它們是用什么樣的語言寫的,不論它們運(yùn)行于什么樣的機(jī)器和操作系統(tǒng)。CORBA 在我看來是個(gè)類似于SOA 的體系架構(gòu),涵蓋可選的遠(yuǎn)程通信協(xié)議,但其本身不能列入通信協(xié)議這里來講,而且CORBA 基本淘汰,再加上對(duì)CORBA 也不怎么懂,在此就不進(jìn)行闡述了。 JMSJMS 呢,是實(shí)現(xiàn)java 領(lǐng)域遠(yuǎn)程通信的一種手段和方法,基于JMS 實(shí)現(xiàn)遠(yuǎn)程通信時(shí)和RPC 是不同的,雖然可以做到RPC 的效果,但因?yàn)椴皇菑膮f(xié)議級(jí)別定義的,因此我們不認(rèn)為JMS 是個(gè)RPC 協(xié)議,但它確實(shí)是個(gè)遠(yuǎn)程通信協(xié)議,在其他的語言體系中也存在著類似JMS 的東西,可以統(tǒng)一的將這類機(jī)制稱為消息機(jī)制,而消息機(jī)制呢,通常是高并發(fā)、分布式領(lǐng)域推薦的一種通信機(jī)制,這里的主要一個(gè)問題是容錯(cuò)(詳細(xì)見ErLang 論文)。 來看JMS 中的一次遠(yuǎn)程通信的過程: 1.客戶端將請(qǐng)求轉(zhuǎn)化為符合JMS 規(guī)定的Message;2.通過JMSAPI 將Message 放入JMSQueue 或Topic 中;3.如為JMSQueue,則發(fā)送中相應(yīng)的目標(biāo)Queue 中,如為Topic,則發(fā)送給訂閱了此Topic 的JMSQueue。4.處理端則通過輪訓(xùn) JMSQueue,來獲取消息,接收到消息后根據(jù)JMS 協(xié)議來解析Message 并處理。 回答問題: 1.傳輸?shù)臉?biāo)準(zhǔn)格式是?JMS 規(guī)定的Message。2.怎么樣將請(qǐng)求轉(zhuǎn)化為傳輸?shù)牧?將參數(shù)信息放入Message 中即可。3.怎么接收和處理流?輪訓(xùn)JMSQueue 來接收Message,接收到后進(jìn)行處理,處理完畢后仍然是以Message 的方式放入 Queue 中發(fā)送或Multicast。4.傳輸協(xié)議是?不限。 基于JMS 也是常用的實(shí)現(xiàn)遠(yuǎn)程異步調(diào)用的方法之一。

創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),懷來網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:懷來等地區(qū)。懷來做網(wǎng)站價(jià)格咨詢:18980820575

java遠(yuǎn)程調(diào)用接口的原理和范例,謝謝

Java 遠(yuǎn)程處理

Java遠(yuǎn)程方法調(diào)用(RMI)提供了Java程序語言的遠(yuǎn)程通訊功能,這種特性使客戶機(jī)上運(yùn)行的程序可以調(diào)用遠(yuǎn)程服務(wù)器上的對(duì)象,使Java編程人員能夠在網(wǎng)絡(luò)環(huán)境中分布操作。

創(chuàng)建一個(gè)簡(jiǎn)單的Java分布式遠(yuǎn)程方法調(diào)用程序可以按以下幾個(gè)步驟操作,

一、定義遠(yuǎn)程接口:

在 Java 中,遠(yuǎn)程對(duì)象是實(shí)現(xiàn)遠(yuǎn)程接口的類的實(shí)例, 遠(yuǎn)程接口聲明每個(gè)要遠(yuǎn)程調(diào)用的方法。在需要?jiǎng)?chuàng)建一個(gè)遠(yuǎn)程對(duì)象的時(shí)候,我們通過傳遞一個(gè)接口來隱藏基層的實(shí)施細(xì)節(jié),客戶通過接口句柄發(fā)送消息即可。

遠(yuǎn)程接口具有如下特點(diǎn):

1) 遠(yuǎn)程接口必須為public屬性。如果不這樣,除非客戶端與遠(yuǎn)程接口在同一個(gè)包內(nèi),否則 當(dāng)試圖裝入實(shí)現(xiàn)該遠(yuǎn)程接口的遠(yuǎn)程對(duì)象時(shí),調(diào)用會(huì)得到錯(cuò)誤結(jié)果。

2) 遠(yuǎn)程接口必須擴(kuò)展接口java.rmi.Remote。

3) 除與應(yīng)用程序本身特定的例外之外,遠(yuǎn)程接口中的每個(gè)方法都必須在自己的throws從句中 聲明java.rmi.RemoteException。(或 RemoteException 的父類)。

4) 作為參數(shù)或返回值傳遞的一個(gè)遠(yuǎn)程對(duì)象(不管是直接,還是本地對(duì)象中嵌入)必須聲明為遠(yuǎn) 程接口,而不應(yīng)聲明為實(shí)施類。

下面是遠(yuǎn)程接口的定義

[java] view plaincopy

package 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;

}

二、實(shí)現(xiàn)遠(yuǎn)程接口:

遠(yuǎn)程對(duì)象實(shí)現(xiàn)類必須擴(kuò)展遠(yuǎn)程對(duì)象java.rmi.UnicastRemoteObject類,并實(shí)現(xiàn)所定義的遠(yuǎn)程接口。遠(yuǎn)程對(duì)象的實(shí)現(xiàn)類中包含實(shí)現(xiàn)每個(gè)遠(yuǎn)程接口所指定的遠(yuǎn)程方法的代碼。這個(gè)類也可以含有附加的方法,但客戶只能使用遠(yuǎn)程接口中的方法。因?yàn)榭蛻羰侵赶蚪涌诘囊粋€(gè)句柄,而不是它的哪個(gè)類。必須為遠(yuǎn)程對(duì)象定義構(gòu)造函數(shù),即使只準(zhǔn)備定義一個(gè)默認(rèn)構(gòu)造函數(shù),用它調(diào)用基礎(chǔ)類構(gòu)造函數(shù)。因?yàn)榛A(chǔ)類構(gòu)造函數(shù)可能會(huì)拋出 java.rmi.RemoteException,所以即使別無它用必須拋出java.rmi.RemoteException例外。

以下是遠(yuǎn)程對(duì)象實(shí)現(xiàn)類的聲明:

[java] view plaincopy

package 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;

}

}

三、編寫服務(wù)器類:

包含 main 方法的類可以是實(shí)現(xiàn)類自身,也可以完全是另一個(gè)類。下面通過RmiSampleServer 來創(chuàng)建一個(gè)遠(yuǎn)程對(duì)象的實(shí)例,并通過java.rmi.registry.LocateRegistry類的createRegistry 方法從指定端口號(hào)啟動(dòng)注冊(cè)服務(wù)程序,也可以通過執(zhí)行 rmiregistry 命令啟動(dòng)注冊(cè)服務(wù)程序,注冊(cè)服務(wù)程序的缺省運(yùn)行端口為 1099。必須將遠(yuǎn)程對(duì)象名字綁定到對(duì)遠(yuǎn)程對(duì)象的引用上: Naming.rebind("http://localhost:8808/SAMPLE-SERVER" , Server);

以下是服務(wù)器類的聲明:

[java] view plaincopy

package 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();

// 注冊(cè)到 registry 中

Naming.rebind("http://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);

}

}

}

四、編寫使用遠(yuǎn)程服務(wù)的客戶機(jī)類:

客戶機(jī)類的主要功能有兩個(gè),一是通過Naming.lookup方法來構(gòu)造注冊(cè)服務(wù)程序 stub 程序?qū)嵗?,二是調(diào)用服務(wù)器遠(yuǎn)程對(duì)象上的遠(yuǎn)程方法。

以下是客戶端類的聲明:

[java] view plaincopy

package testClient;

import test.Fib;

import java.math.BigInteger;

import java.net.MalformedURLException;

import java.rmi.Naming;

import java.rmi.NotBoundException;

import java.rmi.RemoteException;

public class FibClient {

/**

* @param args

*/

public static void main(String[] args) {

String url = "http://localhost:8804/SAMPLE-SERVER";

try {

Fib calc = (Fib) Naming.lookup(url);

for (int i = 0; i 10; ++i) {

int f = calc.getFib(i);

System.out.println(f);

}

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (RemoteException e) {

e.printStackTrace();

} catch (NotBoundException e) {

e.printStackTrace();

}

}

}

救,air調(diào)用本地java程序和遠(yuǎn)程java怎么實(shí)現(xiàn)

JNI是JavaNativeInterface的縮寫,中文為JAVA本地調(diào)用。從Java1.1開始,JavaNativeInterface(JNI)標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設(shè)計(jì)的,但是它并不妨礙你使用其他語言,只要調(diào)用約定受支持就可以了。

使用java與本地已編譯的代碼交互,通常會(huì)喪失平臺(tái)可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬件、操作系統(tǒng)進(jìn)行交互,或者為了提高程序的性能。JNI標(biāo)準(zhǔn)至少保證本地代碼能工作在任何Java虛擬機(jī)實(shí)現(xiàn)下。

------------------------------------------------------------------

編寫帶有native聲明的方法的java類

·使用javac命令編譯所編寫的java類

·使用javah?jnijava類名生成擴(kuò)展名為h的頭文件

·使用C/C++實(shí)現(xiàn)本地方法

·將C/C++編寫的文件生成動(dòng)態(tài)連接庫

·ok

1)編寫java程序:這里以HelloWorld為例。

代碼1:

classHelloWorld{

publicnativevoiddisplayHelloWorld();

static{

System.loadLibrary("hello");

}

publicstaticvoidmain(String[]args){

newHelloWorld().displayHelloWorld();

}

}

聲明native方法:如果你想將一個(gè)方法做為一個(gè)本地方法的話,那么你就必須聲明改方法為native的,并且不能實(shí)現(xiàn)。其中方法的參數(shù)和返回值在后面講述。Load動(dòng)態(tài)庫:System.loadLibrary("hello");加載動(dòng)態(tài)庫(我們可以這樣理解:我們的方法displayHelloWorld()沒有實(shí)現(xiàn),但是我們?cè)谙旅婢椭苯邮褂昧耍员仨氃谑褂弥皩?duì)它進(jìn)行初始化)這里一般是以static塊進(jìn)行加載的。同時(shí)需要注意的是System.loadLibrary();的參數(shù)“hello”是動(dòng)態(tài)庫的名字。

2)編譯

沒有什么好說的了javacHelloWorld.java

3)生成擴(kuò)展名為h的頭文件javah?

jniHelloWorld頭文件的內(nèi)容:/*DONOTEDITTHISFILE-itismachinegenerated*/

1.include

/*HeaderforclassHelloWorld*/

1.ifndef_Included_HelloWorld

2.define_Included_HelloWorld

3.ifdef__cplusplus

extern"C"{

1.endif

/*

*Class:HelloWorld

*Method:displayHelloWorld

*Signature:()V

*/

JNIEXPORTvoidJNICALLJava_HelloWorld_displayHelloWorld(JNIEnv*,jobject);

1.ifdef__cplusplus

}

1.endif

2.endif

(這里我們可以這樣理解:這個(gè)h文件相當(dāng)于我們?cè)趈ava里面的接口,這里聲明了一個(gè)Java_HelloWorld_displayHelloWorld(JNIEnv*,jobject);方法,然后在我們的本地方法里面實(shí)現(xiàn)這個(gè)方法,也就是說我們?cè)诰帉慍/C++程序的時(shí)候所使用的方法名必須和這里的一致)。

4)編寫本地方法實(shí)現(xiàn)和由javah命令生成的頭文件里面聲明的方法名相同的方法。

代碼2:

1#include"jni.h"

2#include"HelloWorld.h"

3//#includeotherheaders

4JNIEXPORTvoidJNICALLJava_HelloWorld_displayHelloWorld(JNIEnv*env,jobjectobj)

{

printf("Helloworld!\n");

return;

}

注意代碼2中的第1行,需要將jni.h(該文件可以在%JAVA_HOME%/include文件夾下面找到)文件引入,因?yàn)樵诔绦蛑械腏NIEnv、jobject等類型都是在該頭文件中定義的;另外在第2行需要將HelloWorld.h頭文件引入(我是這么理解的:相當(dāng)于我們?cè)诰帉慾ava程序的時(shí)候,實(shí)現(xiàn)一個(gè)接口的話需要聲明才可以,這里就是將HelloWorld.h頭文件里面聲明的方法加以實(shí)現(xiàn)。當(dāng)然不一定是這樣)。然后保存為HelloWorldImpl.c就ok了。

5)生成動(dòng)態(tài)庫

這里以在Windows中為例,需要生成dll文件。在保存HelloWorldImpl.c文件夾下面,使用VC的編譯器cl成。cl-I%java_home%\include-I%java_home%\include\win32-LDHelloWorldImp.c-Fehello.dll注意:生成的dll文件名在選項(xiàng)-Fe后面配置,這里是hello,因?yàn)樵贖elloWorld.java文件中我們loadLibary的時(shí)候使用的名字是hello。當(dāng)然這里修改之后那里也需要修改。另外需要將-I%java_home%\include-I%java_home%\include\win32參數(shù)加上,因?yàn)樵诘谒牟嚼锩婢帉懕镜胤椒ǖ臅r(shí)候引入了jni.h文件。

6)運(yùn)行程序javaHelloWorld就ok.

---------------------------------------------------------------

下面是一個(gè)簡(jiǎn)單的例子實(shí)現(xiàn)打印一句話的功能,但是用的c的printf最終實(shí)現(xiàn)。一般提供給java的jni接口包括一個(gè)so文件(封裝了c函數(shù)的實(shí)現(xiàn))和一個(gè)java文件(需要調(diào)用path的類)。

1.JNI的目的是使java方法中能夠調(diào)用c實(shí)現(xiàn)的一些函數(shù),比如以下的java類,就需要調(diào)用一個(gè)本地函數(shù)testjni(一般聲明為privatenative類型),首先需要?jiǎng)?chuàng)建文件weiqiong.java,內(nèi)容如下:

classweiqiong{static{System.loadLibrary("testjni");//載入靜態(tài)庫,test函數(shù)在其中實(shí)現(xiàn)}privatenativevoidtestjni();//聲明本地調(diào)用publicvoidtest(){testjni();}publicstaticvoidmain(Stringargs[]){weiqionghaha=newweiqiong();haha.test();}}

2.然后執(zhí)行javacweiqiong.java,如果沒有報(bào)錯(cuò),會(huì)生成一個(gè)weiqiong.class。

3.然后設(shè)置classpath為你當(dāng)前的工作目錄,如直接輸入命令行:setclasspath=weiqiong.class所在的完整目錄(如c:\test)再執(zhí)行javahweiqiong,會(huì)生成一個(gè)文件weiqiong.h文件,其中有一個(gè)函數(shù)的聲明如下:

JNIEXPORTvoidJNICALLJava_weiqiong_testjni(JNIEnv*,jobject);

4.創(chuàng)建文件testjni.c將上面那個(gè)函數(shù)實(shí)現(xiàn),內(nèi)容如下:

1.include

2.include

JNIEXPORTvoidJNICALLJava_weiqiong_testjni(JNIEnv*env,jobjectobj){printf("haha---------gointoc!!!\n");}

5.為了生成.so文件,創(chuàng)建makefile文件如下:

libtestjni.so:testjni.omakefilegcc-Wall-rdynamic-shared-olibtestjni.sotestjni.otestjni.o:testjni.cweiqiong.hgcc-Wall-ctestjni.c-I./-I/usr/java/j2sdk1.4.0/include-I/usr/java/j2sdk1.4.0/include/linuxcl:rm-rf*.o*.so注意:gcc前面是tab空,j2sdk的目錄根據(jù)自己裝的j2sdk的具體版本來寫,生成的so文件的名字必須是loadLibrary的參數(shù)名前加“l(fā)ib”。

6.exportLD_LIBRARY_PATH=.,由此設(shè)置library路徑為當(dāng)前目錄,這樣java文件才能找到so文件。一般的做法是將so文件copy到本機(jī)的LD_LIBRARY_PATH目錄下。

7.執(zhí)行javaweiqiong,打印出結(jié)果:“haha---------gointoc!!!”

java如何遠(yuǎn)程調(diào)用。。。。。。。。。

RMI遠(yuǎn)程調(diào)用。你查一下這個(gè)。

或是webservices

下邊是一個(gè)例子,運(yùn)行server,

再運(yùn)行client,可以得到對(duì)象。

-------------------------------------------------------

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代碼調(diào)用遠(yuǎn)程Linux上的shell腳本

package org.shirdrn.shell;

import java.io.IOException;

import java.io.InputStream;

import java.nio.charset.Charset;

import ch.ethz.ssh2.Connection;

import ch.ethz.ssh2.Session;

/**

* 遠(yuǎn)程Shell腳本執(zhí)行工具

*

* @author Administrator

*/

public class RemoteShellTool {

private Connection conn;

private String ipAddr;

private String charset = Charset.defaultCharset().toString();

private String userName;

private String password;

public RemoteShellTool(String ipAddr, String userName, String password, String charset) {

this.ipAddr = ipAddr;

this.userName = userName;

this.password = password;

if(charset != null) {

this.charset = charset;

}

}

/**

* 登錄遠(yuǎn)程Linux主機(jī)

*

* @return

* @throws IOException

*/

public boolean login() throws IOException {

conn = new Connection(ipAddr);

conn.connect(); // 連接

return conn.authenticateWithPassword(userName, password); // 認(rèn)證

}

/**

* 執(zhí)行Shell腳本或命令

*

* @param cmds 命令行序列

* @return

*/

public String exec(String cmds) {

InputStream in = null;

String result = "";

try {

if (this.login()) {

Session session = conn.openSession(); // 打開一個(gè)會(huì)話

session.execCommand(cmds);

in = session.getStdout();

result = this.processStdout(in, this.charset);

conn.close();

}

} catch (IOException e1) {

e1.printStackTrace();

}

return result;

}

/**

* 解析流獲取字符串信息

*

* @param in 輸入流對(duì)象

* @param charset 字符集

* @return

*/

public String processStdout(InputStream in, String charset) {

byte[] buf = new byte[1024];

StringBuffer sb = new StringBuffer();

try {

while (in.read(buf) != -1) {

sb.append(new String(buf, charset));

}

} catch (IOException e) {

e.printStackTrace();

}

return sb.toString();

}

}

當(dāng)前名稱:遠(yuǎn)程調(diào)用代碼java,遠(yuǎn)程代碼執(zhí)行
地址分享:http://www.muchs.cn/article38/phjesp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、微信公眾號(hào)、云服務(wù)器、ChatGPT搜索引擎優(yōu)化、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)