1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
/* * @(#)RMISocketFactory.java 1.22 05/11/17 * * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.rmi.server; import java.io.*; import java.net.*; /** * An <code>RMISocketFactory</code> instance is used by the RMI runtime * in order to obtain client and server sockets for RMI calls. An * application may use the <code>setSocketFactory</code> method to * request that the RMI runtime use its socket factory instance * instead of the default implementation.<p> * * The default socket factory implementation used goes through a * three-tiered approach to creating client sockets. First, a direct * socket connection to the remote VM is attempted. If that fails * (due to a firewall), the runtime uses HTTP with the explicit port * number of the server. If the firewall does not allow this type of * communication, then HTTP to a cgi-bin script on the server is used * to POST the RMI call.<p> * * @version 1.22, 11/17/05 * @author Ann Wollrath * @author Peter Jones * @since JDK1.1 */ public abstract class RMISocketFactory implements RMIClientSocketFactory, RMIServerSocketFactory { /** Client/server socket factory to be used by RMI runtime */ private static RMISocketFactory factory = null; /** default socket factory used by this RMI implementation */ private static RMISocketFactory defaultSocketFactory; /** Handler for socket creation failure */ private static RMIFailureHandler handler = null; /** * Constructs an <code>RMISocketFactory</code>. * @since JDK1.1 */ public RMISocketFactory() { super(); } /** * Creates a client socket connected to the specified host and port. * @param host the host name * @param port the port number * @return a socket connected to the specified host and port. * @exception IOException if an I/O error occurs during socket creation * @since JDK1.1 */ public abstract Socket createSocket(String host, int port) throws IOException; /** * Create a server socket on the specified port (port 0 indicates * an anonymous port). * @param port the port number * @return the server socket on the specified port * @exception IOException if an I/O error occurs during server socket * creation * @since JDK1.1 */ public abstract ServerSocket createServerSocket(int port) throws IOException; /** * Set the global socket factory from which RMI gets sockets (if the * remote object is not associated with a specific client and/or server * socket factory). The RMI socket factory can only be set once. Note: The * RMISocketFactory may only be set if the current security manager allows * setting a socket factory; if disallowed, a SecurityException will be * thrown. * @param fac the socket factory * @exception IOException if the RMI socket factory is already set * @exception SecurityException if a security manager exists and its * <code>checkSetFactory</code> method doesn't allow the operation. * @see #getSocketFactory * @see java.lang.SecurityManager#checkSetFactory() * @since JDK1.1 */ public synchronized static void setSocketFactory(RMISocketFactory fac) throws IOException { if (factory != null) { throw new SocketException("factory already defined"); } SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkSetFactory(); } factory = fac; } /** * Returns the socket factory set by the <code>setSocketFactory</code> * method. Returns <code>null</code> if no socket factory has been * set. * @return the socket factory * @see #setSocketFactory(RMISocketFactory) * @since JDK1.1 */ public synchronized static RMISocketFactory getSocketFactory() { return factory; } /** * Returns a reference to the default socket factory used * by this RMI implementation. This will be the factory used * by the RMI runtime when <code>getSocketFactory</code> * returns <code>null</code>. * @return the default RMI socket factory * @since JDK1.1 */ public synchronized static RMISocketFactory getDefaultSocketFactory() { if (defaultSocketFactory == null) { defaultSocketFactory = new sun.rmi.transport.proxy.RMIMasterSocketFactory(); } return defaultSocketFactory; } /** * Sets the failure handler to be called by the RMI runtime if server * socket creation fails. By default, if no failure handler is installed * and server socket creation fails, the RMI runtime does attempt to * recreate the server socket. * * <p>If there is a security manager, this method first calls * the security manager's <code>checkSetFactory</code> method * to ensure the operation is allowed. * This could result in a <code>SecurityException</code>. * * @param fh the failure handler * @throws SecurityException if a security manager exists and its * <code>checkSetFactory</code> method doesn't allow the * operation. * @see #getFailureHandler * @see java.rmi.server.RMIFailureHandler#failure(Exception) * @since JDK1.1 */ public synchronized static void setFailureHandler(RMIFailureHandler fh) { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkSetFactory(); } handler = fh; } /** * Returns the handler for socket creation failure set by the * <code>setFailureHandler</code> method. * @return the failure handler * @see #setFailureHandler(RMIFailureHandler) * @since JDK1.1 */ public synchronized static RMIFailureHandler getFailureHandler() { return handler; } }