Android,SocketAddress和套接字的问题。反向查找?

时间:2011-08-25 17:54:40

标签: android sockets dns

我的Android有问题。我试图连接到没有运气的代理服务器。

我有这个代码在普通的Java上工作正常。它只定义一个代理服务器并创建一个套接字,用于连接谷歌与该代理。它发送一个简单的GET请求,然后显示响应。

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 address 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();
        }

    }
}

android的问题,代码类似,就是InetSocketAddress做了一些奇怪的事情。似乎它对给定的ip执行反向查找,然后使用代理创建的套接字尝试连接已解析的主机名,在本例中为78-137-18-67.dynamic-pool.mclaut.net。

如果套接字可以将主机名解析回ip地址,那么这不是问题(性能除外)。事实是,这个主机名无法通过我的互联网连接解析为IP地址(我不知道其他人是否可以)。因此反向查找工作正常但正常查找失败,因此当套接字尝试通过代理连接时,会引发以下异常:

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

[ERROR]建立连接java.net.SocketException:SOCKS时出错   连接失败:java.net.UnknownHostException:   78-137-18-67.dynamic-pool.mclaut.net

所以问题是,如果我给了ip地址,它为什么要尝试连接主机名呢?有没有办法避免这种查找?我已尝试使用createUnresolved InetSocketAddress,但在这种情况下,套接字挂起连接。

不是浪费时间,互联网连接等来进行反向DNS查找以获取主机名(如果有的话),以及稍后当套接字需要连接时,再次将主机解析为IP地址?

注意:此代码是一个示例,真正的应用程序不会以这种方式执行任何http请求。它使用二进制数据包。

3 个答案:

答案 0 :(得分:1)

要阻止反向查询,您可以使用getByAddress(byte[])创建InetAddress

然后将InetAddress实例传递给InetSocketAddress构造函数。

或者,使用工厂方法InetSocketAddress.createUnresolved(String,int)

答案 1 :(得分:0)

是的,似乎InetSocketAddress的特定构造函数执行反向DNS查找:http://mailinglists.945824.n3.nabble.com/Android-and-reverse-DNS-lookup-issues-td3011461.html

此外,似乎在Android 2.3.4上不再发生这种情况。

答案 2 :(得分:0)

在android中你必须用后台进程做所有事情,这样你就不用直接在onCreate方法中编写socket的代码,你必须在后台执行此操作,这样你的ui就不会挂起 像这样的东西

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");

                        }