오늘 소켓 프로그래밍을 다시 테스트 할 때 외부 네트워크에 연결할 수 없습니다. 회사는 HTTP 에이전트를 사용합니다. 온라인에서 검색을 이해하지 못했기 때문에 공부하는 데 많은 시간을 보냈습니다. HTTP와 TCP 프로토콜 사이의 좋은 관계를 본 후에 만 이해할 수 있습니다. 소켓을 통해 HTTP 프록시를 사용할 수 있으므로 결과는 매우 간단하지만 프로세스는 매우 어렵습니다.
1. HTTP 및 TCP에 대해 간단히 이야기 해 봅시다 (특정 콘텐츠를 직접 Google 할 수 있으며 정보가 매우 완료됩니다).
HTTP : 전송 계층 프로토콜을 기반으로 한 응용 프로그램 계층 프로토콜입니다.
TCP : 네트워크 계층 프로토콜을 기반으로 한 전송 계층 프로토콜입니다.
IP : 네트워크 계층 프로토콜입니다.
TCP 연결에는 세 가지 핸드 셰이크가 필요합니다 (자세한 내용은 가계 등록을 전송하는 것과 마찬가지로 HTTP는 사용자 지정 프로토콜과 동등한 응용 프로그램 프로토콜입니다. 즉, 데이터 만 방해하지 않습니다. 내용 형식 정의. 예를 들어, 누군가가 "SB"(귀하의 이름)라고 말하면 "예"라고 대답하면 컨텐츠 형식 일 뿐이며 사운드 웨이브 <네트워크 하드웨어 매체>를 통해 전송되는 전송 메소드가 언어를 통해 전송되지 않습니다. 양 당사자가 이해할 수 있습니다. 마찬가지로 FTP와 Telnet은 예를 들어 "SB"라고 말하면 응용 프로그램 계층 프로토콜이지만 형식과 내용은 다릅니다.
2. 위의 것을 실현 한 후 HTTP 프록시에 대해 이야기합시다. 그런 다음 서버. 그런 다음이 HTTP 프록시 서버는 액세스하려는 최종 주소를 요청하고 응답을 귀하에게 전달합니다. 여기에서도 HTTP 프로토콜을 프록시하고 HTTP는 TCP를 기반으로합니다. 즉,이 서버는 지정된 HTTP 컨텐츠 형식과 TCP 연결을 프록시합니다. 계속해서 지루하고 다음 코드를보십시오.
코드 사본은 다음과 같습니다.
// 다음 주소는 프록시 서버의 주소입니다.
소켓 소켓 = 새로운 소켓 ( "10.1.2.188", 80);
// 작성 및 작성된 내용은 HTTP 요청 프로토콜 형식에 따른 콘텐츠입니다.
socket.getoutputStream (). writ
바이트 [] BS = 새로운 바이트 [1024];
inputStream은 = 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 = new inputStreamReader (con.getInputStream ());
char [] cs = new char [1024];
int i = 0;
while ((i = isr.read (cs))> 0) {
System.out.println (새 문자열 (cs, 0, i));
}
isr.close ();
마지막으로 요약하겠습니다.
HTTP 프록시를 사용하는 환경에서
소켓 (TCP)을 사용하여 외부 네트워크에 연결하면 프록시 서버에 직접 연결 한 다음 전송 된 HTTP 요청에서 전달할 외부 네트워크 URL을 지정합니다.
URL (HTTP)을 사용하여 외부 네트워크에 연결하는 경우 HTTP 프록시 매개 변수를 설정하거나 프록시를 사용해야합니다.
좋아, 당신은 당신이 이해 한 후에 그것을 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
Socketchannel SC = Socketchannel.open (새로운 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.allocate (1024);
while (sc.read (buffer)! = -1) {
buffer.flip ();
System.out.println (charset.forname ( "utf8"). decode (buffer));
buffer.clear ();
}
sc.close ();
Java 소켓 프로그래밍에 프록시 추가의 예
때때로 우리의 네트워크는 외부 네트워크에 직접 연결할 수 없습니다. 외부 네트워크에 연결하려면 HTTP, HTTPS 또는 소켓 프록시를 사용해야합니다. 속성 프록시 설정을 완료하기 위해이 방법은 비교적 간단하지만 별도의 연결을 위해 프록시를 설정할 수는 없습니다.
코드 사본은 다음과 같습니다.
public static void main (String [] args) {
속성 proper = 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.*");
// 양말 프록시 서버의 주소와 포트
Prop.SetProperty ( "SocksProxyHost", "192.168.0.254");
Prop.SetProperty ( "SocksProxyPort", "8000");
// 프록시 서버에 로그인하려면 사용자 이름과 비밀번호를 설정합니다.
authenticator.setDefault (new myAuthenticator ( "username", "password"));
}
정적 클래스 myauthenticator 확장 인증기 {
개인 문자열 user = "";
개인 문자열 비밀번호 = "";
public myauthenticator (문자열 사용자, 문자열 암호) {
this.user = 사용자;
this.password = 비밀번호;
}
보호 된 PasswordAuthentication getPasswordAuthentication () {
returnNew passwordAuthentication (user, password.tochararray ());
}
}
방법 2는 프록시를 사용하여 각 연결에 대한 프록시를 구현할 수 있습니다. 설정하기에 :
코드 사본은 다음과 같습니다.
public static void main (String [] args) {
노력하다 {
url url = new URL ( "http://www.baidu.com");
// 프록시 서버를 만듭니다
inetSocketAddress addr = 새로운 inetSocketAddress ( "192.168.0.254",
8080);
// 프록시 프록시 = 새로운 프록시 (proxy.Socks, addr);
프록시 프록시 = 새로운 프록시 (proxy.type.http, addr);
// 프록시 서버의 이름을 알고 있다면 직접 사용할 수 있습니다.
// 마치다
urlConnection conn = url.openConnection (프록시);
inputStream in = conn.getInputStream ();
// inputStream in = url.openstream ();
문자열 s = ioutils.tostring (in);
System.out.println (s);
} catch (예외 e) {
e.printstacktrace ();
}
}