main方法怎么调用远程服务的方法

main方法怎么调用远程服务的方法,第1张

在main方法中调用远程服务的方法,需要以下几个步骤:
1 首先,需要将远程服务的接口文件导入到本地项目中,以便于在main方法中使用。
2 然后,需要通过RMI(远程方法调用)或者WebService(网络服务)技术实现连接远程服务器
3 接着,在main方法中,需要创建远程服务接口的实例,然后调用远程服务接口中定义的方法,以实现远程服务的调用。
4 最后,在调用完远程服务后,需要断开连接,释放资源,以免影响系统的性能。

package test5;
public interface A {
void setAll(int ID,String IP);
String getAll();
}
package test5;
public class B implements A{
String IP;
int ID;
public void setAll(int ID,String IP) {
thisID=ID;
thisIP=IP;
}
public String getAll() {
return "ID为: "+ID+"\t\t"+"IP为: "+IP;
}
public static void main(String[] args) {
B b=new B();
bsetAll(1, "19216811");
Systemoutprintln(bgetAll());
}
}

你用habernate保存数据,只要XML文件配置好了,实体类DAO层都没错,调用SAVE方法 然后COMMIT就可以保存数据。
序列化主要就是把你要保存的数据,转换成字节码的形式,反序列化就是把字节码变成数据。
你直接把数据通过本机服务器提交给硬盘,确实不需要序列化。
但是你在网络传输的时候就不行了,你传给别人一个东西,它接收了所有的字节码之后,却不知道你原本传的是什么对象,也就没法把这个东西按照原始去解析。
你序列化之后,在传给对方,他接收到的时候会按照序列化特定的模式,给反序列化出来,也就是说你传了什么,对方接收的也是什么,解析成功,可以正确使用方法以及属性。

异步调用是和同步调用相对的概念
有以下的语句:
A1
A2
B1
B2
A3
A4
如果同步调用的话,执行顺序为从上之下,前一个完成才能进行后一个,一部调用的话则是按照以下的顺序执行,在执行A2后执行B1的同时开始执行A3,这样就有两条线同时执行。
A1
A2
A3 B1
A4 B2
C#中异步调用是通过代理机制来实现的,以下为例子:test1的代码和test2的同时运行,对于调用者这个主线程来说就是异步调了test1
定义了以下的代理和满足代理签名的方法
delegate void Sample();
private void test1()
{ }
private void test2()
{ }
调用者的写法:
Sample ss1 = new Sample(thistest1);
IAsyncResult ia = ss1BeginInvoke(null,null);
test2();

