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