home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 October / Chip_1997-10_cd.bin / tema / sybase / powerj / java.z / Socket.java < prev    next >
Text File  |  1996-05-03  |  6KB  |  207 lines

  1. /*
  2.  * @(#)Socket.java    1.20 96/03/13 Jonathan Payne
  3.  *
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, and distribute this software
  7.  * and its documentation for NON-COMMERCIAL purposes and without
  8.  * fee is hereby granted provided that this copyright notice
  9.  * appears in all copies. Please refer to the file "copyright.html"
  10.  * for further important copyright and licensing information.
  11.  *
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
  13.  * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
  14.  * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
  15.  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
  16.  * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
  17.  * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
  18.  */
  19.  
  20. package java.net;
  21.  
  22. import java.io.InputStream;
  23. import java.io.OutputStream;
  24. import java.io.IOException;
  25. import java.io.InterruptedIOException;
  26.  
  27. /**
  28.  * The client Socket class. It uses a SocketImpl
  29.  * to implement the actual socket operations. It is done this way 
  30.  * so that you are able to change socket implementations depending 
  31.  * on the kind of firewall that is used. You can change socket
  32.  * implementations by setting the SocketImplFactory.
  33.  *
  34.  * @version     1.20, 13 Mar 1996
  35.  * @author     Jonathan Payne
  36.  * @author     Arthur van Hoff
  37.  */
  38. public final 
  39. class Socket {
  40.     /**
  41.      * The implementation of this Socket.
  42.      */
  43.     SocketImpl impl;
  44.  
  45.     /**
  46.      * Creates an unconnected socket. Note: this method
  47.      * should not be public.
  48.      */
  49.     Socket() {
  50.     impl = (factory != null) ? factory.createSocketImpl() : new PlainSocketImpl();
  51.     }
  52.  
  53.     /** 
  54.      * Creates a stream socket and connects it to the specified port on
  55.      * the specified host.
  56.      * @param host the host
  57.      * @param port the port
  58.      */
  59.     public Socket(String host, int port)
  60.     throws UnknownHostException, IOException
  61.     {
  62.     this(host, port, true);
  63.     }
  64.  
  65.     /** 
  66.      * Creates a socket and connects it to the specified port on
  67.      * the specified host. The last argument lets you specify whether
  68.      * you want a stream or datagram socket.
  69.      * @param host the specified host
  70.      * @param port the specified port
  71.      * @param stream a boolean indicating whether this is a stream 
  72.      * or datagram socket
  73.      */
  74.     public Socket(String host, int port, boolean stream) throws IOException {
  75.     this();
  76.  
  77.     String hostCopy = new String(host);
  78.  
  79.     SecurityManager security = System.getSecurityManager();
  80.     if (security != null) {
  81.             hostCopy = InetAddress.getByName(hostCopy).getHostAddress();
  82.         security.checkConnect(hostCopy, port);
  83.     }
  84.  
  85.     try {
  86.         impl.create(stream);
  87.         impl.connect(hostCopy, port);
  88.     } catch (IOException e) {
  89.         impl.close();
  90.         throw e;
  91.     }
  92.     }
  93.  
  94.     /** 
  95.      * Creates a stream socket and connects it to the specified address on
  96.      * the specified port. 
  97.      * @param address the specified address
  98.      * @param port the specified port
  99.      */
  100.     public Socket(InetAddress address, int port) throws IOException {
  101.     this(address, port, true);
  102.     }
  103.  
  104.     /** 
  105.      * Creates a socket and connects it to the specified address on
  106.      * the specified port. The last argument lets you specify whether
  107.      * you want a stream or datagram socket.
  108.      * @param address the specified address
  109.      * @param port the specified port
  110.      * @param stream a boolean indicating whether this is a stream 
  111.      * or datagram socket
  112.      */
  113.     public Socket(InetAddress address, int port, boolean stream) 
  114.     throws IOException
  115.     {
  116.     this();
  117.  
  118.     SecurityManager security = System.getSecurityManager();
  119.     if (security != null) {
  120.         security.checkConnect(address.getHostAddress(), port);
  121.     }
  122.  
  123.     try {
  124.         impl.create(stream);
  125.         impl.connect(address, port);
  126.     } catch (SocketException e) {
  127.         impl.close();
  128.         throw e;
  129.     }
  130.     }
  131.  
  132.     /**
  133.      * Gets the address to which the socket is connected.
  134.      */
  135.     public InetAddress getInetAddress() {
  136.     return impl.getInetAddress();
  137.     }
  138.  
  139.     /**
  140.      * Gets the remote port to which the socket is connected.
  141.      */
  142.     public int getPort() {
  143.     return impl.getPort();
  144.     }
  145.  
  146.     /**
  147.      * Gets the local port to which the socket is connected.
  148.      */
  149.     public int getLocalPort() {
  150.     return impl.getLocalPort();
  151.     }
  152.  
  153.     /**
  154.      * Gets an InputStream for this socket.
  155.      */
  156.     public InputStream getInputStream() throws IOException {
  157.     return impl.getInputStream();
  158.     }
  159.  
  160.     /**
  161.      * Gets an OutputStream for this socket.
  162.      */
  163.     public OutputStream getOutputStream() throws IOException {
  164.     return impl.getOutputStream();
  165.     }
  166.  
  167.     /**
  168.      * Closes the socket.
  169.      */
  170.     public synchronized void close() throws IOException {
  171.     impl.close();
  172.     }
  173.  
  174.     /**
  175.      * Converts the Socket to a String.
  176.      */
  177.     public String toString() {
  178.     return "Socket[addr=" + impl.getInetAddress() +
  179.         ",port=" + impl.getPort() + 
  180.         ",localport=" + impl.getLocalPort() + "]";
  181.     }
  182.  
  183.     /**
  184.      * The factory for all client sockets.
  185.      */
  186.     private static SocketImplFactory factory;
  187.  
  188.     /**
  189.      * Sets the system's client SocketImplFactory. The factory can 
  190.      * be specified only once.
  191.      * @param fac the desired factory
  192.      * @exception SocketException If the factory is already defined.
  193.      */
  194.     public static synchronized void setSocketImplFactory(SocketImplFactory fac)
  195.     throws IOException
  196.     {
  197.     if (factory != null) {
  198.         throw new SocketException("factory already defined");
  199.     }
  200.     SecurityManager security = System.getSecurityManager();
  201.     if (security != null) {
  202.         security.checkSetFactory();
  203.     }
  204.     factory = fac;
  205.     }
  206. }
  207.