Java 远程处理
Java远程方法调用(RMI)提供了Java程序语言的远程通讯功能,这种特性使客户机上运行的程序可以调用远程服务器上的对象,使Java编程人员能够在网络环境中分布 *** 作。
创建一个简单的Java分布式远程方法调用程序可以按以下几个步骤 *** 作,
一、定义远程接口:
在 Java 中,远程对象是实现远程接口的类的实例, 远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。
远程接口具有如下特点:
1) 远程接口必须为public属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。
2) 远程接口必须扩展接口javarmiRemote。
3) 除与应用程序本身特定的例外之外,远程接口中的每个方法都必须在自己的throws从句中 声明javarmiRemoteException。(或 RemoteException 的父类)。
4) 作为参数或返回值传递的一个远程对象(不管是直接,还是本地对象中嵌入)必须声明为远 程接口,而不应声明为实施类。
下面是远程接口的定义
[java] view plaincopy
package test;
import javarmiRemote;
import javarmiRemoteException;
import javamathBigInteger;
public interface Fib extends Remote {
public int getFib(int n) throws RemoteException;
// public BigInteger getFib(BigInteger n) throws RemoteException;
}
二、实现远程接口:
远程对象实现类必须扩展远程对象javarmiUnicastRemoteObject类,并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。必须为远程对象定义构造函数,即使只准备定义一个默认构造函数,用它调用基础类构造函数。因为基础类构造函数可能会抛出 javarmiRemoteException,所以即使别无它用必须抛出javarmiRemoteException例外。
以下是远程对象实现类的声明:
[java] view plaincopy
package test;
import javamathBigInteger;
import javarmi;
import javarmiserverUnicastRemoteObject;
public class FibImp extends UnicastRemoteObject implements Fib {
public FibImp() throws RemoteException {
super();
}
public int getFib(int n) throws RemoteException {
return n+2;
}
}
三、编写服务器类:
包含 main 方法的类可以是实现类自身,也可以完全是另一个类。下面通过RmiSampleServer 来创建一个远程对象的实例,并通过javarmiregistryLocateRegistry类的createRegistry 方法从指定端口号启动注册服务程序,也可以通过执行 rmiregistry 命令启动注册服务程序,注册服务程序的缺省运行端口为 1099。必须将远程对象名字绑定到对远程对象的引用上: Namingrebind("//localhost:8808/SAMPLE-SERVER" , Server);
以下是服务器类的声明:
[java] view plaincopy
package test;
import javanetMalformedURLException;
import javarmiNaming;
import javarmiRemoteException;
import javarmiregistryLocateRegistry;
public class FibonacciServer {
/
@param args
/
public static void main(String[] args) {
try {
LocateRegistrycreateRegistry(8804);
FibImp f = new FibImp();
// 注册到 registry 中
Namingrebind("//localhost:8804/SAMPLE-SERVER", f);
Systemoutprintln("fib server ready");
} catch (RemoteException re) {
Systemoutprintln("Exception in FibonacciImplmain: " + re);
} catch (MalformedURLException e) {
Systemoutprintln("MalformedURLException " + e);
}
}
}
四、编写使用远程服务的客户机类:
客户机类的主要功能有两个,一是通过Naminglookup方法来构造注册服务程序 stub 程序实例,二是调用服务器远程对象上的远程方法。
以下是客户端类的声明:
[java] view plaincopy
package testClient;
import testFib;
import javamathBigInteger;
import javanetMalformedURLException;
import javarmiNaming;
import javarmiNotBoundException;
import javarmiRemoteException;
public class FibClient {
/
@param args
/
public static void main(String[] args) {
String url = "//localhost:8804/SAMPLE-SERVER";
try {
Fib calc = (Fib) Naminglookup(url);
for (int i = 0; i < 10; ++i) {
int f = calcgetFib(i);
Systemoutprintln(f);
}
} catch (MalformedURLException e) {
eprintStackTrace();
} catch (RemoteException e) {
eprintStackTrace();
} catch (NotBoundException e) {
eprintStackTrace();
}
}
}

