home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / rmi / transport / tcp / TCPTransport.class (.txt) < prev   
Encoding:
Java Class File  |  1997-07-08  |  10.5 KB  |  454 lines

  1. package sun.rmi.transport.tcp;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.io.PrintStream;
  9. import java.net.BindException;
  10. import java.net.InetAddress;
  11. import java.net.ServerSocket;
  12. import java.net.Socket;
  13. import java.rmi.RemoteException;
  14. import java.rmi.server.ExportException;
  15. import java.rmi.server.LogStream;
  16. import java.rmi.server.ObjID;
  17. import java.rmi.server.RMIFailureHandler;
  18. import java.rmi.server.RMISocketFactory;
  19. import java.rmi.server.SocketSecurityException;
  20. import java.rmi.server.UID;
  21. import java.util.Enumeration;
  22. import java.util.Hashtable;
  23. import sun.applet.AppletSecurityException;
  24. import sun.rmi.transport.Channel;
  25. import sun.rmi.transport.Connection;
  26. import sun.rmi.transport.DGCAckHandler;
  27. import sun.rmi.transport.Endpoint;
  28. import sun.rmi.transport.RMIThread;
  29. import sun.rmi.transport.StreamRemoteCall;
  30. import sun.rmi.transport.Target;
  31. import sun.rmi.transport.Transport;
  32. import sun.rmi.transport.Utils;
  33. import sun.rmi.transport.proxy.RMIMasterSocketFactory;
  34.  
  35. public class TCPTransport extends Transport implements Runnable {
  36.    static int logLevel = LogStream.parseLevel(Utils.getProperty("sun.rmi.transport.tcp.logLevel"));
  37.    static int DefaultPort;
  38.    private boolean listenNotAllowed;
  39.    private boolean exportNotAllowed;
  40.    private static int threadNum;
  41.    private static Hashtable clientConnections = new Hashtable(37);
  42.    private TCPEndpoint endpoint;
  43.    private ServerSocket server;
  44.    private Hashtable channelTable;
  45.    static RMISocketFactory defaultSocketFactory = new RMIMasterSocketFactory();
  46.  
  47.    TCPTransport() {
  48.       this(0);
  49.    }
  50.  
  51.    TCPTransport(int var1) {
  52.       this.listenNotAllowed = false;
  53.       this.exportNotAllowed = false;
  54.       this.channelTable = new Hashtable();
  55.       if (logLevel >= 10) {
  56.          LogStream.log("tcp").println("TCPTransport.<init>: Version = " + 2 + ", port = " + var1);
  57.       }
  58.  
  59.       this.endpoint = TCPEndpoint.getLocalEndpoint(var1);
  60.    }
  61.  
  62.    public Channel getChannel(Endpoint var1) {
  63.       Object var2 = null;
  64.       if (var1 instanceof TCPEndpoint) {
  65.          Hashtable var3 = this.channelTable;
  66.          synchronized(var3) {
  67.             var2 = (Channel)this.channelTable.get(var1);
  68.             if (var2 == null) {
  69.                var2 = new TCPChannel(this, (TCPEndpoint)var1);
  70.                if (this.listenNotAllowed && !this.exportNotAllowed) {
  71.                   try {
  72.                      ((TCPChannel)var2).haveMultiplexer();
  73.                   } catch (RemoteException var12) {
  74.                      RemoteException var5 = var12;
  75.                      if (logLevel >= 10) {
  76.                         LogStream var6 = LogStream.log("tcp");
  77.                         synchronized(var6){}
  78.  
  79.                         try {
  80.                            ((PrintStream)var6).print("TCPTransport(" + this.endpoint.getPort() + ").getChannel: " + "failed to have multiplexed connection " + "on channel, exception: ");
  81.                            ((Throwable)var5).printStackTrace(var6);
  82.                         } catch (Throwable var11) {
  83.                            throw var11;
  84.                         }
  85.                      }
  86.  
  87.                      this.exportNotAllowed = true;
  88.                   }
  89.                }
  90.  
  91.                this.channelTable.put(var1, var2);
  92.             }
  93.          }
  94.       }
  95.  
  96.       return (Channel)var2;
  97.    }
  98.  
  99.    public Endpoint thisEndpoint() {
  100.       return this.endpoint;
  101.    }
  102.  
  103.    public void exportObject(ObjID var1, Target var2) throws RemoteException {
  104.       if (this.exportNotAllowed) {
  105.          throw new ExportException("Cannot export to server outside firewall");
  106.       } else {
  107.          super.exportObject(var1, var2);
  108.          if (!this.listenNotAllowed || !this.endpoint.equals(TCPEndpoint.getLocalEndpoint(0))) {
  109.             try {
  110.                this.listen();
  111.             } catch (SocketSecurityException var17) {
  112.                SocketSecurityException var3 = var17;
  113.                if (logLevel >= 10) {
  114.                   LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").exportObject: " + "listen failed with exception " + ((Throwable)var17).toString());
  115.                }
  116.  
  117.                if (this.endpoint.getPort() != 0) {
  118.                   throw var17;
  119.                } else {
  120.                   Hashtable var4 = this.channelTable;
  121.                   synchronized(var4) {
  122.                      this.listenNotAllowed = true;
  123.                      Enumeration var6 = this.channelTable.elements();
  124.  
  125.                      while(var6.hasMoreElements()) {
  126.                         TCPChannel var7 = (TCPChannel)var6.nextElement();
  127.  
  128.                         try {
  129.                            var7.haveMultiplexer();
  130.                         } catch (RemoteException var15) {
  131.                            if (logLevel >= 10) {
  132.                               LogStream var8 = LogStream.log("tcp");
  133.                               synchronized(var8){}
  134.  
  135.                               try {
  136.                                  ((PrintStream)var8).print("TCPTransport(" + this.endpoint.getPort() + ").exportObject: " + "failed to have multiplexed connection " + "on channel, exception: ");
  137.                                  ((Throwable)var3).printStackTrace(var8);
  138.                               } catch (Throwable var14) {
  139.                                  throw var14;
  140.                               }
  141.                            }
  142.  
  143.                            this.exportNotAllowed = true;
  144.                            throw new ExportException("Cannot export to server outside firewall");
  145.                         }
  146.                      }
  147.  
  148.                      System.out.println("\n*** RMI unable to listen on socket: using multiplexed connections instead ***\n");
  149.                   }
  150.  
  151.                }
  152.             }
  153.          }
  154.       }
  155.    }
  156.  
  157.    private synchronized void listen() throws RemoteException {
  158.       if (this.server == null) {
  159.          int var1 = this.endpoint.getPort();
  160.          if (logLevel >= 10) {
  161.             LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").listen: " + "create socket, port = " + var1);
  162.          }
  163.  
  164.          try {
  165.             try {
  166.                RMISocketFactory var2 = RMISocketFactory.getSocketFactory();
  167.                if (Utils.getLong("sun.rmi.transport.tcp.simulateApplet", 0L).intValue() >= 2) {
  168.                   throw new AppletSecurityException("socket.listen");
  169.                }
  170.  
  171.                this.server = (var2 != null ? var2 : defaultSocketFactory).createServerSocket(var1);
  172.             } catch (IOException var3) {
  173.                if (!this.retryServerSocket()) {
  174.                   throw var3;
  175.                }
  176.             }
  177.  
  178.             if (DefaultPort == 0 && var1 == 0) {
  179.                DefaultPort = this.server.getLocalPort();
  180.                if (logLevel >= 10) {
  181.                   LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").listen: " + "default port set to " + DefaultPort);
  182.                }
  183.  
  184.                TCPEndpoint.setDefaultPort(DefaultPort);
  185.             }
  186.  
  187.             this.newListener();
  188.          } catch (SecurityException var4) {
  189.             throw new SocketSecurityException("Listen disallowed on port: " + var1, var4);
  190.          } catch (BindException var5) {
  191.             throw new ExportException("Port already in use: " + var1, var5);
  192.          } catch (IOException var6) {
  193.             throw new ExportException("Listen failed on port: " + var1, var6);
  194.          }
  195.       }
  196.    }
  197.  
  198.    private void newListener() {
  199.       Thread var1 = RMIThread.newThread(this, "TCP Accept-" + ++threadNum, true);
  200.       var1.start();
  201.    }
  202.  
  203.    private synchronized boolean retryServerSocket() {
  204.       int var1 = this.endpoint.getPort();
  205.  
  206.       while(true) {
  207.          try {
  208.             RMISocketFactory var2 = RMISocketFactory.getSocketFactory();
  209.             this.server = (var2 != null ? var2 : defaultSocketFactory).createServerSocket(var1);
  210.             return true;
  211.          } catch (IOException var4) {
  212.             RMIFailureHandler var3 = RMISocketFactory.getFailureHandler();
  213.             if (var3 == null || !var3.failure(var4)) {
  214.                this.server = null;
  215.                return false;
  216.             }
  217.          }
  218.       }
  219.    }
  220.  
  221.    public void run() {
  222.       if (logLevel >= 10) {
  223.          LogStream.log("tcp").println("TCPTransport.run: listening on port " + this.endpoint.getPort());
  224.       }
  225.  
  226.       while(true) {
  227.          ServerSocket var2 = this.server;
  228.          if (var2 == null) {
  229.             return;
  230.          }
  231.  
  232.          Object var3 = null;
  233.  
  234.          Socket var1;
  235.          try {
  236.             var1 = var2.accept();
  237.          } catch (IOException var56) {
  238.             var3 = var56;
  239.             continue;
  240.          } catch (RuntimeException var57) {
  241.             var3 = var57;
  242.             continue;
  243.          } catch (Error var58) {
  244.             var3 = var58;
  245.             continue;
  246.          } finally {
  247.             if (var3 != null) {
  248.                try {
  249.                   this.server.close();
  250.                } catch (IOException var51) {
  251.                }
  252.  
  253.                if (!(var3 instanceof IOException) && !(var3 instanceof NoClassDefFoundError)) {
  254.                   if (var3 instanceof RuntimeException) {
  255.                      throw (RuntimeException)var3;
  256.                   }
  257.  
  258.                   throw (Error)var3;
  259.                }
  260.  
  261.                if (!this.retryServerSocket()) {
  262.                   return;
  263.                }
  264.             }
  265.  
  266.          }
  267.  
  268.          try {
  269.             var1.setTcpNoDelay(true);
  270.          } catch (Exception var53) {
  271.          }
  272.  
  273.          this.newListener();
  274.  
  275.          try {
  276.             InputStream var4 = var1.getInputStream();
  277.             DataInputStream var60 = new DataInputStream(var4);
  278.             OutputStream var6 = var1.getOutputStream();
  279.             DataOutputStream var7 = new DataOutputStream(var6);
  280.             int var8 = var60.readInt();
  281.             short var9 = var60.readShort();
  282.             if (var8 == 1246907721 && var9 == 2) {
  283.                InetAddress var10 = var1.getInetAddress();
  284.                String var11 = var10 != null ? var10.getHostName() : "";
  285.                if (logLevel >= 10) {
  286.                   LogStream.log("tcp").println("TCPTransport.run: accepted socket from [" + var11 + ":" + var1.getPort() + "]");
  287.                }
  288.  
  289.                byte var15 = var60.readByte();
  290.                switch (var15) {
  291.                   case 75:
  292.                      var7.writeByte(78);
  293.                      var7.flush();
  294.                      TCPEndpoint var63 = new TCPEndpoint(var11, var1.getPort());
  295.                      if (logLevel >= 20) {
  296.                         LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").run: " + "suggesting endpoint " + var63);
  297.                      }
  298.  
  299.                      var63.write(var7);
  300.                      var7.flush();
  301.                      var63 = TCPEndpoint.read(var60);
  302.                      if (logLevel >= 20) {
  303.                         LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").run: " + "using endpoint " + var63);
  304.                      }
  305.  
  306.                      var63 = new TCPEndpoint(var11, var1.getLocalPort());
  307.                      TCPChannel var67 = new TCPChannel(this, var63);
  308.                      TCPConnection var68 = new TCPConnection(var67, var1);
  309.                      this.handleMessages(var68, true);
  310.                      return;
  311.                   case 76:
  312.                      TCPEndpoint var62 = new TCPEndpoint(var11, var1.getLocalPort());
  313.                      TCPChannel var66 = new TCPChannel(this, var62);
  314.                      TCPConnection var14 = new TCPConnection(var66, var1);
  315.                      this.handleMessages(var14, false);
  316.                      return;
  317.                   case 77:
  318.                      if (logLevel >= 20) {
  319.                         LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").run: " + "accepting multiplex protocol");
  320.                      }
  321.  
  322.                      var7.writeByte(78);
  323.                      TCPEndpoint var12 = new TCPEndpoint(var11, var1.getPort());
  324.                      if (logLevel >= 20) {
  325.                         LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").run: " + "suggesting endpoint " + var12);
  326.                      }
  327.  
  328.                      var12.write(var7);
  329.                      var7.flush();
  330.                      var12 = TCPEndpoint.read(var60);
  331.                      if (logLevel >= 20) {
  332.                         LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").run: " + "using endpoint " + var12);
  333.                      }
  334.  
  335.                      Hashtable var17 = this.channelTable;
  336.                      synchronized(var17){}
  337.  
  338.                      ConnectionMultiplexer var16;
  339.                      try {
  340.                         TCPChannel var13 = (TCPChannel)this.getChannel(var12);
  341.                         var16 = new ConnectionMultiplexer(var13, var4, var6, false);
  342.                         var13.useMultiplexer(var16);
  343.                      } catch (Throwable var52) {
  344.                         throw var52;
  345.                      }
  346.  
  347.                      var16.run();
  348.                      return;
  349.                   default:
  350.                      var7.writeByte(79);
  351.                      var7.flush();
  352.                      return;
  353.                }
  354.             }
  355.  
  356.             closeSocket(var1);
  357.          } catch (IOException var54) {
  358.             if (logLevel >= 10) {
  359.                LogStream var5 = LogStream.log("tcp");
  360.                ((PrintStream)var5).println("TCPTransport.run: terminated with exception: ");
  361.                ((Throwable)var54).printStackTrace(var5);
  362.             }
  363.  
  364.             return;
  365.          } finally {
  366.             closeSocket(var1);
  367.          }
  368.  
  369.          return;
  370.       }
  371.    }
  372.  
  373.    private static void closeSocket(Socket var0) {
  374.       try {
  375.          var0.close();
  376.       } catch (IOException var1) {
  377.       }
  378.    }
  379.  
  380.    void handleMessages(Connection var1, boolean var2) {
  381.       Thread var3 = Thread.currentThread();
  382.       clientConnections.put(var3, var1);
  383.  
  384.       try {
  385.          do {
  386.             DataInputStream var6 = new DataInputStream(var1.getInputStream());
  387.             byte var18 = var6.readByte();
  388.             if (logLevel >= 10) {
  389.                LogStream.log("tcp").println("TCPTransport(" + this.endpoint.getPort() + ").handleMessages: op = " + var18);
  390.             }
  391.  
  392.             switch (var18) {
  393.                case 80:
  394.                   StreamRemoteCall var8 = new StreamRemoteCall(var1);
  395.                   if (!((Transport)this).serviceCall(var8)) {
  396.                      return;
  397.                   }
  398.                   break;
  399.                case 82:
  400.                   DataOutputStream var9 = new DataOutputStream(var1.getOutputStream());
  401.                   var9.writeByte(83);
  402.                   var1.releaseOutputStream();
  403.                   break;
  404.                case 84:
  405.                   DGCAckHandler.received(UID.read(var6));
  406.                   break;
  407.                default:
  408.                   throw new IOException("unknown transport op " + var18);
  409.             }
  410.          } while(var2);
  411.  
  412.       } catch (IOException var16) {
  413.          if (logLevel >= 10) {
  414.             LogStream var7 = LogStream.log("tcp");
  415.             ((PrintStream)var7).println("TCPTransport(" + this.endpoint.getPort() + ").handleMessages: exception: ");
  416.             ((Throwable)var16).printStackTrace(var7);
  417.          }
  418.  
  419.       } finally {
  420.          clientConnections.remove(var3);
  421.  
  422.          try {
  423.             var1.close();
  424.          } catch (IOException var15) {
  425.          }
  426.  
  427.       }
  428.    }
  429.  
  430.    public static Channel getCurrentChannel() {
  431.       Thread var0 = Thread.currentThread();
  432.       Object var1 = clientConnections.get(var0);
  433.       if (var1 != null && var1 instanceof Connection) {
  434.          Channel var2 = ((Connection)var1).getChannel();
  435.          return var2;
  436.       } else {
  437.          return null;
  438.       }
  439.    }
  440.  
  441.    void ping() {
  442.       Enumeration var1 = this.channelTable.elements();
  443.  
  444.       while(var1.hasMoreElements()) {
  445.          TCPChannel var2 = (TCPChannel)var1.nextElement();
  446.          if (var2.ping() == 1) {
  447.             Endpoint var3 = var2.getEndpoint();
  448.             this.channelTable.remove(var3);
  449.          }
  450.       }
  451.  
  452.    }
  453. }
  454.