У меня проблема с Android. Я пытаюсь подключиться к серверу с прокси безуспешно.
У меня есть этот код, который отлично работает на обычной 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-адрес. Дело в том, что это имя хоста не может быть разрешено в IP-адрес с моим подключением к Интернету (я не знаю, могут ли другие сделать). Таким образом, обратный поиск работает нормально, но при нормальном поиске происходит сбой, поэтому, когда сокет пытается подключиться через прокси, возникает следующее исключение:
08-25 19:26:46.332: ERROR/Microlog(3526): 40274 SocketConnection
[ОШИБКА] Ошибка при установлении соединения java.net.SocketException: SOCKS
Ошибка подключения: java.net.UnknownHostException:
78-137-18-67.dynamic-pool.mclaut.net
Итак, вопрос в том, почему он пытается соединиться с именем хоста, если я дал IP-адрес? Есть ли способ избежать этого поиска? Я попытался с createUnresolved из InetSocketAddress, но в этом случае сокет зависает при подключении.
Не является ли трата времени, подключения к Интернету и т. Д. Обратным поиском DNS для получения имени хоста (если оно есть), а позже, когда сокету необходимо подключиться, снова разрешите хост по IP-адресу?
ПРИМЕЧАНИЕ: этот код является примером, настоящее приложение не выполняет http-запрос таким образом. Используются двоичные пакеты данных.