Android,SocketAddress和sockets存在问题。反向查找?
我对安卓系统有问题。我正试图连接到一个服务器与代理没有运气 我有这段代码,可以在普通Java上正常工作。它只定义了一个代理服务器,并创建了一个用该代理连接到google的套接字。它发送一个简单的GET请求,然后显示响应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
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");
}