我的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请求。它使用二进制数据包。
答案 0 :(得分:1)
要阻止反向查询,您可以使用getByAddress(byte[])
创建InetAddress
。
然后将InetAddress
实例传递给InetSocketAddress
构造函数。
答案 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");
}