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.io.ObjectInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class represents a socket endpoint described by a IP address and a port
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * number. It is a concrete implementation of {@code SocketAddress} for IP.
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class InetSocketAddress extends SocketAddress {
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 5076001401234631237L;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
31811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes    // Exactly one of hostname or addr should be set.
328e1b1ee7fe8ec6168c44a361233cbe225a16fc9dElliott Hughes    private final InetAddress addr;
33811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes    private final String hostname;
348e1b1ee7fe8ec6168c44a361233cbe225a16fc9dElliott Hughes    private final int port;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3723ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes     * @hide internal use only
3823ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes     */
3923ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes    public InetSocketAddress() {
4023ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        // These will be filled in the native implementation of recvfrom.
4123ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        this.addr = null;
4223ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        this.hostname = null;
4323ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes        this.port = -1;
4423ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes    }
4523ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes
4623ec09188303a874b3b391f96ae0a29af002bff9Elliott Hughes    /**
47051128862ae7c5c031b8ddb763848ed264a63746Lorenzo Colitti     * Creates a socket endpoint with the given port number {@code port} and
48051128862ae7c5c031b8ddb763848ed264a63746Lorenzo Colitti     * no specified address. The range for valid port numbers is between 0 and
49051128862ae7c5c031b8ddb763848ed264a63746Lorenzo Colitti     * 65535 inclusive.
50f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified port number to which this socket is bound.
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InetSocketAddress(int port) {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this((InetAddress) null, port);
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a socket endpoint with the given port number {@code port} and
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code address}. The range for valid port numbers is between 0 and 65535
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inclusive. If {@code address} is {@code null} this socket is bound to the
62051128862ae7c5c031b8ddb763848ed264a63746Lorenzo Colitti     * IPv4 wildcard address.
63f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified port number to which this socket is bound.
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param address
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified address to which this socket is bound.
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InetSocketAddress(InetAddress address, int port) {
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (port < 0 || port > 65535) {
71811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes            throw new IllegalArgumentException("port=" + port);
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
73811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes        this.addr = (address == null) ? Inet4Address.ANY : address;
74811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes        this.hostname = null;
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.port = port;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a socket endpoint with the given port number {@code port} and the
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hostname {@code host}. The hostname is tried to be resolved and cannot be
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null}. The range for valid port numbers is between 0 and 65535
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * inclusive.
83f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified port number to which this socket is bound.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified hostname to which this socket is bound.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public InetSocketAddress(String host, int port) {
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(host, port, true);
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
94f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * Internal constructor for InetSocketAddress(String, int) and
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * createUnresolved(String, int);
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
97c0372d90016d241ac979faa6fa1731f30b6f2a03Jesse Wilson    InetSocketAddress(String hostname, int port, boolean needResolved) {
98c0372d90016d241ac979faa6fa1731f30b6f2a03Jesse Wilson        if (hostname == null || port < 0 || port > 65535) {
99c0372d90016d241ac979faa6fa1731f30b6f2a03Jesse Wilson            throw new IllegalArgumentException("host=" + hostname + ", port=" + port);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
101c0372d90016d241ac979faa6fa1731f30b6f2a03Jesse Wilson
1028e1b1ee7fe8ec6168c44a361233cbe225a16fc9dElliott Hughes        InetAddress addr = null;
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (needResolved) {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
1058e1b1ee7fe8ec6168c44a361233cbe225a16fc9dElliott Hughes                addr = InetAddress.getByName(hostname);
1068e1b1ee7fe8ec6168c44a361233cbe225a16fc9dElliott Hughes                hostname = null;
107c0372d90016d241ac979faa6fa1731f30b6f2a03Jesse Wilson            } catch (UnknownHostException ignored) {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1108e1b1ee7fe8ec6168c44a361233cbe225a16fc9dElliott Hughes        this.addr = addr;
111811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes        this.hostname = hostname;
112811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes        this.port = port;
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates an {@code InetSocketAddress} without trying to resolve the
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * hostname into an {@code InetAddress}. The address field is marked as
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * unresolved.
119f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param host
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified hostname to which this socket is bound.
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param port
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the specified port number to which this socket is bound.
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the created InetSocketAddress instance.
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the hostname {@code host} is {@code null} or the port is
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not in the range between 0 and 65535.
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static InetSocketAddress createUnresolved(String host, int port) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new InetSocketAddress(host, port, false);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the port number of this socket.
135f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the socket endpoint port number.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int getPort() {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return port;
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the address of this socket.
144f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the socket endpoint address.
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final InetAddress getAddress() {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return addr;
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1524f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     * Returns the hostname, doing a reverse lookup on the {@code InetAddress} if no
1534f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     * hostname string was provided at construction time.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String getHostName() {
156811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes        return (addr != null) ? addr.getHostName() : hostname;
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1604f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     * Returns the hostname if known, or the result of {@code InetAddress.getHostAddress}.
1614f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     * Unlike {@link #getHostName}, this method will never cause a DNS lookup.
1624f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     * @since 1.7
1634f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     * @hide 1.7 - remember to add a link in the getHostName documentation!
1644f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes     */
1654f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes    public final String getHostString() {
1664f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes        return (hostname != null) ? hostname : addr.getHostAddress();
1674f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes    }
1684f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes
1694f9ffffd8a2835c30647f9785afb48fa96a0f045Elliott Hughes    /**
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns whether this socket address is unresolved or not.
171f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this socket address is unresolved, {@code false}
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         otherwise.
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean isUnresolved() {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return addr == null;
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
18010914811ea02b4acc7ab1dc5a0ada1b54cdf2203Elliott Hughes     * Returns a string containing the address (or the hostname for an
18110914811ea02b4acc7ab1dc5a0ada1b54cdf2203Elliott Hughes     * unresolved {@code InetSocketAddress}) and port number.
18210914811ea02b4acc7ab1dc5a0ada1b54cdf2203Elliott Hughes     * For example: {@code "www.google.com/74.125.224.115:80"} or {@code "/127.0.0.1:80"}.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
18410914811ea02b4acc7ab1dc5a0ada1b54cdf2203Elliott Hughes    @Override public String toString() {
185811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes        return ((addr != null) ? addr.toString() : hostname) + ":" + port;
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares two socket endpoints and returns true if they are equal. Two
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * socket endpoints are equal if the IP address or the hostname of both are
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * equal and they are bound to the same port.
192f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param socketAddr
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to be tested for equality.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if this socket and the given socket object {@code
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         socketAddr} are equal, {@code false} otherwise.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean equals(Object socketAddr) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (this == socketAddr) {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return true;
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!(socketAddr instanceof InetSocketAddress)) {
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetSocketAddress iSockAddr = (InetSocketAddress) socketAddr;
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // check the ports as we always need to do this
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (port != iSockAddr.port) {
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // we only use the hostnames in the comparison if the addrs were not
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // resolved
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((addr == null) && (iSockAddr.addr == null)) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hostname.equals(iSockAddr.hostname);
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // addrs were resolved so use them for the comparison
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr == null) {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // if we are here we know iSockAddr is not null so just return
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // false
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return false;
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return addr.equals(iSockAddr.addr);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int hashCode() {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (addr == null) {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return hostname.hashCode() + port;
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return addr.hashCode() + port;
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
236811a5c01400cf923c1827753a73297434d69fa43Elliott Hughes    private void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        stream.defaultReadObject();
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
240