• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 1995, 2013, 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.FileDescriptor;
29 import java.io.IOException;
30 import java.nio.channels.ServerSocketChannel;
31 import java.security.AccessController;
32 import java.security.PrivilegedExceptionAction;
33 
34 /**
35  * This class implements server sockets. A server socket waits for
36  * requests to come in over the network. It performs some operation
37  * based on that request, and then possibly returns a result to the requester.
38  * <p>
39  * The actual work of the server socket is performed by an instance
40  * of the {@code SocketImpl} class. An application can
41  * change the socket factory that creates the socket
42  * implementation to configure itself to create sockets
43  * appropriate to the local firewall.
44  *
45  * @author  unascribed
46  * @see     java.net.SocketImpl
47  * @see     java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory)
48  * @see     java.nio.channels.ServerSocketChannel
49  * @since   JDK1.0
50  */
51 public
52 class ServerSocket implements java.io.Closeable {
53     /**
54      * Various states of this socket.
55      */
56     private boolean created = false;
57     private boolean bound = false;
58     private boolean closed = false;
59     private Object closeLock = new Object();
60 
61     /**
62      * The implementation of this Socket.
63      */
64     private SocketImpl impl;
65 
66     /**
67      * Are we using an older SocketImpl?
68      */
69     private boolean oldImpl = false;
70 
71     /**
72      * Package-private constructor to create a ServerSocket associated with
73      * the given SocketImpl.
74      */
ServerSocket(SocketImpl impl)75     ServerSocket(SocketImpl impl) {
76         this.impl = impl;
77         impl.setServerSocket(this);
78     }
79 
80     /**
81      * Creates an unbound server socket.
82      *
83      * @exception IOException IO error when opening the socket.
84      * @revised 1.4
85      */
ServerSocket()86     public ServerSocket() throws IOException {
87         setImpl();
88     }
89 
90     /**
91      * Creates a server socket, bound to the specified port. A port number
92      * of {@code 0} means that the port number is automatically
93      * allocated, typically from an ephemeral port range. This port
94      * number can then be retrieved by calling {@link #getLocalPort getLocalPort}.
95      * <p>
96      * The maximum queue length for incoming connection indications (a
97      * request to connect) is set to {@code 50}. If a connection
98      * indication arrives when the queue is full, the connection is refused.
99      * <p>
100      * If the application has specified a server socket factory, that
101      * factory's {@code createSocketImpl} method is called to create
102      * the actual socket implementation. Otherwise a "plain" socket is created.
103      * <p>
104      * If there is a security manager,
105      * its {@code checkListen} method is called
106      * with the {@code port} argument
107      * as its argument to ensure the operation is allowed.
108      * This could result in a SecurityException.
109      *
110      *
111      * @param      port  the port number, or {@code 0} to use a port
112      *                   number that is automatically allocated.
113      *
114      * @exception  IOException  if an I/O error occurs when opening the socket.
115      * @exception  SecurityException
116      * if a security manager exists and its {@code checkListen}
117      * method doesn't allow the operation.
118      * @exception  IllegalArgumentException if the port parameter is outside
119      *             the specified range of valid port values, which is between
120      *             0 and 65535, inclusive.
121      *
122      * @see        java.net.SocketImpl
123      * @see        java.net.SocketImplFactory#createSocketImpl()
124      * @see        java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory)
125      * @see        SecurityManager#checkListen
126      */
ServerSocket(int port)127     public ServerSocket(int port) throws IOException {
128         this(port, 50, null);
129     }
130 
131     /**
132      * Creates a server socket and binds it to the specified local port
133      * number, with the specified backlog.
134      * A port number of {@code 0} means that the port number is
135      * automatically allocated, typically from an ephemeral port range.
136      * This port number can then be retrieved by calling
137      * {@link #getLocalPort getLocalPort}.
138      * <p>
139      * The maximum queue length for incoming connection indications (a
140      * request to connect) is set to the {@code backlog} parameter. If
141      * a connection indication arrives when the queue is full, the
142      * connection is refused.
143      * <p>
144      * If the application has specified a server socket factory, that
145      * factory's {@code createSocketImpl} method is called to create
146      * the actual socket implementation. Otherwise a "plain" socket is created.
147      * <p>
148      * If there is a security manager,
149      * its {@code checkListen} method is called
150      * with the {@code port} argument
151      * as its argument to ensure the operation is allowed.
152      * This could result in a SecurityException.
153      *
154      * The {@code backlog} argument is the requested maximum number of
155      * pending connections on the socket. Its exact semantics are implementation
156      * specific. In particular, an implementation may impose a maximum length
157      * or may choose to ignore the parameter altogther. The value provided
158      * should be greater than {@code 0}. If it is less than or equal to
159      * {@code 0}, then an implementation specific default will be used.
160      * <P>
161      *
162      * @param      port     the port number, or {@code 0} to use a port
163      *                      number that is automatically allocated.
164      * @param      backlog  requested maximum length of the queue of incoming
165      *                      connections.
166      *
167      * @exception  IOException  if an I/O error occurs when opening the socket.
168      * @exception  SecurityException
169      * if a security manager exists and its {@code checkListen}
170      * method doesn't allow the operation.
171      * @exception  IllegalArgumentException if the port parameter is outside
172      *             the specified range of valid port values, which is between
173      *             0 and 65535, inclusive.
174      *
175      * @see        java.net.SocketImpl
176      * @see        java.net.SocketImplFactory#createSocketImpl()
177      * @see        java.net.ServerSocket#setSocketFactory(java.net.SocketImplFactory)
178      * @see        SecurityManager#checkListen
179      */
ServerSocket(int port, int backlog)180     public ServerSocket(int port, int backlog) throws IOException {
181         this(port, backlog, null);
182     }
183 
184     /**
185      * Create a server with the specified port, listen backlog, and
186      * local IP address to bind to.  The <i>bindAddr</i> argument
187      * can be used on a multi-homed host for a ServerSocket that
188      * will only accept connect requests to one of its addresses.
189      * If <i>bindAddr</i> is null, it will default accepting
190      * connections on any/all local addresses.
191      * The port must be between 0 and 65535, inclusive.
192      * A port number of {@code 0} means that the port number is
193      * automatically allocated, typically from an ephemeral port range.
194      * This port number can then be retrieved by calling
195      * {@link #getLocalPort getLocalPort}.
196      *
197      * <P>If there is a security manager, this method
198      * calls its {@code checkListen} method
199      * with the {@code port} argument
200      * as its argument to ensure the operation is allowed.
201      * This could result in a SecurityException.
202      *
203      * The {@code backlog} argument is the requested maximum number of
204      * pending connections on the socket. Its exact semantics are implementation
205      * specific. In particular, an implementation may impose a maximum length
206      * or may choose to ignore the parameter altogther. The value provided
207      * should be greater than {@code 0}. If it is less than or equal to
208      * {@code 0}, then an implementation specific default will be used.
209      * <P>
210      * @param port  the port number, or {@code 0} to use a port
211      *              number that is automatically allocated.
212      * @param backlog requested maximum length of the queue of incoming
213      *                connections.
214      * @param bindAddr the local InetAddress the server will bind to
215      *
216      * @throws  SecurityException if a security manager exists and
217      * its {@code checkListen} method doesn't allow the operation.
218      *
219      * @throws  IOException if an I/O error occurs when opening the socket.
220      * @exception  IllegalArgumentException if the port parameter is outside
221      *             the specified range of valid port values, which is between
222      *             0 and 65535, inclusive.
223      *
224      * @see SocketOptions
225      * @see SocketImpl
226      * @see SecurityManager#checkListen
227      * @since   JDK1.1
228      */
ServerSocket(int port, int backlog, InetAddress bindAddr)229     public ServerSocket(int port, int backlog, InetAddress bindAddr) throws IOException {
230         setImpl();
231         if (port < 0 || port > 0xFFFF)
232             throw new IllegalArgumentException(
233                        "Port value out of range: " + port);
234         if (backlog < 1)
235           backlog = 50;
236         try {
237             bind(new InetSocketAddress(bindAddr, port), backlog);
238         } catch(SecurityException e) {
239             close();
240             throw e;
241         } catch(IOException e) {
242             close();
243             throw e;
244         }
245     }
246 
247     /**
248      * Get the {@code SocketImpl} attached to this socket, creating
249      * it if necessary.
250      *
251      * @return  the {@code SocketImpl} attached to that ServerSocket.
252      * @throws SocketException if creation fails.
253      * @since 1.4
254      * @hide
255      */
getImpl()256     public SocketImpl getImpl() throws SocketException {
257         if (!created)
258             createImpl();
259         return impl;
260     }
261 
checkOldImpl()262     private void checkOldImpl() {
263         if (impl == null)
264             return;
265         // SocketImpl.connect() is a protected method, therefore we need to use
266         // getDeclaredMethod, therefore we need permission to access the member
267         try {
268             AccessController.doPrivileged(
269                 new PrivilegedExceptionAction<Void>() {
270                     public Void run() throws NoSuchMethodException {
271                         impl.getClass().getDeclaredMethod("connect",
272                                                           SocketAddress.class,
273                                                           int.class);
274                         return null;
275                     }
276                 });
277         } catch (java.security.PrivilegedActionException e) {
278             oldImpl = true;
279         }
280     }
281 
setImpl()282     private void setImpl() {
283         if (factory != null) {
284             impl = factory.createSocketImpl();
285             checkOldImpl();
286         } else {
287             // No need to do a checkOldImpl() here, we know it's an up to date
288             // SocketImpl!
289             impl = new SocksSocketImpl();
290         }
291         if (impl != null)
292             impl.setServerSocket(this);
293     }
294 
295     /**
296      * Creates the socket implementation.
297      *
298      * @throws IOException if creation fails
299      * @since 1.4
300      */
createImpl()301     void createImpl() throws SocketException {
302         if (impl == null)
303             setImpl();
304         try {
305             impl.create(true);
306             created = true;
307         } catch (IOException e) {
308             throw new SocketException(e.getMessage());
309         }
310     }
311 
312     /**
313      *
314      * Binds the {@code ServerSocket} to a specific address
315      * (IP address and port number).
316      * <p>
317      * If the address is {@code null}, then the system will pick up
318      * an ephemeral port and a valid local address to bind the socket.
319      * <p>
320      * @param   endpoint        The IP address and port number to bind to.
321      * @throws  IOException if the bind operation fails, or if the socket
322      *                     is already bound.
323      * @throws  SecurityException       if a {@code SecurityManager} is present and
324      * its {@code checkListen} method doesn't allow the operation.
325      * @throws  IllegalArgumentException if endpoint is a
326      *          SocketAddress subclass not supported by this socket
327      * @since 1.4
328      */
bind(SocketAddress endpoint)329     public void bind(SocketAddress endpoint) throws IOException {
330         bind(endpoint, 50);
331     }
332 
333     /**
334      *
335      * Binds the {@code ServerSocket} to a specific address
336      * (IP address and port number).
337      * <p>
338      * If the address is {@code null}, then the system will pick up
339      * an ephemeral port and a valid local address to bind the socket.
340      * <P>
341      * The {@code backlog} argument is the requested maximum number of
342      * pending connections on the socket. Its exact semantics are implementation
343      * specific. In particular, an implementation may impose a maximum length
344      * or may choose to ignore the parameter altogther. The value provided
345      * should be greater than {@code 0}. If it is less than or equal to
346      * {@code 0}, then an implementation specific default will be used.
347      * @param   endpoint        The IP address and port number to bind to.
348      * @param   backlog         requested maximum length of the queue of
349      *                          incoming connections.
350      * @throws  IOException if the bind operation fails, or if the socket
351      *                     is already bound.
352      * @throws  SecurityException       if a {@code SecurityManager} is present and
353      * its {@code checkListen} method doesn't allow the operation.
354      * @throws  IllegalArgumentException if endpoint is a
355      *          SocketAddress subclass not supported by this socket
356      * @since 1.4
357      */
bind(SocketAddress endpoint, int backlog)358     public void bind(SocketAddress endpoint, int backlog) throws IOException {
359         if (isClosed())
360             throw new SocketException("Socket is closed");
361         if (!oldImpl && isBound())
362             throw new SocketException("Already bound");
363         if (endpoint == null)
364             endpoint = new InetSocketAddress(0);
365         if (!(endpoint instanceof InetSocketAddress))
366             throw new IllegalArgumentException("Unsupported address type");
367         InetSocketAddress epoint = (InetSocketAddress) endpoint;
368         if (epoint.isUnresolved())
369             throw new SocketException("Unresolved address");
370         if (backlog < 1)
371           backlog = 50;
372         try {
373             SecurityManager security = System.getSecurityManager();
374             if (security != null)
375                 security.checkListen(epoint.getPort());
376             getImpl().bind(epoint.getAddress(), epoint.getPort());
377             getImpl().listen(backlog);
378             bound = true;
379         } catch(SecurityException e) {
380             bound = false;
381             throw e;
382         } catch(IOException e) {
383             bound = false;
384             throw e;
385         }
386     }
387 
388     /**
389      * Returns the local address of this server socket.
390      * <p>
391      * If the socket was bound prior to being {@link #close closed},
392      * then this method will continue to return the local address
393      * after the socket is closed.
394      * <p>
395      * If there is a security manager set, its {@code checkConnect} method is
396      * called with the local address and {@code -1} as its arguments to see
397      * if the operation is allowed. If the operation is not allowed,
398      * the {@link InetAddress#getLoopbackAddress loopback} address is returned.
399      *
400      * @return  the address to which this socket is bound,
401      *          or the loopback address if denied by the security manager,
402      *          or {@code null} if the socket is unbound.
403      *
404      * @see SecurityManager#checkConnect
405      */
getInetAddress()406     public InetAddress getInetAddress() {
407         if (!isBound())
408             return null;
409         try {
410             InetAddress in = getImpl().getInetAddress();
411             SecurityManager sm = System.getSecurityManager();
412             if (sm != null)
413                 sm.checkConnect(in.getHostAddress(), -1);
414             return in;
415         } catch (SecurityException e) {
416             return InetAddress.getLoopbackAddress();
417         } catch (SocketException e) {
418             // nothing
419             // If we're bound, the impl has been created
420             // so we shouldn't get here
421         }
422         return null;
423     }
424 
425     /**
426      * Returns the port number on which this socket is listening.
427      * <p>
428      * If the socket was bound prior to being {@link #close closed},
429      * then this method will continue to return the port number
430      * after the socket is closed.
431      *
432      * @return  the port number to which this socket is listening or
433      *          -1 if the socket is not bound yet.
434      */
getLocalPort()435     public int getLocalPort() {
436         if (!isBound())
437             return -1;
438         try {
439             return getImpl().getLocalPort();
440         } catch (SocketException e) {
441             // nothing
442             // If we're bound, the impl has been created
443             // so we shouldn't get here
444         }
445         return -1;
446     }
447 
448     /**
449      * Returns the address of the endpoint this socket is bound to, or
450      * {@code null} if it is not bound yet.
451      * <p>
452      * If the socket was bound prior to being {@link #close closed},
453      * then this method will continue to return the address of the endpoint
454      * after the socket is closed.
455      * <p>
456      * If there is a security manager set, its {@code checkConnect} method is
457      * called with the local address and {@code -1} as its arguments to see
458      * if the operation is allowed. If the operation is not allowed,
459      * a {@code SocketAddress} representing the
460      * {@link InetAddress#getLoopbackAddress loopback} address and the local
461      * port to which the socket is bound is returned.
462      *
463      * @return a {@code SocketAddress} representing the local endpoint of
464      *         this socket, or a {@code SocketAddress} representing the
465      *         loopback address if denied by the security manager,
466      *         or {@code null} if the socket is not bound yet.
467      *
468      * @see #getInetAddress()
469      * @see #getLocalPort()
470      * @see #bind(SocketAddress)
471      * @see SecurityManager#checkConnect
472      * @since 1.4
473      */
474 
getLocalSocketAddress()475     public SocketAddress getLocalSocketAddress() {
476         if (!isBound())
477             return null;
478         return new InetSocketAddress(getInetAddress(), getLocalPort());
479     }
480 
481     /**
482      * Listens for a connection to be made to this socket and accepts
483      * it. The method blocks until a connection is made.
484      *
485      * <p>A new Socket {@code s} is created and, if there
486      * is a security manager,
487      * the security manager's {@code checkAccept} method is called
488      * with {@code s.getInetAddress().getHostAddress()} and
489      * {@code s.getPort()}
490      * as its arguments to ensure the operation is allowed.
491      * This could result in a SecurityException.
492      *
493      * @exception  IOException  if an I/O error occurs when waiting for a
494      *               connection.
495      * @exception  SecurityException  if a security manager exists and its
496      *             {@code checkAccept} method doesn't allow the operation.
497      * @exception  SocketTimeoutException if a timeout was previously set with setSoTimeout and
498      *             the timeout has been reached.
499      * @exception  java.nio.channels.IllegalBlockingModeException
500      *             if this socket has an associated channel, the channel is in
501      *             non-blocking mode, and there is no connection ready to be
502      *             accepted
503      *
504      * @return the new Socket
505      * @see SecurityManager#checkAccept
506      * @revised 1.4
507      * @spec JSR-51
508      */
accept()509     public Socket accept() throws IOException {
510         if (isClosed())
511             throw new SocketException("Socket is closed");
512         if (!isBound())
513             throw new SocketException("Socket is not bound yet");
514         Socket s = new Socket((SocketImpl) null);
515         implAccept(s);
516         return s;
517     }
518 
519     /**
520      * Subclasses of ServerSocket use this method to override accept()
521      * to return their own subclass of socket.  So a FooServerSocket
522      * will typically hand this method an <i>empty</i> FooSocket.  On
523      * return from implAccept the FooSocket will be connected to a client.
524      *
525      * @param s the Socket
526      * @throws java.nio.channels.IllegalBlockingModeException
527      *         if this socket has an associated channel,
528      *         and the channel is in non-blocking mode
529      * @throws IOException if an I/O error occurs when waiting
530      * for a connection.
531      * @since   JDK1.1
532      * @revised 1.4
533      * @spec JSR-51
534      */
implAccept(Socket s)535     protected final void implAccept(Socket s) throws IOException {
536         SocketImpl si = null;
537         try {
538             if (s.impl == null)
539               s.setImpl();
540             else {
541                 s.impl.reset();
542             }
543             si = s.impl;
544             s.impl = null;
545             si.address = new InetAddress();
546             si.fd = new FileDescriptor();
547             getImpl().accept(si);
548 
549             SecurityManager security = System.getSecurityManager();
550             if (security != null) {
551                 security.checkAccept(si.getInetAddress().getHostAddress(),
552                                      si.getPort());
553             }
554         } catch (IOException e) {
555             if (si != null)
556                 si.reset();
557             s.impl = si;
558             throw e;
559         } catch (SecurityException e) {
560             if (si != null)
561                 si.reset();
562             s.impl = si;
563             throw e;
564         }
565         s.impl = si;
566         s.postAccept();
567     }
568 
569     /**
570      * Closes this socket.
571      *
572      * Any thread currently blocked in {@link #accept()} will throw
573      * a {@link SocketException}.
574      *
575      * <p> If this socket has an associated channel then the channel is closed
576      * as well.
577      *
578      * @exception  IOException  if an I/O error occurs when closing the socket.
579      * @revised 1.4
580      * @spec JSR-51
581      */
close()582     public void close() throws IOException {
583         synchronized(closeLock) {
584             if (isClosed())
585                 return;
586             if (created)
587                 impl.close();
588             closed = true;
589         }
590     }
591 
592     /**
593      * Returns the unique {@link java.nio.channels.ServerSocketChannel} object
594      * associated with this socket, if any.
595      *
596      * <p> A server socket will have a channel if, and only if, the channel
597      * itself was created via the {@link
598      * java.nio.channels.ServerSocketChannel#open ServerSocketChannel.open}
599      * method.
600      *
601      * @return  the server-socket channel associated with this socket,
602      *          or {@code null} if this socket was not created
603      *          for a channel
604      *
605      * @since 1.4
606      * @spec JSR-51
607      */
getChannel()608     public ServerSocketChannel getChannel() {
609         return null;
610     }
611 
612     /**
613      * Returns the binding state of the ServerSocket.
614      *
615      * @return true if the ServerSocket successfully bound to an address
616      * @since 1.4
617      */
isBound()618     public boolean isBound() {
619         // Before 1.3 ServerSockets were always bound during creation
620         return bound || oldImpl;
621     }
622 
623     /**
624      * Returns the closed state of the ServerSocket.
625      *
626      * @return true if the socket has been closed
627      * @since 1.4
628      */
isClosed()629     public boolean isClosed() {
630         synchronized(closeLock) {
631             return closed;
632         }
633     }
634 
635     /**
636      * Enable/disable {@link SocketOptions#SO_TIMEOUT SO_TIMEOUT} with the
637      * specified timeout, in milliseconds.  With this option set to a non-zero
638      * timeout, a call to accept() for this ServerSocket
639      * will block for only this amount of time.  If the timeout expires,
640      * a <B>java.net.SocketTimeoutException</B> is raised, though the
641      * ServerSocket is still valid.  The option <B>must</B> be enabled
642      * prior to entering the blocking operation to have effect.  The
643      * timeout must be {@code > 0}.
644      * A timeout of zero is interpreted as an infinite timeout.
645      * @param timeout the specified timeout, in milliseconds
646      * @exception SocketException if there is an error in
647      * the underlying protocol, such as a TCP error.
648      * @since   JDK1.1
649      * @see #getSoTimeout()
650      */
setSoTimeout(int timeout)651     public synchronized void setSoTimeout(int timeout) throws SocketException {
652         if (isClosed())
653             throw new SocketException("Socket is closed");
654         getImpl().setOption(SocketOptions.SO_TIMEOUT, new Integer(timeout));
655     }
656 
657     /**
658      * Retrieve setting for {@link SocketOptions#SO_TIMEOUT SO_TIMEOUT}.
659      * 0 returns implies that the option is disabled (i.e., timeout of infinity).
660      * @return the {@link SocketOptions#SO_TIMEOUT SO_TIMEOUT} value
661      * @exception IOException if an I/O error occurs
662      * @since   JDK1.1
663      * @see #setSoTimeout(int)
664      */
getSoTimeout()665     public synchronized int getSoTimeout() throws IOException {
666         if (isClosed())
667             throw new SocketException("Socket is closed");
668         Object o = getImpl().getOption(SocketOptions.SO_TIMEOUT);
669         /* extra type safety */
670         if (o instanceof Integer) {
671             return ((Integer) o).intValue();
672         } else {
673             return 0;
674         }
675     }
676 
677     /**
678      * Enable/disable the {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR}
679      * socket option.
680      * <p>
681      * When a TCP connection is closed the connection may remain
682      * in a timeout state for a period of time after the connection
683      * is closed (typically known as the {@code TIME_WAIT} state
684      * or {@code 2MSL} wait state).
685      * For applications using a well known socket address or port
686      * it may not be possible to bind a socket to the required
687      * {@code SocketAddress} if there is a connection in the
688      * timeout state involving the socket address or port.
689      * <p>
690      * Enabling {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} prior to
691      * binding the socket using {@link #bind(SocketAddress)} allows the socket
692      * to be bound even though a previous connection is in a timeout state.
693      * <p>
694      * When a {@code ServerSocket} is created the initial setting
695      * of {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is not defined.
696      * Applications can use {@link #getReuseAddress()} to determine the initial
697      * setting of {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR}.
698      * <p>
699      * The behaviour when {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is
700      * enabled or disabled after a socket is bound (See {@link #isBound()})
701      * is not defined.
702      *
703      * @param on  whether to enable or disable the socket option
704      * @exception SocketException if an error occurs enabling or
705      *            disabling the {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR}
706      *            socket option, or the socket is closed.
707      * @since 1.4
708      * @see #getReuseAddress()
709      * @see #bind(SocketAddress)
710      * @see #isBound()
711      * @see #isClosed()
712      */
setReuseAddress(boolean on)713     public void setReuseAddress(boolean on) throws SocketException {
714         if (isClosed())
715             throw new SocketException("Socket is closed");
716         getImpl().setOption(SocketOptions.SO_REUSEADDR, Boolean.valueOf(on));
717     }
718 
719     /**
720      * Tests if {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is enabled.
721      *
722      * @return a {@code boolean} indicating whether or not
723      *         {@link SocketOptions#SO_REUSEADDR SO_REUSEADDR} is enabled.
724      * @exception SocketException if there is an error
725      * in the underlying protocol, such as a TCP error.
726      * @since   1.4
727      * @see #setReuseAddress(boolean)
728      */
getReuseAddress()729     public boolean getReuseAddress() throws SocketException {
730         if (isClosed())
731             throw new SocketException("Socket is closed");
732         return ((Boolean) (getImpl().getOption(SocketOptions.SO_REUSEADDR))).booleanValue();
733     }
734 
735     /**
736      * Returns the implementation address and implementation port of
737      * this socket as a {@code String}.
738      * <p>
739      * If there is a security manager set, its {@code checkConnect} method is
740      * called with the local address and {@code -1} as its arguments to see
741      * if the operation is allowed. If the operation is not allowed,
742      * an {@code InetAddress} representing the
743      * {@link InetAddress#getLoopbackAddress loopback} address is returned as
744      * the implementation address.
745      *
746      * @return  a string representation of this socket.
747      */
toString()748     public String toString() {
749         if (!isBound())
750             return "ServerSocket[unbound]";
751         InetAddress in;
752         if (System.getSecurityManager() != null)
753             in = InetAddress.getLoopbackAddress();
754         else
755             in = impl.getInetAddress();
756         return "ServerSocket[addr=" + in +
757                 ",localport=" + impl.getLocalPort()  + "]";
758     }
759 
setBound()760     void setBound() {
761         bound = true;
762     }
763 
setCreated()764     void setCreated() {
765         created = true;
766     }
767 
768     /**
769      * The factory for all server sockets.
770      */
771     private static SocketImplFactory factory = null;
772 
773     /**
774      * Sets the server socket implementation factory for the
775      * application. The factory can be specified only once.
776      * <p>
777      * When an application creates a new server socket, the socket
778      * implementation factory's {@code createSocketImpl} method is
779      * called to create the actual socket implementation.
780      * <p>
781      * Passing {@code null} to the method is a no-op unless the factory
782      * was already set.
783      * <p>
784      * If there is a security manager, this method first calls
785      * the security manager's {@code checkSetFactory} method
786      * to ensure the operation is allowed.
787      * This could result in a SecurityException.
788      *
789      * @param      fac   the desired factory.
790      * @exception  IOException  if an I/O error occurs when setting the
791      *               socket factory.
792      * @exception  SocketException  if the factory has already been defined.
793      * @exception  SecurityException  if a security manager exists and its
794      *             {@code checkSetFactory} method doesn't allow the operation.
795      * @see        java.net.SocketImplFactory#createSocketImpl()
796      * @see        SecurityManager#checkSetFactory
797      */
setSocketFactory(SocketImplFactory fac)798     public static synchronized void setSocketFactory(SocketImplFactory fac) throws IOException {
799         if (factory != null) {
800             throw new SocketException("factory already defined");
801         }
802         SecurityManager security = System.getSecurityManager();
803         if (security != null) {
804             security.checkSetFactory();
805         }
806         factory = fac;
807     }
808 
809     /**
810      * Sets a default proposed value for the
811      * {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option for sockets
812      * accepted from this {@code ServerSocket}. The value actually set
813      * in the accepted socket must be determined by calling
814      * {@link Socket#getReceiveBufferSize()} after the socket
815      * is returned by {@link #accept()}.
816      * <p>
817      * The value of {@link SocketOptions#SO_RCVBUF SO_RCVBUF} is used both to
818      * set the size of the internal socket receive buffer, and to set the size
819      * of the TCP receive window that is advertized to the remote peer.
820      * <p>
821      * It is possible to change the value subsequently, by calling
822      * {@link Socket#setReceiveBufferSize(int)}. However, if the application
823      * wishes to allow a receive window larger than 64K bytes, as defined by RFC1323
824      * then the proposed value must be set in the ServerSocket <B>before</B>
825      * it is bound to a local address. This implies, that the ServerSocket must be
826      * created with the no-argument constructor, then setReceiveBufferSize() must
827      * be called and lastly the ServerSocket is bound to an address by calling bind().
828      * <p>
829      * Failure to do this will not cause an error, and the buffer size may be set to the
830      * requested value but the TCP receive window in sockets accepted from
831      * this ServerSocket will be no larger than 64K bytes.
832      *
833      * @exception SocketException if there is an error
834      * in the underlying protocol, such as a TCP error.
835      *
836      * @param size the size to which to set the receive buffer
837      * size. This value must be greater than 0.
838      *
839      * @exception IllegalArgumentException if the
840      * value is 0 or is negative.
841      *
842      * @since 1.4
843      * @see #getReceiveBufferSize
844      */
setReceiveBufferSize(int size)845      public synchronized void setReceiveBufferSize (int size) throws SocketException {
846         if (!(size > 0)) {
847             throw new IllegalArgumentException("negative receive size");
848         }
849         if (isClosed())
850             throw new SocketException("Socket is closed");
851         getImpl().setOption(SocketOptions.SO_RCVBUF, new Integer(size));
852     }
853 
854     /**
855      * Gets the value of the {@link SocketOptions#SO_RCVBUF SO_RCVBUF} option
856      * for this {@code ServerSocket}, that is the proposed buffer size that
857      * will be used for Sockets accepted from this {@code ServerSocket}.
858      *
859      * <p>Note, the value actually set in the accepted socket is determined by
860      * calling {@link Socket#getReceiveBufferSize()}.
861      * @return the value of the {@link SocketOptions#SO_RCVBUF SO_RCVBUF}
862      *         option for this {@code Socket}.
863      * @exception SocketException if there is an error
864      *            in the underlying protocol, such as a TCP error.
865      * @see #setReceiveBufferSize(int)
866      * @since 1.4
867      */
getReceiveBufferSize()868     public synchronized int getReceiveBufferSize()
869     throws SocketException{
870         if (isClosed())
871             throw new SocketException("Socket is closed");
872         int result = 0;
873         Object o = getImpl().getOption(SocketOptions.SO_RCVBUF);
874         if (o instanceof Integer) {
875             result = ((Integer)o).intValue();
876         }
877         return result;
878     }
879 
880     /**
881      * Sets performance preferences for this ServerSocket.
882      *
883      * <p> Sockets use the TCP/IP protocol by default.  Some implementations
884      * may offer alternative protocols which have different performance
885      * characteristics than TCP/IP.  This method allows the application to
886      * express its own preferences as to how these tradeoffs should be made
887      * when the implementation chooses from the available protocols.
888      *
889      * <p> Performance preferences are described by three integers
890      * whose values indicate the relative importance of short connection time,
891      * low latency, and high bandwidth.  The absolute values of the integers
892      * are irrelevant; in order to choose a protocol the values are simply
893      * compared, with larger values indicating stronger preferences.  If the
894      * application prefers short connection time over both low latency and high
895      * bandwidth, for example, then it could invoke this method with the values
896      * {@code (1, 0, 0)}.  If the application prefers high bandwidth above low
897      * latency, and low latency above short connection time, then it could
898      * invoke this method with the values {@code (0, 1, 2)}.
899      *
900      * <p> Invoking this method after this socket has been bound
901      * will have no effect. This implies that in order to use this capability
902      * requires the socket to be created with the no-argument constructor.
903      *
904      * @param  connectionTime
905      *         An {@code int} expressing the relative importance of a short
906      *         connection time
907      *
908      * @param  latency
909      *         An {@code int} expressing the relative importance of low
910      *         latency
911      *
912      * @param  bandwidth
913      *         An {@code int} expressing the relative importance of high
914      *         bandwidth
915      *
916      * @since 1.5
917      */
setPerformancePreferences(int connectionTime, int latency, int bandwidth)918     public void setPerformancePreferences(int connectionTime,
919                                           int latency,
920                                           int bandwidth)
921     {
922         /* Not implemented yet */
923     }
924 
925     /**
926      * Android-added: for testing and internal use.
927      *
928      * @hide internal use only
929      */
getFileDescriptor$()930     public FileDescriptor getFileDescriptor$() {
931         return impl.getFileDescriptor();
932     }
933 }
934