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