我在RMI中没有得到一件事。实际上有点令人困惑。
在客户端,我们有业务接口(Hello.class),客户端代码(HelloClient.class)和远程存根(可能是Hello_stub.class),在服务器端我们有服务器代码(HelloImpl.class) ,业务接口(Hello.class)和骨架。
对于Java 5以上版本,我们不会创建存根,但我相信它们仍然是c =。
那么,沟通是如何发生的?
客户端调用Hello.class上的方法,然后调用Hello_stub.class进行所有n / w操作。 Hello_stub.class调用骨架,然后调用Hello.class然后调用HelloImpl.class上的方法?
阅读Head first EJB后,我有点困惑:)。如果有人澄清它,我会很高兴。
答案 0 :(得分:2)
调用存根方法时:
它从客户端连接池中获取到目标的TCP连接,或者如果没有池连接则创建一个
将调用和参数捆绑为可序列化对象。
将对象与其他一些内容(如JRMP协议头和远程objectID)一起写入连接。
从连接中读取回复对象。
返回与池的连接,在某个空闲时间后它将被关闭。
如果回复对象是异常,则抛出它。
否则返回回复对象作为方法结果。
在服务器上,一个线程位于侦听套接字上,接受连接,创建线程,并通过指定的对象ID将传入的远程调用分派给正确的远程对象。
这是通过反思完成的。自1998年以来,RMI骨架一直没有使用过,除非你故意用rmic -v1.1
生成存根,但原则是相同的。