SocketImpl.java revision f5597e626ecf7949d249dea08c1a2964d890ec11
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.FileDescriptor; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.INetworkSystem; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.platform.Platform; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.luni.util.Msg; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is the base of all streaming socket implementation classes. 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Streaming sockets are wrapped by two classes, {@code ServerSocket} and 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Socket} at the server and client end of a connection. At the server, 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * there are two types of sockets engaged in communication, the {@code 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ServerSocket} on a well known port (referred to as listener) used to 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * establish a connection and the resulting {@code Socket} (referred to as 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * host). 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SocketImpl implements SocketOptions { 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The remote address this socket is connected to. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected InetAddress address; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The remote port this socket is connected to. 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int port; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The file descriptor of this socket. 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected FileDescriptor fd; 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The local port this socket is connected to. 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int localport; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project INetworkSystem netImpl; 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-removed 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // int receiveTimeout; 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-removed 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean streaming = true; 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project boolean shutdownInput; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new connection-oriented socket implementation. 72f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see SocketImplFactory 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SocketImpl() { 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.netImpl = Platform.getNetworkSystem(); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Waits for an incoming request and blocks until the connection is opened 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * on the given socket. 82f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param newSocket 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket to accept connections on. 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while accepting a new connection. 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void accept(SocketImpl newSocket) throws IOException; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the available number of bytes which are readable from this socket 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * without blocking. 93f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of bytes that may be read without blocking. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while reading the number of bytes. 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract int available() throws IOException; 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Binds this socket to the specified local host address and port number. 102f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param address 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the local machine address to bind this socket to. 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port on the local machine to bind this socket to. 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while binding this socket. 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void bind(InetAddress address, int port) 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes this socket. This makes later access invalid. 115f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while closing this socket. 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void close() throws IOException; 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Connects this socket to the specified remote host and port number. 123f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote host this socket has to be connected to. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote port on which this socket has to be connected. 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while connecting to the remote host. 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void connect(String host, int port) throws IOException; 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Connects this socket to the specified remote host address and port 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number. 136f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param address 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote host address this socket has to be connected to. 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote port on which this socket has to be connected. 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while connecting to the remote host. 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void connect(InetAddress address, int port) 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a new unconnected socket. The argument {@code isStreaming} 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defines whether the new socket is a streaming or a datagram socket. 150f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param isStreaming 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * defines whether the type of the new socket is streaming or 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * datagram. 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while creating the socket. 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void create(boolean isStreaming) throws IOException; 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the file descriptor of this socket. 161f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the file descriptor of this socket. 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected FileDescriptor getFileDescriptor() { 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return fd; 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the remote address this socket is connected to. 170f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the remote address of this socket. 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected InetAddress getInetAddress() { 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return address; 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the input stream of this socket. 179f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the input stream of this socket. 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while accessing the input stream. 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract InputStream getInputStream() throws IOException; 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the local port number of this socket. The field is initialized to 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code -1} and upon demand will go to the IP stack to get the bound 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * value. See the class comment for the context of the local port. 190f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the local port number this socket is bound to. 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int getLocalPort() { 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return localport; 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the value of the given socket option. 199f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param optID 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket option to retrieve. 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the option value. 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while accessing the option. 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract Object getOption(int optID) throws SocketException; 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the output stream of this socket. 210f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the output stream of this socket. 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while accessing the output stream. 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract OutputStream getOutputStream() throws IOException; 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Gets the remote port number of this socket. This value is not meaningful 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * when this instance is wrapped by a {@code ServerSocket}. 220f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the remote port this socket is connected to. 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected int getPort() { 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return port; 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Listens for connection requests on this streaming socket. Incoming 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * connection requests are queued up to the limit specified by {@code 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * backlog}. Additional requests are rejected. The method {@code listen()} 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * may only be invoked on streaming sockets. 232f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param backlog 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the maximum number of outstanding connection requests. 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while listening. 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void listen(int backlog) throws IOException; 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the value for the specified socket option. 242f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param optID 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the socket option to be set. 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param val 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the option value. 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws SocketException 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while setting the option. 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setOption(int optID, Object val) 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws SocketException; 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of the 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * socket. 256f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the textual representation of this socket. 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @SuppressWarnings("nls") 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project @Override 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return new StringBuffer(100).append("Socket[addr=").append( 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project getInetAddress()).append(",port=").append(port).append( 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ",localport=").append(getLocalPort()).append("]").toString(); 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * In the IP stack, write at most {@code count} bytes on the socket 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from the {@code buffer}, from the {@code offset}. 270f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param buffer 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the buffer to read into 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param offset 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the offset into the buffer 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param count 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the number of bytes to write 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return int the actual number of bytes written 278f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @throws IOException 279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * thrown if an error occurs while writing 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int write(byte[] buffer, int offset, int count) throws IOException { 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!streaming) { 283f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return this.netImpl.sendDatagram2(fd, buffer, offset, count, port, 284f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson address); 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 286f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson return this.netImpl.write(fd, buffer, offset, count); 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes the input channel of this socket. 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This default implementation always throws an {@link IOException} to 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicate that the subclass should have overridden this method. 294f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * always because this method should be overridden. 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void shutdownInput() throws IOException { 299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // KA025=Method has not been implemented 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(Msg.getString("KA025"));//$NON-NLS-1$ 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Closes the output channel of this socket. 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This default implementation always throws an {@link IOException} to 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * indicate that the subclass should have overridden this method. 308f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * always because this method should be overridden. 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void shutdownOutput() throws IOException { 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // KA025=Method has not been implemented 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new IOException(Msg.getString("KA025"));//$NON-NLS-1$ 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Connects this socket to the remote host address and port number specified 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * by the {@code SocketAddress} object with the given timeout. This method 320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will block indefinitely if the timeout is set to zero. 321f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param remoteAddr 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the remote host address and port number to connect to. 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param timeout 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the timeout value in milliseconds. 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs while connecting. 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void connect(SocketAddress remoteAddr, int timeout) 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException; 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether the socket supports urgent data or not. Subclasses should 334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * override this method. 335f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code false} because subclasses must override this method. 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected boolean supportsUrgentData() { 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return false; 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sends the single byte of urgent data on the socket. 344f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param value 346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the byte of urgent data. 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs sending urgent data. 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected abstract void sendUrgentData(int value) throws IOException; 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets performance preference for connection time, latency and bandwidth. 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Does nothing by default. 355f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param connectionTime 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the importance of connect time. 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param latency 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the importance of latency. 360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param bandwidth 361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the importance of bandwidth. 362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setPerformancePreferences(int connectionTime, int latency, 364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project int bandwidth) { 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Our socket implementation only provide one protocol: TCP/IP, so 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // we do nothing for this method 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 369