1. java 远程调用,具体实现
1、使用java代码通过ssh登陆linux并执行命令,正常情况下sshd服务都会有,知道用户密码就可以使用这种方式了。
2、要在远程linux服务器上执行命令,可以在linux服务器上启动一个服务做执行脚本的代理,不断接受来自你这个项目发来的脚本信息,然后执行,再把结果返回给你项目中去。
第一种:以消息队列的方式发送这些脚本信息,linux代理不断接受,并返回结果。项目同时要不断接受结果。
第二种:项目中产生的脚本,直接记录到数据库,linux上的代理访问这个数据库,获取脚本信息,并将执行结果写入数据库。项目中轮询执行结果。
上面我说的消息队列可以采用activemq,或者rabbitmq这些。
命令执行,java中直接Runtime.getRuntime().exec(command);就行了。
2. 请教一个关于java rmi远程调用 传递自定义对象的问题
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procere Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的革命,为远程通信开辟新的里程碑。
RMI的开发步骤
先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
最后客户端查找远程对象,并调用远程方法
简单实例
首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializable
代码
创建远程接口PersonService,注意远程接口需要继承Remote
代码
建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject
代码
建立服务器端,在服务器端注册RMI通讯端口与通讯路径,然后通讯javac命令编译文件,通过java -server 命令注册服务。以下面代码为例,如果阁下将项目建立于D:\\RMI\RemotingService文件夹上时,则先输入D:\\RMI\RemotingService\src>javac rmi/remotingservice/Program.java获取Program.class(如何阁下使用的MyEclipse等开发工具,可跳过此步,直接在*/bin文件夹中直接调用已经生成的Program.class),然后输入D:\\RMI\RemotingService\src>java rmi/remotingservice/Program启动服务。
代码
最后建立客户端进行测试,注意客户调用的RMI路径必须服务器配置一致
代码
常见错误
在命令提示符调用java命令时,显示并无此命令。这是因为未在“环境变量”中绑定JAVA的JDK命令造成的,你首先单击“计算机右键”->“属性”->“高级”->“环境变量”。在系统变量Path设置中加载为JDK的路径 .;D:\Program Files\Genuitec\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin。然后在ClassPath加载服务器端的Program.class地址 .;D:\\RMI\RemotingService\bin
在调用javac命令时出现“javac 找不到文件 ..... ”此错误,可能是因为阁下输入的文件路径出现错误造成,注意不要把D:\\RMI\RemotingService\src>javac rmi/remotingservice/Program.java写错为D:\\RMI\RemotingService\src>javac rmi.remotingservice.Program.java
在调用D:\\RMI\RemotingService\bin>java rmi/remotingservice/Program命令时出现“Exception in thread 'main' java.lang.NoClassEdfoundError”错误,第一这可能是阁下把Program错写为Program.class,注意java命令不需要加后缀名。第二可能是阁下把“java rmi/remotingservice/Program”错写为“java rmi\remotingservice\Program"。
3. Java客户端远程调用C服务器
真没有作过相关的开发,Java和C之间相互调用,本地的使用jni或者是直接发送
Windows消息
;远程的,都是使用socket通信的。谈一些想法,希望能给你些帮助,纸上谈兵:
1)现在常用的异构系统之间的调用,采用Web
Service的方法,没做过,但是应该可以。
2)RMI是Java
To
Java,另外Sun还提供了RMI-IIOP,这个是综合了RMI和Corba,是可以用在Java和其它语言对象之间的远程调用,但是我没有资料,也许你需要看看Corba的基本知识,如何使用idl来定义C对象的接口.
3)我不知道你对C所在的服务器有什么要求,是否可以运行Java.如果可以,那么有一个方法,你可以做一个
Java程序
来作为RMI的服务器,然后这个Java程序负责和Java客户通信,通信的方式还是RMI.然后,在这个Java服务程序中,同过jni的方法调用你的
C程序
.
4. java 调用远程接口 webservices 原理和流程
ws是基于SOAP 通信的一种接口协议。 参数可以为对象、字符串、xml等。
一般开发中,如果是你作为客户端,就需要对端提供ws的地址,地址加?wsdl 会生成一个wsdl。
用主流的ws框架xfire 或者 axis1-2均可生成JAVA客户端代码。 然后就像其他JAVA方法一样调用即可。
作为服务端,一样的用框架生成服务端代码,提供别人调用即可。
调试工具有 soapui
5. 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 也是常用的实现远程异步调用的方法之一。
6. 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实现的具体细节不感兴趣,那么你只需要看接口文件即可,在使用的时候,引入这个接口即可,就好像使用本地类一样。
7. java中用什么方法调用远程url并接收其返回的xml或json
现在Java中的远程调用无非三种方法:
1:前端通过ajax远程调用,设置相应的参数,后天在需要调用的方法加上注解(具体自行网络),然后配置spring.xml文件。(此方法不推荐)。
2:通过httpclient远程调用(此方法也不推荐)。
3:使用分布式bbo+集群zookeeper 技术(推荐)
8. jsp远程调用java接口
这是RestfulAPI 直接发布出去 作为javaWeb后台,有何远程概念
在jsp中使用window.location = "你的地址/getNewsIndo?你的参数" ;
再在JSON_VIEW_NAME对应的jsp中 使用request.getAttribute("object") 拿到model;
9. Java如何通过URL调用远程接口并读取返回信
下面代码可供你参考:
String ticket = "";//登录凭证
String url_str = "http://www.sina.com.cn?ticket=";//获取用户认证的帐号URL
String ticket_url = url_str + ticket;
URL url = new URL(ticket_url);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
int code = connection.getResponseCode();
if (code == 404) {
throw new Exception("认证无效,找不到此次认证的会话信息!");
}
if (code == 500) {
throw new Exception("认证服务器发生内部错误!");
}
if (code != 200) {
throw new Exception("发生其它错误,认证服务器返回 " + code);
}
InputStream is = connection.getInputStream();
byte[] response = new byte[is.available()];
is.read(response);
is.close();
if (response == null || response.length == 0) {
throw new Exception("认证无效,找不到此次认证的会话信息!");
}
String userId = new String(response, "GBK");
System.out.println(userId);
10. 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);
}
}