ServerSocket.java revision a389b4a499f40379b0b204d7ba1c2057663d95c0
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.IOException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.channels.ServerSocketChannel;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilsonimport org.apache.harmony.luni.net.PlainServerSocketImpl;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a server-side socket that waits for incoming client
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connections. A {@code ServerSocket} handles the requests and sends back an
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * appropriate reply. The actual tasks that a server socket must accomplish are
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implemented by an internal {@code SocketImpl} instance.
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class ServerSocket {
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    SocketImpl impl;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static SocketImplFactory factory;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private volatile boolean isCreated;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isBound;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isClosed;
44f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static {
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Platform.getNetworkSystem().oneTimeInitialization(true);
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code ServerSocket} instance which is not bound to any
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * port. The default number of pending connections may be backlogged.
52f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the server socket.
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ServerSocket() throws IOException {
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl = factory != null ? factory.createSocketImpl()
58f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                : new PlainServerSocketImpl();
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Unspecified constructor.
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Warning: this function is technically part of API#1.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Hiding it for API#2 broke source compatibility.
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Removing it entirely would theoretically break binary compatibility,
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *     and would be better done with some visibility over the extent
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *     of the compatibility breakage (expected to be non-existent).
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @hide
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected ServerSocket(SocketImpl impl) {
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.impl = impl;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code ServerSocket} instance bound to the nominated
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * port on the localhost. The default number of pending connections may be
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * backlogged. If {@code aport} is 0 a free port is assigned to the socket.
80f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aport
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port number to listen for connection requests on.
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the server socket.
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ServerSocket(int aport) throws IOException {
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(aport, defaultBacklog(), InetAddress.ANY);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code ServerSocket} instance bound to the nominated
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * port on the localhost. The number of pending connections that may be
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * backlogged is specified by {@code backlog}. If {@code aport} is 0 a free
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * port is assigned to the socket.
95f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aport
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port number to listen for connection requests on.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param backlog
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of pending connection requests, before requests
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be rejected.
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the server socket.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ServerSocket(int aport, int backlog) throws IOException {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(aport, backlog, InetAddress.ANY);
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code ServerSocket} instance bound to the nominated
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * local host address and port. The number of pending connections that may
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * be backlogged is specified by {@code backlog}. If {@code aport} is 0 a
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * free port is assigned to the socket.
113f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aport
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the port number to listen for connection requests on.
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddr
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the local machine address to bind on.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param backlog
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of pending connection requests, before requests
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be rejected.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while creating the server socket.
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ServerSocket(int aport, int backlog, InetAddress localAddr)
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        super();
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkListen(aport);
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl = factory != null ? factory.createSocketImpl()
129f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                : new PlainServerSocketImpl();
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetAddress addr = localAddr == null ? InetAddress.ANY : localAddr;
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            impl.create(true);
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isCreated = true;
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.bind(addr, aport);
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isBound = true;
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.listen(backlog > 0 ? backlog : defaultBacklog());
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                close();
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Waits for an incoming request and blocks until the connection is opened.
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method returns a socket object representing the just opened
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * connection.
150f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the connection representing socket.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while accepting a new connection.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Socket accept() throws IOException {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(false);
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K031f")); //$NON-NLS-1$
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Socket aSocket = new Socket();
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            synchronized (this) {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                implAccept(aSocket);
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SecurityManager security = System.getSecurityManager();
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (security != null) {
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                security.checkAccept(aSocket.getInetAddress().getHostAddress(),
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        aSocket.getPort());
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (SecurityException e) {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            aSocket.close();
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw e;
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            aSocket.close();
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw e;
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return aSocket;
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the server may listen for connection requests on {@code
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * aport}. Throws an exception if the port is outside the valid range
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code 0 <= aport <= 65535 }or does not satisfy the security policy.
185f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aPort
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the candidate port to listen on.
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    void checkListen(int aPort) {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (aPort < 0 || aPort > 65535) {
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0325", aPort)); //$NON-NLS-1$
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null) {
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            security.checkListen(aPort);
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Closes this server socket and its implementation. Any attempt to connect
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to this socket thereafter will fail.
202f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while closing this socket.
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void close() throws IOException {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isClosed = true;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.close();
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Answer the default number of pending connections on a server socket. If
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the backlog value maximum is reached, any subsequent incoming request is
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * rejected.
215f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return int the default number of pending connection requests
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static int defaultBacklog() {
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return 50;
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local IP address of this server socket or {@code null} if the
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket is unbound. This is useful for multihomed hosts.
225f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local address of this server socket.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InetAddress getInetAddress() {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getInetAddress();
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local port of this server socket or {@code -1} if the socket is
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unbound.
238f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local port this server is listening on.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getLocalPort() {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return -1;
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return impl.getLocalPort();
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the timeout period of this server socket. This is the time the
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * server will wait listening for accepted connections before exiting.
251f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the listening timeout value of this server socket.
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the option cannot be retrieved.
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized int getSoTimeout() throws IOException {
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isCreated) {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            synchronized (this) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!isCreated) {
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    try {
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        impl.create(true);
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } catch (SocketException e) {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        throw e;
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } catch (IOException e) {
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        throw new SocketException(e.toString());
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    isCreated = true;
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Integer) impl.getOption(SocketOptions.SO_TIMEOUT)).intValue();
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Invokes the server socket implementation to accept a connection on the
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given socket {@code aSocket}.
277f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aSocket
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the concrete {@code SocketImpl} to accept the connection
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            request on.
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the connection cannot be accepted.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected final void implAccept(Socket aSocket) throws IOException {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.accept(aSocket.impl);
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        aSocket.accepted();
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the server socket implementation factory of this instance. This
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * method may only be invoked with sufficient security privilege and only
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * once during the application lifetime.
293f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param aFactory
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the streaming socket factory to be used for further socket
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            instantiations.
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the factory could not be set or is already set.
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static synchronized void setSocketFactory(SocketImplFactory aFactory)
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException {
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null) {
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            security.checkSetFactory();
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (factory != null) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K0042")); //$NON-NLS-1$
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        factory = aFactory;
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the timeout period of this server socket. This is the time the
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * server will wait listening for accepted connections before exiting. This
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value must be a positive number.
316f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param timeout
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the listening timeout value of this server socket.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option.
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public synchronized void setSoTimeout(int timeout) throws SocketException {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (timeout < 0) {
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0036")); //$NON-NLS-1$
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_TIMEOUT, Integer.valueOf(timeout));
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a textual representation of this server socket including the
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address, port and the state. The port field is set to {@code 0} if there
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is no connection to the server socket.
334f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the textual socket representation.
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
339a389b4a499f40379b0b204d7ba1c2057663d95c0Jesse Wilson        StringBuilder result = new StringBuilder(64);
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result.append("ServerSocket["); //$NON-NLS-1$
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return result.append("unbound]").toString(); //$NON-NLS-1$
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result.append("addr=") //$NON-NLS-1$
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .append(getInetAddress().getHostName()).append("/") //$NON-NLS-1$
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .append(getInetAddress().getHostAddress()).append(
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        ",port=0,localport=") //$NON-NLS-1$
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .append(getLocalPort()).append("]") //$NON-NLS-1$
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .toString();
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Binds this server socket to the given local socket address. The default
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of pending connections may be backlogged. If the {@code localAddr}
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is set to {@code null} the socket will be bound to an available local
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * address on any free port of the system.
357f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddr
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the local address and port to bind on.
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the {@code SocketAddress} is not supported.
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the socket is already bound or a problem occurs during
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             binding.
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void bind(SocketAddress localAddr) throws IOException {
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bind(localAddr, defaultBacklog());
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Binds this server socket to the given local socket address. If the
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code localAddr} is set to {@code null} the socket will be bound to an
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * available local address on any free port of the system. The value for
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code backlog} must e greater than {@code 0} otherwise the default value
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * will be used.
376f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param localAddr
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the local machine address and port to bind on.
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param backlog
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of pending connection requests, before requests
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            will be rejected.
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the {@code SocketAddress} is not supported.
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the socket is already bound or a problem occurs during
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             binding.
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void bind(SocketAddress localAddr, int backlog) throws IOException {
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isBound()) {
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new BindException(Msg.getString("K0315")); //$NON-NLS-1$
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int port = 0;
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetAddress addr = InetAddress.ANY;
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (localAddr != null) {
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(localAddr instanceof InetSocketAddress)) {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException(Msg.getString(
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        "K0316", localAddr.getClass())); //$NON-NLS-1$
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InetSocketAddress inetAddr = (InetSocketAddress) localAddr;
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((addr = inetAddr.getAddress()) == null) {
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SocketException(Msg.getString(
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        "K0317", inetAddr.getHostName())); //$NON-NLS-1$
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            port = inetAddr.getPort();
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        SecurityManager security = System.getSecurityManager();
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (security != null) {
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            security.checkListen(port);
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.bind(addr, port);
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isBound = true;
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.listen(backlog > 0 ? backlog : defaultBacklog());
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                close();
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the local socket address of this server socket or {@code null} if
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the socket is unbound. This is useful on multihomed hosts.
427f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the local socket address and port this socket is bound to.
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public SocketAddress getLocalSocketAddress() {
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isBound()) {
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new InetSocketAddress(getInetAddress(), getLocalPort());
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether this server socket is bound to a local address and port
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or not.
440f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this socket is bound, {@code false} otherwise.
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isBound() {
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isBound;
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether this server socket is closed or not.
449f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this socket is closed, {@code false} otherwise.
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean isClosed() {
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return isClosed;
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Checks whether the socket is closed, and throws an exception.
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private void checkClosedAndCreate(boolean create) throws SocketException {
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (isClosed()) {
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new SocketException(Msg.getString("K003d")); //$NON-NLS-1$
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!create || isCreated) {
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return;
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (this) {
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isCreated) {
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return;
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                impl.create(true);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (SocketException e) {
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw e;
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IOException e) {
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new SocketException(e.toString());
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isCreated = true;
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the value for the socket option {@code SocketOptions.SO_REUSEADDR}.
485f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param reuse
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the socket option setting.
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the option value.
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setReuseAddress(boolean reuse) throws SocketException {
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_REUSEADDR, reuse ? Boolean.TRUE
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                : Boolean.FALSE);
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the value of the socket option {@code SocketOptions.SO_REUSEADDR}.
499f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the option is enabled, {@code false} otherwise.
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the option value.
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean getReuseAddress() throws SocketException {
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Boolean) impl.getOption(SocketOptions.SO_REUSEADDR))
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .booleanValue();
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets the server socket receive buffer size {@code
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketOptions.SO_RCVBUF}.
513f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param size
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the buffer size in bytes.
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while setting the size or the size is
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             invalid.
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setReceiveBufferSize(int size) throws SocketException {
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (size < 1) {
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Msg.getString("K0035")); //$NON-NLS-1$
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        impl.setOption(SocketOptions.SO_RCVBUF, Integer.valueOf(size));
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the value for the receive buffer size socket option {@code
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * SocketOptions.SO_RCVBUF}.
531f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the receive buffer size of this socket.
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws SocketException
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurs while reading the option value.
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int getReceiveBufferSize() throws SocketException {
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        checkClosedAndCreate(true);
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return ((Integer) impl.getOption(SocketOptions.SO_RCVBUF)).intValue();
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the related channel if this instance was created by a
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ServerSocketChannel}. The current implementation returns always {@code
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * null}.
545f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the related {@code ServerSocketChannel} if any.
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public ServerSocketChannel getChannel() {
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Sets performance preferences for connection time, latency and bandwidth.
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This method does currently nothing.
556f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param connectionTime
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value representing the importance of a short connecting
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            time.
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param latency
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value representing the importance of low latency.
562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param bandwidth
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the value representing the importance of high bandwidth.
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void setPerformancePreferences(int connectionTime, int latency,
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int bandwidth) {
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Our socket implementation only provide one protocol: TCP/IP, so
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // we do nothing for this method
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
571