151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.nio.channels; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.Socket; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.SocketOption; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.net.SocketAddress; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.ByteBuffer; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.spi.AbstractSelectableChannel; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.channels.spi.SelectorProvider; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A selectable channel for stream-oriented connecting sockets. 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A socket channel is created by invoking one of the {@link #open open} 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * methods of this class. It is not possible to create a channel for an arbitrary, 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * pre-existing socket. A newly-created socket channel is open but not yet 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connected. An attempt to invoke an I/O operation upon an unconnected 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channel will cause a {@link NotYetConnectedException} to be thrown. A 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * socket channel can be connected by invoking its {@link #connect connect} 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method; once connected, a socket channel remains connected until it is 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * closed. Whether or not a socket channel is connected may be determined by 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoking its {@link #isConnected isConnected} method. 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Socket channels support <i>non-blocking connection:</i> A socket 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channel may be created and the process of establishing the link to the 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * remote socket may be initiated via the {@link #connect connect} method for 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * later completion by the {@link #finishConnect finishConnect} method. 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Whether or not a connection operation is in progress may be determined by 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoking the {@link #isConnectionPending isConnectionPending} method. 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Socket channels support <i>asynchronous shutdown,</i> which is similar 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to the asynchronous close operation specified in the {@link Channel} class. 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the input side of a socket is shut down by one thread while another 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * thread is blocked in a read operation on the socket's channel, then the read 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operation in the blocked thread will complete without reading any bytes and 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will return <tt>-1</tt>. If the output side of a socket is shut down by one 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * thread while another thread is blocked in a write operation on the socket's 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channel, then the blocked thread will receive an {@link 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AsynchronousCloseException}. 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Socket options are configured using the {@link #setOption(SocketOption,Object) 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * setOption} method. Socket channels support the following options: 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <blockquote> 6946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <table border summary="Socket options"> 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <th>Option Name</th> 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <th>Description</th> 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> {@link java.net.StandardSocketOptions#SO_SNDBUF SO_SNDBUF} </td> 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> The size of the socket send buffer </td> 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> {@link java.net.StandardSocketOptions#SO_RCVBUF SO_RCVBUF} </td> 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> The size of the socket receive buffer </td> 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> {@link java.net.StandardSocketOptions#SO_KEEPALIVE SO_KEEPALIVE} </td> 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> Keep connection alive </td> 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> {@link java.net.StandardSocketOptions#SO_REUSEADDR SO_REUSEADDR} </td> 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> Re-use address </td> 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> {@link java.net.StandardSocketOptions#SO_LINGER SO_LINGER} </td> 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> Linger on close if data is present (when configured in blocking mode 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * only) </td> 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tr> 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> {@link java.net.StandardSocketOptions#TCP_NODELAY TCP_NODELAY} </td> 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <td> Disable the Nagle algorithm </td> 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </tr> 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </table> 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </blockquote> 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Additional (implementation specific) options may also be supported. 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Socket channels are safe for use by multiple concurrent threads. They 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * support concurrent reading and writing, though at most one thread may be 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * reading and at most one thread may be writing at any given time. The {@link 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * #connect connect} and {@link #finishConnect finishConnect} methods are 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mutually synchronized against each other, and an attempt to initiate a read 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or write operation while an invocation of one of these methods is in 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * progress will block until that invocation is complete. </p> 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Mark Reinhold 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author JSR-51 Expert Group 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class SocketChannel 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski extends AbstractSelectableChannel 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski{ 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initializes a new instance of this class. 12346805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * 12446805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @param provider 12546805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * The provider that created this channel 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected SocketChannel(SelectorProvider provider) { 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(provider); 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Opens a socket channel. 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The new channel is created by invoking the {@link 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.nio.channels.spi.SelectorProvider#openSocketChannel 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * openSocketChannel} method of the system-wide default {@link 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.nio.channels.spi.SelectorProvider} object. </p> 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return A new socket channel 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static SocketChannel open() throws IOException { 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return SelectorProvider.provider().openSocketChannel(); 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Opens a socket channel and connects it to a remote address. 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This convenience method works as if by invoking the {@link #open()} 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method, invoking the {@link #connect(SocketAddress) connect} method upon 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the resulting socket channel, passing it <tt>remote</tt>, and then 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * returning that channel. </p> 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param remote 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The remote address to which the new channel is to be connected 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @return A new, and connected, socket channel 16046805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws AsynchronousCloseException 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If another thread closes this channel 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while the connect operation is in progress 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedByInterruptException 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If another thread interrupts the current thread 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while the connect operation is in progress, thereby 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * closing the channel and setting the current thread's 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interrupt status 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnresolvedAddressException 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the given remote address is not fully resolved 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedAddressTypeException 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the type of the given remote address is not supported 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws SecurityException 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If a security manager has been installed 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and it does not permit access to the given remote endpoint 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If some other I/O error occurs 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static SocketChannel open(SocketAddress remote) 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SocketChannel sc = open(); 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.connect(remote); 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Throwable x) { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski sc.close(); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Throwable suppressed) { 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski x.addSuppressed(suppressed); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw x; 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski assert sc.isConnected(); 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return sc; 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an operation set identifying this channel's supported 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operations. 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Socket channels support connecting, reading, and writing, so this 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT} 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>|</tt> {@link SelectionKey#OP_READ} <tt>|</tt> {@link 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * SelectionKey#OP_WRITE}<tt>)</tt>. </p> 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The valid-operation set 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final int validOps() { 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (SelectionKey.OP_READ 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski | SelectionKey.OP_WRITE 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski | SelectionKey.OP_CONNECT); 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // -- Socket-specific operations -- 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ConnectionPendingException 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If a non-blocking connect operation is already in progress on 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this channel 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws AlreadyBoundException {@inheritDoc} 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedAddressTypeException {@inheritDoc} 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException {@inheritDoc} 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException {@inheritDoc} 23046805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @throws SecurityException 23146805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * If a security manager has been installed and its 23246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * {@link SecurityManager#checkListen checkListen} method denies 23346805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * the operation 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Override 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract SocketChannel bind(SocketAddress local) 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException; 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedOperationException {@inheritDoc} 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IllegalArgumentException {@inheritDoc} 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException {@inheritDoc} 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException {@inheritDoc} 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski @Override 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract <T> SocketChannel setOption(SocketOption<T> name, T value) 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException; 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Shutdown the connection for reading without closing the channel. 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Once shutdown for reading then further reads on the channel will 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * return {@code -1}, the end-of-stream indication. If the input side of the 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection is already shutdown then invoking this method has no effect. 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The channel 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is closed 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If some other I/O error occurs 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract SocketChannel shutdownInput() throws IOException; 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Shutdown the connection for writing without closing the channel. 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Once shutdown for writing then further attempts to write to the 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channel will throw {@link ClosedChannelException}. If the output side of 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the connection is already shutdown then invoking this method has no 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * effect. 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The channel 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is closed 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If some other I/O error occurs 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract SocketChannel shutdownOutput() throws IOException; 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retrieves a socket associated with this channel. 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> The returned object will not declare any public methods that are not 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * declared in the {@link java.net.Socket} class. </p> 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return A socket associated with this channel 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract Socket socket(); 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Tells whether or not this channel's network socket is connected. 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if, and only if, this channel's network socket 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is {@link #isOpen open} and connected 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract boolean isConnected(); 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Tells whether or not a connection operation is in progress on this 31446805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * channel. 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if, and only if, a connection operation has been 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initiated on this channel but not yet completed by invoking the 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link #finishConnect finishConnect} method 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract boolean isConnectionPending(); 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Connects this channel's socket. 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If this channel is in non-blocking mode then an invocation of this 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method initiates a non-blocking connection operation. If the connection 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is established immediately, as can happen with a local connection, then 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this method returns <tt>true</tt>. Otherwise this method returns 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>false</tt> and the connection operation must later be completed by 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invoking the {@link #finishConnect finishConnect} method. 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If this channel is in blocking mode then an invocation of this 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method will block until the connection is established or an I/O error 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * occurs. 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method performs exactly the same security checks as the {@link 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.net.Socket} class. That is, if a security manager has been 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * installed then this method verifies that its {@link 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.lang.SecurityManager#checkConnect checkConnect} method permits 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connecting to the address and port number of the given remote endpoint. 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method may be invoked at any time. If a read or write 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operation upon this channel is invoked while an invocation of this 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is in progress then that operation will first block until this 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invocation is complete. If a connection attempt is initiated but fails, 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that is, if an invocation of this method throws a checked exception, 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * then the channel will be closed. </p> 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param remote 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The remote address to which this channel is to be connected 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if a connection was established, 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <tt>false</tt> if this channel is in non-blocking mode 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and the connection operation is in progress 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws AlreadyConnectedException 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is already connected 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ConnectionPendingException 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If a non-blocking connection operation is already in progress 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * on this channel 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is closed 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws AsynchronousCloseException 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If another thread closes this channel 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while the connect operation is in progress 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedByInterruptException 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If another thread interrupts the current thread 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while the connect operation is in progress, thereby 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * closing the channel and setting the current thread's 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interrupt status 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnresolvedAddressException 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the given remote address is not fully resolved 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws UnsupportedAddressTypeException 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the type of the given remote address is not supported 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws SecurityException 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If a security manager has been installed 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and it does not permit access to the given remote endpoint 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If some other I/O error occurs 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract boolean connect(SocketAddress remote) throws IOException; 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Finishes the process of connecting a socket channel. 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A non-blocking connection operation is initiated by placing a socket 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * channel in non-blocking mode and then invoking its {@link #connect 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connect} method. Once the connection is established, or the attempt has 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * failed, the socket channel will become connectable and this method may 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be invoked to complete the connection sequence. If the connection 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operation failed then invoking this method will cause an appropriate 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link java.io.IOException} to be thrown. 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> If this channel is already connected then this method will not block 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and will immediately return <tt>true</tt>. If this channel is in 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * non-blocking mode then this method will return <tt>false</tt> if the 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connection process is not yet complete. If this channel is in blocking 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * mode then this method will block until the connection either completes 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or fails, and will always either return <tt>true</tt> or throw a checked 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * exception describing the failure. 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method may be invoked at any time. If a read or write 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * operation upon this channel is invoked while an invocation of this 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method is in progress then that operation will first block until this 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invocation is complete. If a connection attempt fails, that is, if an 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * invocation of this method throws a checked exception, then the channel 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * will be closed. </p> 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return <tt>true</tt> if, and only if, this channel's socket is now 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connected 41951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NoConnectionPendingException 42151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not connected and a connection operation 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * has not been initiated 42351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException 42551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is closed 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws AsynchronousCloseException 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If another thread closes this channel 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while the connect operation is in progress 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedByInterruptException 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If another thread interrupts the current thread 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * while the connect operation is in progress, thereby 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * closing the channel and setting the current thread's 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * interrupt status 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If some other I/O error occurs 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract boolean finishConnect() throws IOException; 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the remote address to which this channel's socket is connected. 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Where the channel is bound and connected to an Internet Protocol 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * socket address then the return value from this method is of type {@link 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * java.net.InetSocketAddress}. 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return The remote address; {@code null} if the channel's socket is not 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * connected 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws ClosedChannelException 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If the channel is closed 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws IOException 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If an I/O error occurs 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.7 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract SocketAddress getRemoteAddress() throws IOException; 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // -- ByteChannel operations -- 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int read(ByteBuffer dst) throws IOException; 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract long read(ByteBuffer[] dsts, int offset, int length) 47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException; 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final long read(ByteBuffer[] dsts) throws IOException { 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return read(dsts, 0, dsts.length); 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract int write(ByteBuffer src) throws IOException; 48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public abstract long write(ByteBuffer[] srcs, int offset, int length) 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException; 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @throws NotYetConnectedException 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * If this channel is not yet connected 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final long write(ByteBuffer[] srcs) throws IOException { 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return write(srcs, 0, srcs.length); 50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 50546805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera /** 50646805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * {@inheritDoc} 50746805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * <p> 50846805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * If there is a security manager set, its {@code checkConnect} method is 50946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * called with the local address and {@code -1} as its arguments to see 51046805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * if the operation is allowed. If the operation is not allowed, 51146805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * a {@code SocketAddress} representing the 51246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * {@link java.net.InetAddress#getLoopbackAddress loopback} address and the 51346805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * local port of the channel's socket is returned. 51446805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * 51546805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @return The {@code SocketAddress} that the socket is bound to, or the 51646805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * {@code SocketAddress} representing the loopback address if 51746805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * denied by the security manager, or {@code null} if the 51846805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * channel's socket is not bound 51946805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * 52046805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @throws ClosedChannelException {@inheritDoc} 52146805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera * @throws IOException {@inheritDoc} 52246805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera */ 52346805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera @Override 52446805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera public abstract SocketAddress getLocalAddress() throws IOException; 52546805d66f32e857c885434b4fa8cb6b32dcc4bf7Shubham Ajmera 52651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 527