Java 如何打印我没有在CMD上开始的那个类的内容

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

这是一个与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();
          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(…)获得的代理)的引用调用远程方法后,实际发生了什么吗?本地存根在其中扮演什么角色,以及最终如何调用远程方法?