diff options
Diffstat (limited to 'libjava/java/net/Socket.java')
-rw-r--r-- | libjava/java/net/Socket.java | 147 |
1 files changed, 112 insertions, 35 deletions
diff --git a/libjava/java/net/Socket.java b/libjava/java/net/Socket.java index 14ee5b3..1b443d0 100644 --- a/libjava/java/net/Socket.java +++ b/libjava/java/net/Socket.java @@ -68,29 +68,22 @@ import java.nio.channels.IllegalBlockingModeException; */ public class Socket { - - // Class Variables - /** * This is the user SocketImplFactory for this class. If this variable is * null, a default factory is used. */ static SocketImplFactory factory; - // Instance Variables - /** * The implementation object to which calls are redirected */ - SocketImpl impl; + private SocketImpl impl; private boolean implCreated = false; private boolean inputShutdown = false; private boolean outputShutdown = false; - private boolean closed = false; - /** * Initializes a new instance of <code>Socket</code> object without * connecting to a remote host. This useful for subclasses of socket that @@ -175,7 +168,7 @@ public class Socket * * @param host The name of the remote host to connect to. * @param port The remote port to connect to. - * @param loadAddr The local address to bind to. + * @param localAddr The local address to bind to. * @param localPort The local port to bind to. * * @exception SecurityException If the <code>SecurityManager</code> @@ -298,7 +291,8 @@ public class Socket // that default. JDK 1.2 doc infers not to do a bind. } - private SocketImpl getImpl() + // This has to be accessible from java.net.ServerSocket. + SocketImpl getImpl() throws SocketException { try @@ -331,8 +325,8 @@ public class Socket */ public void bind (SocketAddress bindpoint) throws IOException { - if (closed) - throw new SocketException ("Socket is closed"); + if (isClosed()) + throw new SocketException("socket is closed"); // XXX: JDK 1.4.1 API documentation says that if bindpoint is null the // socket will be bound to an ephemeral port and a valid local address. @@ -390,6 +384,8 @@ public class Socket * until established or an error occurs. * * @param endpoint The address to connect to + * @param timeout The length of the timeout in milliseconds, or + * 0 to indicate no timeout. * * @exception IOException If an error occurs * @exception IllegalArgumentException If the address type is not supported @@ -402,11 +398,11 @@ public class Socket public void connect (SocketAddress endpoint, int timeout) throws IOException { - if (closed) - throw new SocketException ("Socket is closed"); + if (isClosed()) + throw new SocketException("socket is closed"); if (! (endpoint instanceof InetSocketAddress)) - throw new IllegalArgumentException ("Address type not supported"); + throw new IllegalArgumentException("unsupported address type"); if (getChannel() != null && !getChannel().isBlocking ()) @@ -598,10 +594,13 @@ public class Socket */ public InputStream getInputStream () throws IOException { - if (getImpl() != null) - return getImpl().getInputStream(); - - throw new IOException("Not connected"); + if (isClosed()) + throw new SocketException("socket is closed"); + + if (!isConnected()) + throw new IOException("not connected"); + + return getImpl().getInputStream(); } /** @@ -613,10 +612,13 @@ public class Socket */ public OutputStream getOutputStream () throws IOException { - if (getImpl() != null) - return getImpl().getOutputStream(); - - throw new IOException("Not connected"); + if (isClosed()) + throw new SocketException("socket is closed"); + + if (!isConnected()) + throw new IOException("not connected"); + + return getImpl().getOutputStream(); } /** @@ -630,6 +632,9 @@ public class Socket */ public void setTcpNoDelay (boolean on) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + getImpl().setOption(SocketOptions.TCP_NODELAY, new Boolean(on)); } @@ -647,6 +652,9 @@ public class Socket */ public boolean getTcpNoDelay() throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object on = getImpl().getOption(SocketOptions.TCP_NODELAY); if (on instanceof Boolean) @@ -674,6 +682,9 @@ public class Socket */ public void setSoLinger(boolean on, int linger) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + if (on == true) { if (linger < 0) @@ -708,6 +719,9 @@ public class Socket */ public int getSoLinger() throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object linger = getImpl().getOption(SocketOptions.SO_LINGER); if (linger instanceof Integer) @@ -728,6 +742,9 @@ public class Socket */ public void sendUrgentData (int data) throws IOException { + if (isClosed()) + throw new SocketException("socket is closed"); + getImpl().sendUrgentData (data); } @@ -742,18 +759,26 @@ public class Socket */ public void setOOBInline (boolean on) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + getImpl().setOption(SocketOptions.SO_OOBINLINE, new Boolean(on)); } /** * Returns the current setting of the SO_OOBINLINE option for this socket * + * @return True if SO_OOBINLINE is set, false otherwise. + * * @exception SocketException If an error occurs * * @since 1.4 */ public boolean getOOBInline () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object buf = getImpl().getOption(SocketOptions.SO_OOBINLINE); if (buf instanceof Boolean) @@ -781,6 +806,9 @@ public class Socket */ public synchronized void setSoTimeout (int timeout) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + if (timeout < 0) throw new IllegalArgumentException("SO_TIMEOUT value must be >= 0"); @@ -806,6 +834,9 @@ public class Socket */ public synchronized int getSoTimeout () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object timeout = getImpl().getOption(SocketOptions.SO_TIMEOUT); if (timeout instanceof Integer) return(((Integer)timeout).intValue()); @@ -827,6 +858,9 @@ public class Socket */ public void setSendBufferSize (int size) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + if (size <= 0) throw new IllegalArgumentException("SO_SNDBUF value must be > 0"); @@ -846,6 +880,9 @@ public class Socket */ public int getSendBufferSize () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object buf = getImpl().getOption(SocketOptions.SO_SNDBUF); if (buf instanceof Integer) @@ -868,6 +905,9 @@ public class Socket */ public void setReceiveBufferSize (int size) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + if (size <= 0) throw new IllegalArgumentException("SO_RCVBUF value must be > 0"); @@ -887,6 +927,9 @@ public class Socket */ public int getReceiveBufferSize () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object buf = getImpl().getOption(SocketOptions.SO_RCVBUF); if (buf instanceof Integer) @@ -907,6 +950,9 @@ public class Socket */ public void setKeepAlive (boolean on) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + getImpl().setOption(SocketOptions.SO_KEEPALIVE, new Boolean(on)); } @@ -922,6 +968,9 @@ public class Socket */ public boolean getKeepAlive () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object buf = getImpl().getOption(SocketOptions.SO_KEEPALIVE); if (buf instanceof Boolean) @@ -937,13 +986,15 @@ public class Socket */ public synchronized void close () throws IOException { - if (getImpl() != null) - getImpl().close(); + if (isClosed()) + throw new SocketException("socket is closed"); + + getImpl().close(); if (getChannel() != null) getChannel().close(); - closed = true; + impl = null; } /** @@ -958,7 +1009,8 @@ public class Socket if (isConnected()) return ("Socket[addr=" + getImpl().getInetAddress() + ",port=" + getImpl().getPort() - + ",localport=" + getImpl().getLocalPort()); + + ",localport=" + getImpl().getLocalPort() + + "]"); } catch (SocketException e) { @@ -968,8 +1020,6 @@ public class Socket return "Socket[unconnected]"; } - // Class Methods - /** * Sets the <code>SocketImplFactory</code>. This may be done only once per * virtual machine. Subsequent attempts will generate a @@ -1010,9 +1060,10 @@ public class Socket */ public void shutdownInput() throws IOException { - if (getImpl() != null) - getImpl().shutdownInput(); - + if (isClosed()) + throw new SocketException("socket is closed"); + + getImpl().shutdownInput(); inputShutdown = true; } @@ -1025,9 +1076,10 @@ public class Socket */ public void shutdownOutput() throws IOException { - if (getImpl() != null) - getImpl().shutdownOutput(); + if (isClosed()) + throw new SocketException("socket is closed"); + getImpl().shutdownOutput(); outputShutdown = true; } @@ -1046,12 +1098,17 @@ public class Socket /** * Checks if the SO_REUSEADDR option is enabled * + * @return True if SO_REUSEADDR is set, false otherwise. + * * @exception SocketException If an error occurs * * @since 1.4 */ public boolean getReuseAddress () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object reuseaddr = getImpl().getOption (SocketOptions.SO_REUSEADDR); if (!(reuseaddr instanceof Boolean)) @@ -1063,6 +1120,8 @@ public class Socket /** * Enables/Disables the SO_REUSEADDR option * + * @param reuseAddress True if SO_REUSEADDR should be set. + * * @exception SocketException If an error occurs * * @since 1.4 @@ -1075,6 +1134,8 @@ public class Socket /** * Returns the current traffic class * + * @return The current traffic class. + * * @exception SocketException If an error occurs * * @see Socket#setTrafficClass(int tc) @@ -1083,6 +1144,9 @@ public class Socket */ public int getTrafficClass () throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + Object obj = getImpl().getOption(SocketOptions.IP_TOS); if (obj instanceof Integer) @@ -1105,6 +1169,9 @@ public class Socket */ public void setTrafficClass (int tc) throws SocketException { + if (isClosed()) + throw new SocketException("socket is closed"); + if (tc < 0 || tc > 255) throw new IllegalArgumentException(); @@ -1114,6 +1181,8 @@ public class Socket /** * Checks if the socket is connected * + * @return True if socket is connected, false otherwise. + * * @since 1.4 */ public boolean isConnected () @@ -1131,6 +1200,8 @@ public class Socket /** * Checks if the socket is already bound. * + * @return True if socket is bound, false otherwise. + * * @since 1.4 */ public boolean isBound () @@ -1141,16 +1212,20 @@ public class Socket /** * Checks if the socket is closed. * + * @return True if socket is closed, false otherwise. + * * @since 1.4 */ public boolean isClosed () { - return closed; + return impl == null; } /** * Checks if the socket's input stream is shutdown * + * @return True if input is shut down. + * * @since 1.4 */ public boolean isInputShutdown () @@ -1161,6 +1236,8 @@ public class Socket /** * Checks if the socket's output stream is shutdown * + * @return True if output is shut down. + * * @since 1.4 */ public boolean isOutputShutdown () |