开发者

Android, problems with SocketAddress and sockets. Reverse lookup?

开发者 https://www.devze.com 2023-03-30 15:08 出处:网络
i have a problem with Android. I am trying to connect to a server with a proxy with no luck. I have this code that works fine on normal Java. It only defines a proxy server and creates a socket that

i have a problem with Android. I am trying to connect to a server with a proxy with no luck.

I have this code that works fine on normal Java. It only defines a proxy server and creates a socket that would connect to google with that proxy. It sends a simple GET request and then shows the response.

import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.Socket;
import java.net.SocketAddress;

public class Main {

    public static void main(String[] args) {
        try{
            //create the proxy info
            SocketAddress socketAddress = new InetSocketAddress("78.137.18.67" , 8364);
            Proxy proxy = new Proxy(Proxy.Type.SOCKS, socketAddress);

            // create the socket with the proxy
            Socket socket = new Socket(proxy);

            // connect to some add开发者_StackOverflow中文版ress and send/receive data
            socket.connect(new InetSocketAddress("www.google.com", 80));
            socket.getOutputStream().write("GET /index.html HTTP/1.1\r\nHost: www.google.com\r\n\r\n".getBytes("UTF-8"));
            byte result[] = new byte[1024];
            socket.getInputStream().read(result);
            socket.close();
            System.out.println(new String(result));
        }catch(Exception e){
            e.printStackTrace();
        }

    }
}

The problem with android, with a code similar like that, is that the InetSocketAddress is doing something strange. It seems that it does a reverse lookup of the given ip, and then the socket created with the proxy tries to connect with the resolved host name, in this case is 78-137-18-67.dynamic-pool.mclaut.net.

This would not be a problem (except on performance) if the socket could resolve the hostname back to the ip address. The fact is that this hostname cannot be resolved to ip address with my internet connection (i don't know if others can do). So the reverse lookup is working fine but the normal lookups fails, so when the socket tries to connect through the proxy it raises the following exception:

08-25 19:26:46.332: ERROR/Microlog(3526): 40274 SocketConnection

[ERROR] Error establishing connection java.net.SocketException: SOCKS connection failed: java.net.UnknownHostException: 78-137-18-67.dynamic-pool.mclaut.net

So the question is, why it is trying to connect with the hostname if i gave the ip address? Is there any way to avoid this lookup? I have tried with createUnresolved of InetSocketAddress but in this case the socket hangs on connection.

Is not a waste of time, internet connection, etc, to do a reverse DNS lookup to get the hostname (if any), and later when the socket needs to connect, resolve again the host to an ip address?

NOTE: this code is an example, the real app do not perform any http request in this way. It uses binary data packets.


To prevent a reverse lookup, you can create the InetAddress with getByAddress(byte[]).

Then pass the InetAddress instance into the InetSocketAddress constructor.

Alternatively, use the factory method InetSocketAddress.createUnresolved(String,int)


Yes it seems that the particular constructor of InetSocketAddress does a reverse DNS lookup: http://mailinglists.945824.n3.nabble.com/Android-and-reverse-DNS-lookup-issues-td3011461.html

Also, it seems that this does not happen anymore on Android 2.3.4.


In android you have to do everything with background process so that you do not write code for socket in onCreate method directly you have to do this in background so that your ui does not hangs something like this

new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            client = new Socket(ipaddress, port);
                            printwriter = new PrintWriter(client.getOutputStream(), true);
                            InputStream is = client.getInputStream();
                            printwriter.write(msg);
                            printwriter.flush();

                            byte[] buffer = new byte[2046];
                            int read;

                            while ((read = is.read(buffer)) != -1) {
                                final String output = new String(buffer, 0, read);
                                );
                                        printwriter.close();
                                    }
                                });
                            }


                            Log.e("message", "message send");
                        } catch (UnknownHostException e2) {
                            e2.printStackTrace();
                        } catch (IOException e1) {
                            e1.printStackTrace();
                            Log.d("Time out", "Time");

                        }
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号