При тестировании программирования сокетов сегодня я не могу подключиться к внешней сети. Компания использует агент HTTP. Я не понимал поиска в Интернете, поэтому я провел много времени на учебу. Только после просмотра хороших отношений между протоколами HTTP и TCP вы можете понять. Теперь, когда вы можете использовать HTTP -прокси через розетку, результат очень прост, но процесс очень сложный.
1. Давайте кратко поговорим о HTTP и TCP (вы можете сами погуглить конкретный контент, и информация очень полна).
HTTP: Это протокол прикладного уровня, основанный на протоколе транспортного уровня.
TCP: Это протокол транспортного уровня, основанный на протоколе сетевого уровня.
IP: Это протокол сетевого уровня.
Подключение TCP требует трех рукоятки (точно так же, как передача регистрации домохозяйства, не подробно). контент формат. Например, если кто -то говорит «SB» (ваше имя), вы отвечаете «да», это просто формат контента, и он не меняет метод передачи звука (передается через звуковые волны <сетевая аппаратная среда>, через языки Что обе стороны могут понять. Точно так же FTP и Telnet также являются протоколом приложений.
2. После осознания вышесказанного, давайте поговорим о HTTP -прокси. Сервер. Здесь следует также отметить, что он прокси -прокси -протокол HTTP, а HTTP основан на TCP, что означает, что этот сервер прокси подключает соединение TCP с указанным форматом контента HTTP. Скучно продолжать, посмотрите на следующий код:
Кода -копия выглядит следующим образом:
// Следующий адрес - это адрес прокси -сервера
Сокет сокет = новый сокет ("10.1.2.188", 80);
// Записанный и написанный контент - это контент, который следует за форматом протокола HTTP -запроса, запрос Baidu
socket.getOutputStream (). write (new String ("Get http://www.baidu.com/ http/1.1/r/n/r/n"). getbytes ());
байт [] bs = новый байт [1024];
Inputstream is = socket.getInputStream ();
int i;
while ((i = is.read (bs))> 0) {
System.out.println (новая строка (BS, 0, i));
}
is.close ();
Конечно, в Java есть прокси -серфинг для серфинга в Интернете.
Кода -копия выглядит следующим образом:
// Установить прокси
System.SetProperty ("http.proxyset", "true");
System.SetProperty ("http.proxyhost", "10.1.2.188");
System.SetProperty ("http.proxyport", "80");
// непосредственно получить доступ к адресу назначения
Url url = new URL ("http://www.baidu.com");
UrlConnection con = url.openconnection ();
InputStreamReader ISR = новый inputStreamReader (con.getInputStream ());
char [] cs = new char [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (New String (CS, 0, I));
}
isr.close ();
Наконец, давайте обобжим:
В среде с использованием HTTP -прокси,
Если вы используете Socket (TCP) для подключения к внешней сети, вы будете напрямую подключиться к прокси -серверу, а затем указать URL внешней сети для пересылки в отправленном HTTP -запросе.
Если вы используете URL (HTTP) для подключения к внешней сети, вам необходимо установить параметры прокси HTTP или использовать прокси.
Хорошо, вы можете использовать его, как вам нравится после того, как вы понимаете.
Кода -копия выглядит следующим образом:
Socketchannel sc = socketchannel.open (new inetsocketaddress ("10.1.2.188", 80));
sc.write (charset.forname ("utf8"). Encode ("Get http://www.baidu.com/ http/1.1/r/n/r/n"));
Bytebuffer buffer = bytebuffer.allocate (1024);
while (sc.read (buffer)! = -1) {
buffer.flip ();
System.out.println (charset.forname ("utf8"). Decode (buffer));
buffer.clear ();
}
sc.close ();
Пример добавления прокси в программирование сокетов Java
Иногда наша сеть не может быть напрямую подключена к внешней сети. Свойства для завершения настройки прокси, этот метод относительно прост, но невозможно настроить прокси для отдельного соединения:
Кода -копия выглядит следующим образом:
public static void main (string [] args) {
Свойства prop = System.getProperties ();
// Установить адрес прокси -сервера для использования при доступе к HTTP
prop.setproperty ("http.proxyhost", "192.168.0.254");
// Установите порт HTTP -доступ к прокси -серверу для использования
prop.setproperty ("http.proxyport", "8080");
// Установите хост, к которому не нужно получить доступ через прокси -сервер.
prop.setproperty ("http.nonproxyhosts", "Localhost | 192.168.0.*");
// Установите адрес и порт прокси -сервера для безопасного доступа
// он не имеет свойства https.nonproxyhosts, оно доступно в соответствии с правилами, установленными в http.nonproxyhosts
prop.setproperty ("https.proxyhost", "192.168.0.254");
prop.setproperty ("https.proxyport", "443");
// Хозяева, порты, которые используют прокси -серверы FTP и хосты, которые не требуют прокси -серверов FTP
prop.setproperty ("ftp.proxyhost", "192.168.0.254");
prop.setproperty ("ftp.proxyport", "2121");
prop.setproperty ("ftp.nonproxyhosts", "Localhost | 192.168.0.*");
// Адрес и порт прокси -сервера Socks
prop.setproperty ("socksproxyhost", "192.168.0.254");
prop.setproperty ("socksproxyport", "8000");
// Установить имя пользователя и пароль для входа в прокси -сервер
Authenticator.setDefault (новый MyAuthenticator («Имя пользователя», «Пароль»));
}
Статический класс MyAuthenticator расширяет аутентификатор {
Private String user = "";
Private String Password = "";
public MyAuthenticator (String User, String Password) {
this.user = user;
this.password = пароль;
}
Защищенная пароль -автотенка getPasswordAuthentication () {
returnNew passwordAuthentication (user, password.thararray ());
}
}
Метод 2 использует прокси для реализации прокси для каждого соединения. трудно установить:
Кода -копия выглядит следующим образом:
public static void main (string [] args) {
пытаться {
Url url = new URL ("http://www.baidu.com");
// Создать прокси -сервер
InetsocketAddress addr = new InetSocketAddress ("192.168.0.254",
8080);
// proxy proxy = new Proxy (proxy.type.socks, addr);
Proxy Proxy = новый прокси (proxy.type.http, addr); // http proxy
// Если мы знаем имя прокси -сервера, мы можем использовать его напрямую
// Заканчивать
Urlconnection conn = url.openconnection (прокси);
InputStream in = conn.getInputStream ();
// inputStream in = url.openstream ();
String s = ioutils.tostring (in);
System.out.println (s);
} catch (Exception e) {
e.printstacktrace ();
}
}