java遠程調用,java遠程調用接口幾種方式

本文目錄一覽:

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怎麼遠程調用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 = “”;

//直接引用遠程的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(“”);

} 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

原本的網址是,中間個各問號,但是Linux下面它不能解析,所以去掉問號,改為點號。

那麼就會出現4個文件:

GlobalWeather.java GlobalWeatherLocator.java GlobalWeatherSoap.java GlobalWeatherSoapStub.java

其中GlobalWeatherSoap.java是我們最為關心的接口文件,如果你對RMI等SOAP實現的具體細節不感興趣,那麼你只需要看接口文件即可,在使用的時候,引入這個接口即可,就好像使用本地類一樣。

java 遠程調用,具體實現

1、使用java代碼通過ssh登陸linux並執行命令,正常情況下sshd服務都會有,知道用戶密碼就可以使用這種方式了。

2、要在遠程linux服務器上執行命令,可以在linux服務器上啟動一個服務做執行腳本的代理,不斷接受來自你這個項目發來的腳本信息,然後執行,再把結果返回給你項目中去。

第一種:以消息隊列的方式發送這些腳本信息,linux代理不斷接受,並返回結果。項目同時要不斷接受結果。

第二種:項目中產生的腳本,直接記錄到數據庫,linux上的代理訪問這個數據庫,獲取腳本信息,並將執行結果寫入數據庫。項目中輪詢執行結果。

上面我說的消息隊列可以採用activemq,或者rabbitmq這些。

命令執行,java中直接Runtime.getRuntime().exec(command);就行了。

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(RemoteProcedureCall),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 採用的服務調用協議標準,因此在此就不多加闡述了。 CORBACommonObjectRequestBrokerArchitecture(公用對象請求代理[調度]程序體系結構),是一組用來定義”分佈式對象系統”的標準,由 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遠程調用之Hessian簡例(2)

代碼如下

RomoteTest java

package client;

import MalformedURLException;

import server Hello;

import caucho hessian client HessianProxyFactory;

public class RomoteTest {

public static void main(String[] args) {

String url = //localhost: /Hessian/hessianService ;

HessianProxyFactory factory = new HessianProxyFactory();

try {

Hello hello = (Hello) factory create(Hello class url);

System out println(hello hello( kingtoon ));

} catch (MalformedURLException e) {

e printStackTrace();

}

}

}

HelloImpl java

package server impl;

import server Hello;

public class HelloImpl implements Hello {

public String hello(String name) {

return hello + name + ! Wele to use Hessian ;

}

}

Hello java

package server;

public interface Hello {

String hello(String name);

}

web xml

?xml version= encoding= UTF ?

web app version= xmlns=

xmlns:xsi= instance

xsi:schemaLocation=

app_ _ xsd

servlet

servlet namehessianService/servlet name

servlet class

caucho hessian server HessianServlet

/servlet class

init param

param nameservice class/param name

param valueserver impl HelloImpl/param value

/init param

load on startup /load on startup

/servlet

servlet mapping

servlet namehessianService/servlet name

url pattern/hessianService/url pattern

/servlet mapping

/web app

lishixinzhi/Article/program/Java/hx/201311/26209

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/304378.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:05
下一篇 2025-01-01 11:05

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論