CONTENTS | PREV | NEXT | Java Remote Method Invocation |
The RMI transport layer normally attempts to open direct sockets to hosts on the Internet. Many intranets, however, have firewalls which do not allow this. The default RMI transport, therefore, provides two alternate HTTP-based mechanisms which enable a client behind a firewall to invoke a method on a remote object which resides outside the firewall.
To get outside a firewall, the transport layer embeds an RMI call within the firewall-trusted HTTP protocol. The RMI call data is sent outside as the body of an HTTP POST request, and the return information is sent back in the body of the HTTP response. The transport layer will formulate the POST request in one of two ways:
1. | If the firewall proxy will forward an HTTP request directed to an arbitrary port on the host machine, then it is forwarded directly to the port on which the RMI server is listening. The default RMI transport layer on the target machine is listening with a server socket that is capable of understanding and decoding RMI calls inside POST requests. |
2. | If the firewall proxy will only forward HTTP requests directed to certain well-known HTTP ports, then the call will be forwarded to the HTTP server listening on port 80 of the host machine, and a CGI script will be executed to forward the call to the target RMI server port on the same machine. |
The RMI transport extends the java.rmi.server.RMISocketFactory class to provide a default implementation of a socket factory which is the resource-provider for client and server sockets. This default socket factory creates sockets that transparently provide the firewall tunnelling mechanism as follows:
- Client sockets automatically attempt HTTP connections to hosts that cannot be contacted with a direct socket.
- Server sockets automatically detect if a newly-accepted connection is an HTTP POST request, and if so, return a socket that will expose only the body of the request to the transport and format its output as an HTTP response.
Client-side sockets, with this default behavior, are provided by the factory'sjava.rmi.server.RMISocketFactory.createSocket
method. Server-side sockets with this default behavior are provided by the factory'sjava.rmi.server.RMISocketFactory.createServerSocket
method.
There is no special configuration necessary to enable the client to send RMI calls through a firewall.The client can, however, disable the packaging of RMI calls as HTTP requests by setting the java.rmi.server.disableHttp property to equal the boolean value true.
Note - The host name should not be specified as the host's IP address, because some firewall proxies will not forward to such a host name.
1. | In order for a client outside the server host's domain to be able to invoke methods on a server's remote objects, the client must be able to find the server. To do this, the remote references that the server exports must contain the fully-qualified name of the server host. |
Depending on the server's platform and network environment, this information may or may not be available to the Java virtual machine on which the server is running. If it is not available, the host's fully qualified name must be specified with the property java.rmi.server.hostname when starting the server. |
For example, use this command to start the RMI server class ServerImpl on the machine chatsubo.javasoft.com: |
java -Djava.rmi.server.hostname=chatsubo.javasoft.com ServerImpl
2. | If the server will not support RMI clients behind firewalls that can forward to arbitrary ports, use this configuration: |
a. | An HTTP server is listening on port 80. |
b. | A CGI script is located at the aliased URL path |
/cgi-bin/java-rmi.cgi
- This script:
- | Invokes the local Java interpreter to execute a class internal to the transport layer which forwards the request to the appropriate RMI server port. |
- | Defines properties in the Java virtual machine with the same names and values as the CGI 1.0 defined environment variables. |
An example script is supplied in the RMI distribution for the Solaris and Windows 32 operating systems. Note that the script must specify the complete path to the java interpreter on the server machine. |
Calls transmitted via HTTP requests are at least an order of magnitude slower that those sent through direct sockets, without taking proxy forwarding delays into consideration.Because HTTP requests can only be initiated in one direction through a firewall, a client cannot export its own remote objects outside the firewall, because a host outside the firewall cannot initiate a method invocation back on the client.