diff options
Diffstat (limited to 'luni/src/main/java/java/net/Socket.java')
-rw-r--r-- | luni/src/main/java/java/net/Socket.java | 74 |
1 files changed, 62 insertions, 12 deletions
diff --git a/luni/src/main/java/java/net/Socket.java b/luni/src/main/java/java/net/Socket.java index 36fdf28..5dd350a 100644 --- a/luni/src/main/java/java/net/Socket.java +++ b/luni/src/main/java/java/net/Socket.java @@ -312,12 +312,29 @@ public class Socket implements Closeable { */ public synchronized void close() throws IOException { isClosed = true; - // RI compatibility: the RI returns the any address (but the original local port) after close. + isConnected = false; + // RI compatibility: the RI returns the any address (but the original local port) after + // close. localAddress = Inet4Address.ANY; impl.close(); } /** + * Sets the Socket and its related SocketImpl state as if a successful close() took place, + * without actually performing an OS close(). + * + * @hide used in java.nio + */ + public void onClose() { + isClosed = true; + isConnected = false; + // RI compatibility: the RI returns the any address (but the original local port) after + // close. + localAddress = Inet4Address.ANY; + impl.onClose(); + } + + /** * Returns the IP address of the target host this socket is connected to, or null if this * socket is not yet connected. */ @@ -329,7 +346,9 @@ public class Socket implements Closeable { } /** - * Returns an input stream to read data from this socket. + * Returns an input stream to read data from this socket. If the socket has an associated + * {@link SocketChannel} and that channel is in non-blocking mode then reads from the + * stream will throw a {@link java.nio.channels.IllegalBlockingModeException}. * * @return the byte-oriented input stream. * @throws IOException @@ -353,15 +372,16 @@ public class Socket implements Closeable { } /** - * Returns the local IP address this socket is bound to, or {@code InetAddress.ANY} if - * the socket is unbound. + * Returns the local IP address this socket is bound to, or an address for which + * {@link InetAddress#isAnyLocalAddress()} returns true if the socket is closed or unbound. */ public InetAddress getLocalAddress() { return localAddress; } /** - * Returns the local port this socket is bound to, or -1 if the socket is unbound. + * Returns the local port this socket is bound to, or -1 if the socket is unbound. If the socket + * has been closed this method will still return the local port the socket was bound to. */ public int getLocalPort() { if (!isBound()) { @@ -371,7 +391,9 @@ public class Socket implements Closeable { } /** - * Returns an output stream to write data into this socket. + * Returns an output stream to write data into this socket. If the socket has an associated + * {@link SocketChannel} and that channel is in non-blocking mode then writes to the + * stream will throw a {@link java.nio.channels.IllegalBlockingModeException}. * * @return the byte-oriented output stream. * @throws IOException @@ -564,6 +586,7 @@ public class Socket implements Closeable { impl.bind(addr, localPort); } isBound = true; + cacheLocalAddress(); impl.connect(dstAddress, dstPort); isConnected = true; cacheLocalAddress(); @@ -672,9 +695,10 @@ public class Socket implements Closeable { } /** - * Returns the local address and port of this socket as a SocketAddress or - * null if the socket is unbound. This is useful on multihomed - * hosts. + * Returns the local address and port of this socket as a SocketAddress or null if the socket + * has never been bound. If the socket is closed but has previously been bound then an address + * for which {@link InetAddress#isAnyLocalAddress()} returns true will be returned with the + * previously-bound port. This is useful on multihomed hosts. */ public SocketAddress getLocalSocketAddress() { if (!isBound()) { @@ -744,9 +768,12 @@ public class Socket implements Closeable { throw new BindException("Socket is already bound"); } - int port = 0; - InetAddress addr = Inet4Address.ANY; - if (localAddr != null) { + int port; + InetAddress addr; + if (localAddr == null) { + port = 0; + addr = Inet4Address.ANY; + } else { if (!(localAddr instanceof InetSocketAddress)) { throw new IllegalArgumentException("Local address not an InetSocketAddress: " + localAddr.getClass()); @@ -771,6 +798,18 @@ public class Socket implements Closeable { } /** + * Sets the Socket and its related SocketImpl state as if a successful bind() took place, + * without actually performing an OS bind(). + * + * @hide used in java.nio + */ + public void onBind(InetAddress localAddress, int localPort) { + isBound = true; + this.localAddress = localAddress; + impl.onBind(localAddress, localPort); + } + + /** * Connects this socket to the given remote host address and port specified * by the SocketAddress {@code remoteAddr}. * @@ -851,6 +890,17 @@ public class Socket implements Closeable { } /** + * Sets the Socket and its related SocketImpl state as if a successful connect() took place, + * without actually performing an OS connect(). + * + * @hide internal use only + */ + public void onConnect(InetAddress remoteAddress, int remotePort) { + isConnected = true; + impl.onConnect(remoteAddress, remotePort); + } + + /** * Returns whether the incoming channel of the socket has already been * closed. * |