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.net;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileDescriptor;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is the base of all streaming socket implementation classes.
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Streaming sockets are wrapped by two classes, {@code ServerSocket} and
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Socket} at the server and client end of a connection. At the server,
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * there are two types of sockets engaged in communication, the {@code
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ServerSocket} on a well known port (referred to as listener) used to
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * establish a connection and the resulting {@code Socket} (referred to as
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * host).
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SocketImpl implements SocketOptions {
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The remote address this socket is connected to.
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected InetAddress address;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The remote port this socket is connected to.
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int port;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The file descriptor of this socket.
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected FileDescriptor fd;
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The local port this socket is connected to.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int localport;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Waits for an incoming request and blocks until the connection is opened
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on the given socket.
59f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param newSocket
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket to accept connections on.
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accepting a new connection.
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void accept(SocketImpl newSocket) throws IOException;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the available number of bytes which are readable from this socket
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * without blocking.
70f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of bytes that may be read without blocking.
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the number of bytes.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract int available() throws IOException;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Binds this socket to the specified local host address and port number.
79f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the local machine address to bind this socket to.
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port on the local machine to bind this socket to.
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while binding this socket.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
878de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes    protected abstract void bind(InetAddress address, int port) throws IOException;
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this socket. This makes later access invalid.
91f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this socket.
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void close() throws IOException;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the specified remote host and port number.
99f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote host this socket has to be connected to.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote port on which this socket has to be connected.
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting to the remote host.
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void connect(String host, int port) throws IOException;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the specified remote host address and port
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number.
112f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote host address this socket has to be connected to.
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote port on which this socket has to be connected.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting to the remote host.
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void connect(InetAddress address, int port)
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException;
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new unconnected socket. The argument {@code isStreaming}
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defines whether the new socket is a streaming or a datagram socket.
126f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param isStreaming
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            defines whether the type of the new socket is streaming or
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            datagram.
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the socket.
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void create(boolean isStreaming) throws IOException;
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the file descriptor of this socket.
137f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the file descriptor of this socket.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected FileDescriptor getFileDescriptor() {
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return fd;
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
145a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes     * @hide used by java.nio
146a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes     */
147a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes    public FileDescriptor getFD$() {
148a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes        return fd;
149a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes    }
150a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes
151a3b57e9cb41fb00ac607cd330fa73270b564b66cElliott Hughes    /**
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the remote address this socket is connected to.
153f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the remote address of this socket.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected InetAddress getInetAddress() {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return address;
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the input stream of this socket.
162f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the input stream of this socket.
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accessing the input stream.
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract InputStream getInputStream() throws IOException;
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local port number of this socket. The field is initialized to
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code -1} and upon demand will go to the IP stack to get the bound
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value. See the class comment for the context of the local port.
173f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local port number this socket is bound to.
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int getLocalPort() {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return localport;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the output stream of this socket.
182f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the output stream of this socket.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accessing the output stream.
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract OutputStream getOutputStream() throws IOException;
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the remote port number of this socket. This value is not meaningful
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * when this instance is wrapped by a {@code ServerSocket}.
192f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the remote port this socket is connected to.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int getPort() {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return port;
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Listens for connection requests on this streaming socket. Incoming
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection requests are queued up to the limit specified by {@code
202e1502d64e937001636fca3d62b2552ef2a34d05fElliott Hughes     * backlog}. Additional requests are rejected. This method
203e1502d64e937001636fca3d62b2552ef2a34d05fElliott Hughes     * may only be invoked on stream sockets.
204f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param backlog
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the maximum number of outstanding connection requests.
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while listening.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void listen(int backlog) throws IOException;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a string containing a concise, human-readable description of the
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket.
215f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the textual representation of this socket.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
2201c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes        return "Socket[address=" + getInetAddress() +
2211c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes                ",port=" + port + ",localPort=" + getLocalPort() + "]";
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the input channel of this socket.
2268de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes     *
2278de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes     * <p>This default implementation always throws an {@link IOException} to
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicate that the subclass should have overridden this method.
229f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             always because this method should be overridden.
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void shutdownInput() throws IOException {
234b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        throw new IOException("Method has not been implemented");
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes the output channel of this socket.
2398de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes     *
2408de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes     * <p>This default implementation always throws an {@link IOException} to
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * indicate that the subclass should have overridden this method.
242f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             always because this method should be overridden.
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void shutdownOutput() throws IOException {
247b1396870f92135aa140bd2b86221768dea5bc11dElliott Hughes        throw new IOException("Method has not been implemented");
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Connects this socket to the remote host address and port number specified
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by the {@code SocketAddress} object with the given timeout. This method
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will block indefinitely if the timeout is set to zero.
254f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param remoteAddr
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the remote host address and port number to connect to.
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the timeout value in milliseconds.
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while connecting.
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2628de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes    protected abstract void connect(SocketAddress remoteAddr, int timeout) throws IOException;
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether the socket supports urgent data or not. Subclasses should
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * override this method.
267f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code false} because subclasses must override this method.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected boolean supportsUrgentData() {
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return false;
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sends the single byte of urgent data on the socket.
276f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the byte of urgent data.
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs sending urgent data.
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected abstract void sendUrgentData(int value) throws IOException;
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets performance preference for connection time, latency and bandwidth.
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Does nothing by default.
287f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param connectionTime
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the importance of connect time.
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param latency
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the importance of latency.
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bandwidth
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the importance of bandwidth.
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2958de7cf6bff36093dda9e25a1ab3718720cb54906Elliott Hughes    protected void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
297933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
298933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    /**
299933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     * Initialize the bind() state.
300933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     * @hide used in java.nio.
301933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     */
302933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    public void onBind(InetAddress localAddress, int localPort) {
303933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // Do not add any code to these methods. They are concrete only to preserve API
304933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // compatibility.
305933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    }
306933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
307933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    /**
308933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     * Initialize the connect() state.
309933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     * @hide used in java.nio.
310933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     */
311933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    public void onConnect(InetAddress remoteAddress, int remotePort) {
312933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // Do not add any code to these methods. They are concrete only to preserve API
313933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // compatibility.
314933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    }
315933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller
316933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    /**
317933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     * Initialize the close() state.
318933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     * @hide used in java.nio.
319933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller     */
320933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    public void onClose() {
321933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // Do not add any code to these methods. They are concrete only to preserve API
322933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller        // compatibility.
323933fbbf606268eec9fc430632b8bca7002a833b3Neil Fuller    }
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
325