1 /* 2 * Copyright (c) 1995, 2006, Oracle and/or its affiliates. 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. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package java.net; 27 28 import java.io.IOException; 29 import java.io.InputStream; 30 import java.io.OutputStream; 31 import 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 */ 44 public 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 }