1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.nio.channels;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Socket;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.SocketAddress;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.spi.AbstractSelectableChannel;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.spi.SelectorProvider;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A {@code SocketChannel} is a selectable channel that provides a partial
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * abstraction of stream connecting socket. {@code socket()} returns the related
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link Socket} instance which can handle the socket.
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * A socket channel is open but not connected when created by {@code open()}.
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * After connecting it by calling {@code connect(SocketAddress)}, it will remain
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connected until it gets closed. If the connection is non-blocking then
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code connect(SocketAddress)} is used to initiate the connection, followed
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by a call of {@code finishConnect()} to perform the final steps of
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connecting. {@code isConnectionPending()} indicates if the connection is
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * blocked or not; {@code isConnected()} indicates if the socket is finally
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connected or not.
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The input and output sides of a channel can be shut down independently and
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * asynchronously without closing the channel. The {@code shutdownInput} method
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is used for the input side of a channel and subsequent read operations return
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * -1, which means end of stream. If another thread is blocked in a read
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * operation when the shutdown occurs, the read will end without effect and
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * return end of stream. The {@code shutdownOutput} method is used for the
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * output side of the channel; subsequent write operations throw a
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link ClosedChannelException}. If the output is shut down and another thread
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is blocked in a write operation, an {@link AsynchronousCloseException} will
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * be thrown to the pending thread.
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Socket channels are thread-safe, no more than one thread can read or write at
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * any given time. The {@code connect(SocketAddress)} and {@code
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * finishConnect()} methods are synchronized against each other; when they are
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * processing, calls to {@code read} and {@code write} will block.
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SocketChannel extends AbstractSelectableChannel implements
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteChannel, ScatteringByteChannel, GatheringByteChannel {
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code SocketChannel}.
62f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param selectorProvider
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            an instance of SelectorProvider.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected SocketChannel(SelectorProvider selectorProvider) {
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super(selectorProvider);
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an open and unconnected socket channel.
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This channel is created by calling {@code openSocketChannel()} of the
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default {@link SelectorProvider} instance.
75eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new channel which is open but unconnected.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static SocketChannel open() throws IOException {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return SelectorProvider.provider().openSocketChannel();
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a socket channel and connects it to a socket address.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method performs a call to {@code open()} followed by a call to
880ac77ac8e915bff1a863e371f9b363033f9cf759Elliott Hughes     * {@code connect(SocketAddress)}.
89eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket address to be connected to.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the new connected channel.
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread while this method
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is executing.
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is executing. The calling thread will have the
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             interrupt state set and the channel will be closed.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnresolvedAddressException
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the address is not resolved.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedAddressTypeException
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the address type is not supported.
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static SocketChannel open(SocketAddress address) throws IOException {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SocketChannel socketChannel = open();
109b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes        if (socketChannel != null) {
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            socketChannel.connect(address);
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return socketChannel;
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the valid operations of this channel. Socket channels support
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connect, read and write operation, so this method returns
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE}.
119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the operations supported by this channel.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.nio.channels.SelectableChannel#validOps()
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
123eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson    @Override
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int validOps() {
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (SelectionKey.OP_CONNECT | SelectionKey.OP_READ | SelectionKey.OP_WRITE);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the socket assigned to this channel, which does not declare any public
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * methods that are not declared in {@code Socket}.
131f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the socket assigned to this channel.
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract Socket socket();
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this channel's socket is connected.
138f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this channel's socket is connected, {@code false}
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean isConnected();
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether this channel's socket is still trying to connect.
146f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the connection is initiated but not finished;
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code false} otherwise.
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean isConnectionPending();
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this channel's socket with a remote address.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this channel is blocking, this method will suspend until connecting is
1560ac77ac8e915bff1a863e371f9b363033f9cf759Elliott Hughes     * finished or an I/O exception occurs. If the channel is non-blocking,
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * this method will return {@code true} if the connection is finished at
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * once or return {@code false} when the connection must be finished later
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by calling {@code finishConnect()}.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method can be called at any moment and can block other read and
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * write operations while connecting. It executes the same security checks
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the connect method of the {@code Socket} class.
164eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the address to connect with.
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the connection is finished, {@code false}
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AlreadyConnectedException
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the channel is already connected.
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ConnectionPendingException
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             a non-blocking connecting operation is already executing on
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             this channel.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread while this method
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is executing.
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The calling thread will have the
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             interrupt state set and this channel will be closed.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnresolvedAddressException
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the address is not resolved.
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnsupportedAddressTypeException
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the address type is not supported.
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean connect(SocketAddress address) throws IOException;
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Completes the connection process initiated by a call of {@code
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connect(SocketAddress)}.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method returns {@code true} if the connection is finished already
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and returns {@code false} if the channel is non-blocking and the
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection is not finished yet.
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this channel is in blocking mode, this method will suspend and return
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code true} when the connection is finished. It closes this channel and
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throws an exception if the connection fails.
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method can be called at any moment and it can block other {@code
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * read} and {@code write} operations while connecting.
206eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the connection is successfully finished, {@code
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         false} otherwise.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoConnectionPendingException
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the channel is not connected and the connection process
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             has not been initiated.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread while this method
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is executing.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The calling thread has the
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             interrupt state set, and this channel is closed.
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an I/O error occurs.
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract boolean finishConnect() throws IOException;
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads bytes from this socket channel into the given buffer.
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The maximum number of bytes that will be read is the remaining number of
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bytes in the buffer when the method is invoked. The bytes will be copied
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * into the buffer starting at the buffer's current position.
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The call may block if other threads are also attempting to read from this
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * channel.
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Upon completion, the buffer's position is set to the end of the bytes
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that have been read. The buffer's limit is not changed.
238eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param target
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte buffer to receive the bytes.
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually read.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread closes the channel during the read.
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NotYetConnectedException
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is not yet connected.
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The interrupt state of the calling
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thread is set and the channel is closed.
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another I/O error occurs.
254eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * @see java.nio.channels.ReadableByteChannel#read(java.nio.ByteBuffer)
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int read(ByteBuffer target) throws IOException;
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
259eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * Reads bytes from this socket channel into a subset of the given buffers.
260eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * This method attempts to read all {@code remaining()} bytes from {@code
261eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * length} byte buffers, in order, starting at {@code targets[offset]}. The
262eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * number of bytes actually read is returned.
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a read operation is in progress, subsequent threads will block until
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the read is completed and will then contend for the ability to read.
266eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param targets
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array of byte buffers into which the bytes will be copied.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first buffer to store bytes in.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of buffers to store bytes in.
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually read.
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread during this read
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation.
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The interrupt state of the calling
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thread is set and the channel is closed.
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code length < 0}, or if {@code
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             offset + length} is greater than the size of {@code targets}.
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another I/O error occurs.
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NotYetConnectedException
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is not yet connected.
290eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * @see java.nio.channels.ScatteringByteChannel#read(java.nio.ByteBuffer[],
291eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *      int, int)
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2930ac77ac8e915bff1a863e371f9b363033f9cf759Elliott Hughes    public abstract long read(ByteBuffer[] targets, int offset, int length) throws IOException;
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reads bytes from this socket channel and stores them in the specified
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * array of buffers. This method attempts to read as many bytes as can be
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * stored in the buffer array from this channel and returns the number of
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * bytes actually read.
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a read operation is in progress, subsequent threads will block until
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the read is completed and will then contend for the ability to read.
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Calling this method is equivalent to calling {@code read(targets, 0,
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * targets.length);}
306eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param targets
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array of byte buffers into which the bytes will be copied.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually read.
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread during this read
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation.
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The interrupt state of the calling
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thread is set and the channel is closed.
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another I/O error occurs.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NotYetConnectedException
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is not yet connected.
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3240ac77ac8e915bff1a863e371f9b363033f9cf759Elliott Hughes    public synchronized final long read(ByteBuffer[] targets) throws IOException {
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return read(targets, 0, targets.length);
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes bytes from the given byte buffer to this socket channel. The
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * maximum number of bytes that are written is the remaining number of bytes
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * in the buffer when this method is invoked. The bytes are taken from the
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * buffer starting at the buffer's position.
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The call may block if other threads are also attempting to write to the
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * same channel.
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Upon completion, the buffer's position is updated to the end of the bytes
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * that have been written. The buffer's limit is not changed.
339eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param source
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte buffer containing the bytes to be written.
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually written.
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread closes the channel during the write.
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The interrupt state of the calling
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thread is set and the channel is closed.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the channel was already closed.
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another I/O error occurs.
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NotYetConnectedException
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is not connected yet.
355eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * @see java.nio.channels.WritableByteChannel#write(java.nio.ByteBuffer)
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract int write(ByteBuffer source) throws IOException;
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
360eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * Attempts to write a subset of the given bytes from the buffers to this
361eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * socket channel. This method attempts to write all {@code remaining()}
362eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * bytes from {@code length} byte buffers, in order, starting at {@code
363eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * sources[offset]}. The number of bytes actually written is returned.
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If a write operation is in progress, subsequent threads will block until
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the write is completed and then contend for the ability to write.
367eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sources
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the array of byte buffers that is the source for bytes written
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            to this channel.
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param offset
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the index of the first buffer in {@code buffers }to get bytes
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            from.
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param length
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of buffers to get bytes from.
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually written to this channel.
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread during this write
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation.
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The interrupt state of the calling
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thread is set and the channel is closed.
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IndexOutOfBoundsException
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code offset < 0} or {@code length < 0}, or if {@code
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             offset + length} is greater than the size of {@code sources}.
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another I/O error occurs.
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NotYetConnectedException
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is not yet connected.
393eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * @see java.nio.channels.GatheringByteChannel#write(java.nio.ByteBuffer[],
394eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *      int, int)
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3960ac77ac8e915bff1a863e371f9b363033f9cf759Elliott Hughes    public abstract long write(ByteBuffer[] sources, int offset, int length) throws IOException;
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes bytes from all the given byte buffers to this socket channel.
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Calling this method is equivalent to calling {@code write(sources, 0,
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sources.length);}
403eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     *
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param sources
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffers containing bytes to write.
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes actually written.
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws AsynchronousCloseException
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed by another thread during this write
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation.
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedByInterruptException
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another thread interrupts the calling thread while this
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             operation is in progress. The interrupt state of the calling
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             thread is set and the channel is closed.
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws ClosedChannelException
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is closed.
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if another I/O error occurs.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NotYetConnectedException
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this channel is not yet connected.
420eaa2ff09069424b0f7a95c7cd831cef1b744fe67Jesse Wilson     * @see java.nio.channels.GatheringByteChannel#write(java.nio.ByteBuffer[])
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
4220ac77ac8e915bff1a863e371f9b363033f9cf759Elliott Hughes    public synchronized final long write(ByteBuffer[] sources) throws IOException {
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return write(sources, 0, sources.length);
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
426