Java调用WebService可以直接使用Apache提供的axisjar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。
1、编写代码方式:
package comyuduntest;
import javarmiRemoteException;
import orgapacheaxisclientCall;
import orgapacheaxisclientService;
import orgapacheaxismessagePrefixedQName;
import orgapacheaxismessageSOAPHeaderElement;
import comcezannegoldenuserException;
import comcezannegoldenuserUserManagerServiceProxy;
import javaxxmlnamespaceQName;
import javanetMalformedURLException;
import javaxxmlrpcServiceException;
import javaxxmlsoapName;
import javaxxmlsoapSOAPException;
public class testWebService {
public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException
{
//标识Web Service的具体路径
String endpoint = "WebService服务地址";
// 创建 Service实例
Service service = new Service();
// 通过Service实例创建Call的实例
Call call = (Call) servicecreateCall();
//将Web Service的服务路径加入到call实例之中
callsetTargetEndpointAddress( new javanetURL(endpoint) );//为Call设置服务的位置
// 由于需要认证,故需要设置调用的SOAP头信息。
Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") );
orgapacheaxismessageSOAPHeaderElement header = new SOAPHeaderElement(headerName);
headeraddTextNode( "blablabla" );
calladdHeader(header);

// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement("发布的wsdl里的targetNamespace里的url", "SoapHeader");
// soapHeaderElementsetNamespaceURI("发布的wsdl里的targetNamespace里的url");
// try
// {
// soapHeaderElementaddChildElement("string_itemName")setValue("blablabla");
// }
// catch (SOAPException e)
// {
// eprintStackTrace();
// }
// calladdHeader(soapHeaderElement);
//调用Web Service的方法
orgapacheaxisdescriptionOperationDesc oper;
orgapacheaxisdescriptionParameterDesc param;
oper = new orgapacheaxisdescriptionOperationDesc();
opersetName("opName");
param = new orgapacheaxisdescriptionParameterDesc(new javaxxmlnamespaceQName("", "arg0"), orgapacheaxisdescriptionParameterDescIN, new javaxxmlnamespaceQName(">

数据库:存储数据的应用软件。

服务器:公共的服务库。

应用服务器是应用的服务器,提供应用服务,也可以是自己的网络应用服务器,接口服务器是提供给第三方调用的服务,主要是为了自己的应用的安全性,所以只把能供给第三方调用的东西封装在应用服务器服务器。

根据应用环境的不同,需要的数据库服务器也不同,一般来说,如果数据库服务器需要连接的客户端多、并且是不同权限组的客户端的话需要网络接口比较多的,除此之外,数据库服务器的处理器性能要求比较高,因为其要进行频繁的 *** 作,内存要求大,加快数据存取速度。

应用服务器相对而言要求低一些,如果是FTP服务器的话网卡的速率要求要高,起码是千兆的,网页服务器对于网卡的速率也同样有较高的要求,但对于处理器性能要求就不那么高了。

应用程序服务器是为应用程序提供业务逻辑的。它是基于组件的,位于以服务器为中心的架构的中间件。

这个架构通常是一个主要的基于Web的界面。中间件是业务逻辑所在的应用服务器。而第三层,后端是负责数据库的服务器。应用程序服务器充当用户和数据库之间的交互。

应用服务器通过各种协议向客户端应用程序打开业务逻辑。它还可以包括计算机,web服务器或其他应用服务器上的图形用户界面。业务逻辑通过组件API。它还管理自己的资源以及执行安全性,事务处理,资源和连接池以及消息传递。

对于高端要求,应用服务器往往具有高可用性监控,集群,负载平衡,集成冗余和高性能分布式应用服务,并支持复杂的数据库访问。

当需要与现有数据库和服务器(如Web服务器)集成时,应使用应用程序服务器,可以通过启用集中式方法来提供应用程序更新和升级来提供数据和代码的完整性。

可伸缩性是使用应用服务器的另一个原因和好处。应用程序服务器可以与数据库连接。这意味着企业可以扩展Web服务器群,而不需要增加数据库连接的数量。

从网页到数据库的直接链接如果暴露,可导致SQL注入攻击基础架构。

通过单独的数据访问层执行数据验证和/或显示业务逻辑,可以确保以Web表单输入的文本不被用作SQL调用。通过集中身份验证过程以及数据访问管理,还可以提高安全性。

应用程序服务器与Web服务器不同,因为前者通过多种协议处理向应用程序提供业务逻辑,而Web服务器响应并处理>

虽然Web服务器可能不支持事务或数据库连接,但可能具有容错和可扩展性功能,如负载平衡,缓存和集群。

与数据库服务器不同,因为该服务器执行诸如数据分析,存储,数据处理,归档以及其他数据管理相关任务之类的任务。

数据库服务器使用诸如ODBC,JDBC等协议。他们还将托管数据库,如Oracle,SQLServer,MySQL等。

扩展资料:

服务器是计算机局域网的核心部件。网络 *** 作系统是在网络服务器上运行的,网络服务器的效率直接影响整个网络的效率。

因此,一般要用高档计算机或专用服务器计算机作为网络服务器。网络服务器主要有以下4个作用:

运行网络 *** 作系统,控制和协调网络中各计算机之间的工作,最大限度地满足用户的要求,并做出响应和处理。

存储和管理网络中的共享资源,如数据库、文件、应用程序、磁盘空间、打印机、绘图仪等。

·为各工作站的应用程序服务,如采用客户/服务器(Client/Server)结构使网络服务器不仅担当网络服务器,而且还担当应用程序服务器。

对网络活动进行监督及控制,对网络进行实际管理,分配系统资源,了解和调整系统运行状态,关闭或启动某些资源等。

参考资料:

百度百科-网络服务器

建议引入: 自定义协议或叫做消息
协议可以用基于字节的(二进制的), 也可以是基于字符的
假设是字节的, 你可以定义如下
协议头: 包括协议的长度, 协议的消息ID等你觉得需要放的数据(比如是否需要分包等)
协议内容: 包含各种参数
第一步: 客户端向服务端发送这些协议
第二步: 服务端解析这些协议
第三步: 如果你对STRUTS的工作原理有所了解的话, 建议这里有个Controler(或者叫分配器), 将协议内容分配给与消息ID相匹配的处理类
第四步: 相应的处理类进行逻辑处理, 是否返回相关数据看需求而定
如有疑问, 加百度HI再聊


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/12699258.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存