blob: 7f99e075570404d5779a7dab007759c41c7a509a [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1995-2006 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26package java.net;
27
28import java.io.IOException;
29import java.io.InputStream;
30import java.io.OutputStream;
31import java.io.FileDescriptor;
32
33/**
34 * The abstract class <code>SocketImpl</code> is a common superclass
35 * of all classes that actually implement sockets. It is used to
36 * create both client and server sockets.
37 * <p>
38 * A "plain" socket implements these methods exactly as
39 * described, without attempting to go through a firewall or proxy.
40 *
41 * @author unascribed
42 * @since JDK1.0
43 */
44public abstract class SocketImpl implements SocketOptions {
45 /**
46 * The actual Socket object.
47 */
48 Socket socket = null;
49 ServerSocket serverSocket = null;
50
51 /**
52 * The file descriptor object for this socket.
53 */
54 protected FileDescriptor fd;
55
56 /**
57 * The IP address of the remote end of this socket.
58 */
59 protected InetAddress address;
60
61 /**
62 * The port number on the remote host to which this socket is connected.
63 */
64 protected int port;
65
66 /**
67 * The local port number to which this socket is connected.
68 */
69 protected int localport;
70
71 /**
72 * Creates either a stream or a datagram socket.
73 *
74 * @param stream if <code>true</code>, create a stream socket;
75 * otherwise, create a datagram socket.
76 * @exception IOException if an I/O error occurs while creating the
77 * socket.
78 */
79 protected abstract void create(boolean stream) throws IOException;
80
81 /**
82 * Connects this socket to the specified port on the named host.
83 *
84 * @param host the name of the remote host.
85 * @param port the port number.
86 * @exception IOException if an I/O error occurs when connecting to the
87 * remote host.
88 */
89 protected abstract void connect(String host, int port) throws IOException;
90
91 /**
92 * Connects this socket to the specified port number on the specified host.
93 *
94 * @param address the IP address of the remote host.
95 * @param port the port number.
96 * @exception IOException if an I/O error occurs when attempting a
97 * connection.
98 */
99 protected abstract void connect(InetAddress address, int port) throws IOException;
100
101 /**
102 * Connects this socket to the specified port number on the specified host.
103 * A timeout of zero is interpreted as an infinite timeout. The connection
104 * will then block until established or an error occurs.
105 *
106 * @param address the Socket address of the remote host.
107 * @param timeout the timeout value, in milliseconds, or zero for no timeout.
108 * @exception IOException if an I/O error occurs when attempting a
109 * connection.
110 * @since 1.4
111 */
112 protected abstract void connect(SocketAddress address, int timeout) throws IOException;
113
114 /**
115 * Binds this socket to the specified local IP address and port number.
116 *
117 * @param host an IP address that belongs to a local interface.
118 * @param port the port number.
119 * @exception IOException if an I/O error occurs when binding this socket.
120 */
121 protected abstract void bind(InetAddress host, int port) throws IOException;
122
123 /**
124 * Sets the maximum queue length for incoming connection indications
125 * (a request to connect) to the <code>count</code> argument. If a
126 * connection indication arrives when the queue is full, the
127 * connection is refused.
128 *
129 * @param backlog the maximum length of the queue.
130 * @exception IOException if an I/O error occurs when creating the queue.
131 */
132 protected abstract void listen(int backlog) throws IOException;
133
134 /**
135 * Accepts a connection.
136 *
137 * @param s the accepted connection.
138 * @exception IOException if an I/O error occurs when accepting the
139 * connection.
140 */
141 protected abstract void accept(SocketImpl s) throws IOException;
142
143 /**
144 * Returns an input stream for this socket.
145 *
146 * @return a stream for reading from this socket.
147 * @exception IOException if an I/O error occurs when creating the
148 * input stream.
149 */
150 protected abstract InputStream getInputStream() throws IOException;
151
152 /**
153 * Returns an output stream for this socket.
154 *
155 * @return an output stream for writing to this socket.
156 * @exception IOException if an I/O error occurs when creating the
157 * output stream.
158 */
159 protected abstract OutputStream getOutputStream() throws IOException;
160
161 /**
162 * Returns the number of bytes that can be read from this socket
163 * without blocking.
164 *
165 * @return the number of bytes that can be read from this socket
166 * without blocking.
167 * @exception IOException if an I/O error occurs when determining the
168 * number of bytes available.
169 */
170 protected abstract int available() throws IOException;
171
172 /**
173 * Closes this socket.
174 *
175 * @exception IOException if an I/O error occurs when closing this socket.
176 */
177 protected abstract void close() throws IOException;
178
179 /**
180 * Places the input stream for this socket at "end of stream".
181 * Any data sent to this socket is acknowledged and then
182 * silently discarded.
183 *
184 * If you read from a socket input stream after invoking
185 * shutdownInput() on the socket, the stream will return EOF.
186 *
187 * @exception IOException if an I/O error occurs when shutting down this
188 * socket.
189 * @see java.net.Socket#shutdownOutput()
190 * @see java.net.Socket#close()
191 * @see java.net.Socket#setSoLinger(boolean, int)
192 * @since 1.3
193 */
194 protected void shutdownInput() throws IOException {
195 throw new IOException("Method not implemented!");
196 }
197
198 /**
199 * Disables the output stream for this socket.
200 * For a TCP socket, any previously written data will be sent
201 * followed by TCP's normal connection termination sequence.
202 *
203 * If you write to a socket output stream after invoking
204 * shutdownOutput() on the socket, the stream will throw
205 * an IOException.
206 *
207 * @exception IOException if an I/O error occurs when shutting down this
208 * socket.
209 * @see java.net.Socket#shutdownInput()
210 * @see java.net.Socket#close()
211 * @see java.net.Socket#setSoLinger(boolean, int)
212 * @since 1.3
213 */
214 protected void shutdownOutput() throws IOException {
215 throw new IOException("Method not implemented!");
216 }
217
218 /**
219 * Returns the value of this socket's <code>fd</code> field.
220 *
221 * @return the value of this socket's <code>fd</code> field.
222 * @see java.net.SocketImpl#fd
223 */
224 protected FileDescriptor getFileDescriptor() {
225 return fd;
226 }
227
228 /**
229 * Returns the value of this socket's <code>address</code> field.
230 *
231 * @return the value of this socket's <code>address</code> field.
232 * @see java.net.SocketImpl#address
233 */
234 protected InetAddress getInetAddress() {
235 return address;
236 }
237
238 /**
239 * Returns the value of this socket's <code>port</code> field.
240 *
241 * @return the value of this socket's <code>port</code> field.
242 * @see java.net.SocketImpl#port
243 */
244 protected int getPort() {
245 return port;
246 }
247
248 /**
249 * Returns whether or not this SocketImpl supports sending
250 * urgent data. By default, false is returned
251 * unless the method is overridden in a sub-class
252 *
253 * @return true if urgent data supported
254 * @see java.net.SocketImpl#address
255 * @since 1.4
256 */
257 protected boolean supportsUrgentData () {
258 return false; // must be overridden in sub-class
259 }
260
261 /**
262 * Send one byte of urgent data on the socket.
263 * The byte to be sent is the low eight bits of the parameter
264 * @param data The byte of data to send
265 * @exception IOException if there is an error
266 * sending the data.
267 * @since 1.4
268 */
269 protected abstract void sendUrgentData (int data) throws IOException;
270
271 /**
272 * Returns the value of this socket's <code>localport</code> field.
273 *
274 * @return the value of this socket's <code>localport</code> field.
275 * @see java.net.SocketImpl#localport
276 */
277 protected int getLocalPort() {
278 return localport;
279 }
280
281 void setSocket(Socket soc) {
282 this.socket = soc;
283 }
284
285 Socket getSocket() {
286 return socket;
287 }
288
289 void setServerSocket(ServerSocket soc) {
290 this.serverSocket = soc;
291 }
292
293 ServerSocket getServerSocket() {
294 return serverSocket;
295 }
296
297 /**
298 * Returns the address and port of this socket as a <code>String</code>.
299 *
300 * @return a string representation of this socket.
301 */
302 public String toString() {
303 return "Socket[addr=" + getInetAddress() +
304 ",port=" + getPort() + ",localport=" + getLocalPort() + "]";
305 }
306
307 void reset() throws IOException {
308 address = null;
309 port = 0;
310 localport = 0;
311 }
312
313 /**
314 * Sets performance preferences for this socket.
315 *
316 * <p> Sockets use the TCP/IP protocol by default. Some implementations
317 * may offer alternative protocols which have different performance
318 * characteristics than TCP/IP. This method allows the application to
319 * express its own preferences as to how these tradeoffs should be made
320 * when the implementation chooses from the available protocols.
321 *
322 * <p> Performance preferences are described by three integers
323 * whose values indicate the relative importance of short connection time,
324 * low latency, and high bandwidth. The absolute values of the integers
325 * are irrelevant; in order to choose a protocol the values are simply
326 * compared, with larger values indicating stronger preferences. Negative
327 * values represent a lower priority than positive values. If the
328 * application prefers short connection time over both low latency and high
329 * bandwidth, for example, then it could invoke this method with the values
330 * <tt>(1, 0, 0)</tt>. If the application prefers high bandwidth above low
331 * latency, and low latency above short connection time, then it could
332 * invoke this method with the values <tt>(0, 1, 2)</tt>.
333 *
334 * By default, this method does nothing, unless it is overridden in a
335 * a sub-class.
336 *
337 * @param connectionTime
338 * An <tt>int</tt> expressing the relative importance of a short
339 * connection time
340 *
341 * @param latency
342 * An <tt>int</tt> expressing the relative importance of low
343 * latency
344 *
345 * @param bandwidth
346 * An <tt>int</tt> expressing the relative importance of high
347 * bandwidth
348 *
349 * @since 1.5
350 */
351 protected void setPerformancePreferences(int connectionTime,
352 int latency,
353 int bandwidth)
354 {
355 /* Not implemented yet */
356 }
357}