Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android,SocketAddress和sockets存在问题。反向查找?_Android_Sockets_Dns - Fatal编程技术网

Android,SocketAddress和sockets存在问题。反向查找?

Android,SocketAddress和sockets存在问题。反向查找?,android,sockets,dns,Android,Sockets,Dns,我对安卓系统有问题。我正试图连接到一个服务器与代理没有运气 我有这段代码,可以在普通Java上正常工作。它只定义了一个代理服务器,并创建了一个用该代理连接到google的套接字。它发送一个简单的GET请求,然后显示响应 import java.net.InetSocketAddress; import java.net.Proxy; import java.net.Socket; import java.net.SocketAddress; public class Main { p

我对安卓系统有问题。我正试图连接到一个服务器与代理没有运气

我有这段代码,可以在普通Java上正常工作。它只定义了一个代理服务器,并创建了一个用该代理连接到google的套接字。它发送一个简单的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地址,则这不会是问题(性能方面除外)。事实上,这个主机名无法通过我的internet连接解析为ip地址(我不知道其他人是否可以)。因此,反向查找工作正常,但正常查找失败,因此当套接字尝试通过代理连接时,会引发以下异常:

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

所以问题是,如果我提供了ip地址,为什么它会尝试连接主机名?有没有办法避免这种查找?我尝试过使用InetSocketAddress的createUnresolved,但在本例中,套接字挂起在连接上

进行反向DNS查找以获取主机名(如果有的话),然后在套接字需要连接时,再次将主机解析为ip地址,这不是浪费时间、internet连接等吗


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

是的,
InetSocketAddress
的特定构造函数似乎执行反向DNS查找:


此外,Android 2.3.4上似乎不再出现这种情况。

为了防止反向查找,您可以使用创建
InetAddress

然后将
InetAddress
实例传递到
InetSocketAddress
构造函数中


或者,在android中使用factory方法,您必须使用后台进程来完成所有操作,这样您就不会直接在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");

                        }

我的银河系S上有2.3.4,错误仍然存在。我已经检查了这个页面,但是我没有找到任何解决方案。嗨,正如我在问题中所评论的,createUnresolved似乎不起作用,连接被挂起。使用InetAddress创建InetSocketAddress也不起作用,因为反向查找是由InetSocketAddress完成的。您如何构造InetAddress?我指定使用
getByAddress(byte[])
,它(根据API)不会解析地址。
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");

                        }