Java 如何打印我没有在CMD上开始的那个类的内容
这是一个与RMI相关的问题。我有4.class文件一个接口,它的实现,一个名为server的类和一个名为client的类 启动RMI注册表后,我启动服务器,如下所示:Java 如何打印我没有在CMD上开始的那个类的内容,java,rmi,Java,Rmi,这是一个与RMI相关的问题。我有4.class文件一个接口,它的实现,一个名为server的类和一个名为client的类 启动RMI注册表后,我启动服务器,如下所示: import java.rmi.Naming; public class Server { public static void main(String args[]) { try { to_Server_Impl toServer = new to_Server_Impl();
import java.rmi.Naming;
public class Server {
public static void main(String args[]) {
try {
to_Server_Impl toServer = new to_Server_Impl();
Naming.rebind("Server", toServer);
} catch(Exception exc) {
System.out.println(exc);
}
}
}
然后启动客户端,其代码为:
import java.rmi.Naming;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Client {
public static void main(String args[]) {
try {
to_Server_Intf s_Intf = (to_Server_Intf)Naming.lookup("rmi://127.0.0.1/Server");
do {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String message_to_send = null;
System.out.println("===Enter your message===");
message_to_send = br.readLine();
// sending a message to the server
String reply = s_Intf.send(message_to_send);
System.out.println(reply);
}while(true);
}catch(Exception exc) {
System.out.println(exc);
}
}
}
使用远程对象的引用,我调用该类的函数send
,其代码如下:
import java.rmi.*;
import java.rmi.server.*;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class to_Server_Impl extends UnicastRemoteObject implements to_Server_Intf{
public to_Server_Impl() throws Exception{ }
@Override
public String send(String str){ // this function receives the message from the Client.
// this method indirectly replies,by calling reply and then returning the replies string
String receivedString = str;
System.out.println(receivedString);
System.out.println();
String reply = reply();
return reply;
}
@Override
public String reply() { // this function replies the Client
String replyString = null;
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
replyString = br.readLine();
}catch(Exception exc) {
System.out.println(exc);
}
return replyString;
}
}
当我调用上述类的方法时,请在“server
”窗口中打印上述类的print
语句。这怎么可能?
客户端窗口:(客户端正在发送消息)
服务器窗口:(消息被打印在服务器窗口上(调用被定向到类的函数到\u Server\u Impl
)。如何?)
我不明白你的问题。在
send
方法(在服务器上,即客户端在服务器上远程调用)中,您正在打印收到的消息。因此,它出现在服务器控制台中
编辑:基本上这就是RMI的工作原理:
服务器应用程序发布一个包含要调用的可用方法的接口。在您的情况下,这是到\u Server\u Intf的。服务器还有一个接口的实现,该接口是到\u server\u Impl的。服务器通过Naming.bind
(或Naming.rebind
)将远程对象发布到注册表
客户端只知道服务器上的接口,而不知道实现。他们可以在注册表上进行查找,并使用Naming.lookup
按名称查找远程对象。现在,客户机有一个远程对象实例,可以对其调用方法。这个对象(s_intf
在客户端代码中)实际上是服务器上接口实现的本地代理。当客户端在此代理上调用方法时,调用实际上会发送到服务器上的对象,这就是为什么您在服务器控制台中看到字符串
当客户端调用本地存根上的方法时,实际发生的情况是,参数(如果有)被序列化,并创建一个TCP套接字消息(或底层实现的任何内容),该消息被发送到正在侦听传入请求的服务器。在服务器端,接收消息,反序列化参数,从消息中识别并调用正确的方法。方法返回后,再次序列化结果,创建TCP消息并将其发送回客户端。这是一个远程对象。它在服务器上执行。它在服务器上打印输出。这就是RMI的意思。如果它在客户端打印输出,它必须是本地对象,而不是远程对象。我调用了send方法,该方法属于~u Server Impl
。它是如何出现在服务器控制台上的?因为to_Server_Impl是远程对象接口的实现。在客户端中,您使用Naming.lookup查找远程对象,然后调用该方法。然后,to_server_Impl会在服务器上实际执行此方法。所以消息被打印在服务器上。我想我会得到一个关于RMI如何工作的解释@Suhail Gupta:对不起,我有点忙,我现在就编辑我的帖子。谢谢你提供的信息,但是你能更清楚地了解在我使用远程对象别名本地代理(我从Naming.lookup(…)获得的代理)的引用调用远程方法后,实际发生了什么吗?本地存根在其中扮演什么角色,以及最终如何调用远程方法?