今日もソケットプログラミングをテストするとき、外部ネットワークに接続することはできません。同社はHTTPエージェントを使用しています。私はオンラインで検索を理解していなかったので、勉強に多くの時間を費やしました。 HTTPとTCPプロトコルの間の良好な関係を見て初めて理解できます。ソケットを介してHTTPプロキシを使用できるようになったので、結果は非常に簡単ですが、プロセスは非常に困難です。
1. HTTPとTCPについて簡単に説明しましょう(特定のコンテンツを自分でグーグルで検索できます。
HTTP:輸送層プロトコルに基づくアプリケーションレイヤープロトコルです。
TCP:ネットワークレイヤープロトコルに基づいたトランスポートレイヤープロトコルです。
IP:ネットワークレイヤープロトコルです。
TCP接続には3つのハンドシェイクが必要です(詳細ではなく、家庭登録を転送するのと同じです)。これは、カスタムプロトコルに相当するものです。コンテンツ形式。たとえば、誰かが「sb」(あなたの名前)と言っている場合、「はい」に答えます。それは単なるコンテンツ形式であり、伝送の音のメソッドを変更しません(音波<ネットワークハードウェアメディア>を介して送信されます。両方の当事者が理解できること。同様に、FTPとTelnetもアプリケーション層のプロトコルです。他の人が「HEY」と答えますが、形式とコンテンツは異なります。
2。上記を実現した後、HTTPプロキシについて話しましょう。HTTPプロキシサーバーはそのようなマシンであることを理解できます。サーバー。このHTTPプロキシサーバーは、アクセスする最終アドレスを要求し、応答を渡します。また、HTTPプロトコルをプロキシにし、HTTPはTCPに基づいていることに注意する必要があります。つまり、このサーバーは指定されたHTTPコンテンツ形式とTCP接続をプロキシにプロキシすることを意味します。続行するのは退屈です、次のコードを見てください:
コードコピーは次のとおりです。
//次のアドレスはプロキシサーバーのアドレスです
ソケットソケット= new Socket( "10.1.2.188"、80);
//書き込まれ、書き込まれたコンテンツは、HTTP要求プロトコル形式に従うコンテンツです。
socket.getOutputStream()。write(new String( "get http://www.baidu.com/ http/1.1/r/n/r/n")。getBytes());
byte [] bs = new byte [1024];
inputstream is = socket.getinputStream();
int i;
while((i = is.read(bs))> 0){
System.out.println(new String(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(new String(cs、0、i));
}
isr.close();
最後に、要約しましょう:
HTTPプロキシを使用した環境では、
Socket(TCP)を使用して外部ネットワークに接続すると、プロキシサーバーに直接接続し、送信されたHTTPリクエストで外部ネットワークURLを指定して転送します。
URL(HTTP)を使用して外部ネットワークに接続する場合、HTTPプロキシパラメーターを設定するか、プロキシを使用する必要があります。
OK、次のコードを使用して、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")。デコード(バッファー));
buffer.clear();
}
sc.close();
Javaソケットプログラミングにプロキシを追加する例
ネットワークを外部ネットワークに直接接続できない場合があります。プロキシの設定を完了するプロパティこの方法は比較的簡単ですが、別の接続のプロキシを設定することはできません。
コードコピーは次のとおりです。
public static void main(string [] args){
Properties Prop = System.GetProperties();
// httpにアクセスするときに使用するプロキシサーバーのアドレスを設定します
prop.setProperty( "http.proxyhost"、 "192.168.0.254");
//使用するプロキシサーバーへのHTTPアクセスのポートを設定します
prop.setProperty( "http.proxyport"、 "8080");
//プロキシサーバーを介してアクセスする必要がないホストを設定し、 * WildCard文字を使用できます。
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は認証者を拡張します{
private string user = "";
プライベート文字列password = "";
public MyAuthenticator(string user、string password){
this.user = user;
this.password = password;
}
Protected PasswordAuthentication getPassWordAuthentication(){
returnNew PasswordAuthentication(user、password.tochararray());
}
}
方法2は、各接続のプロキシを実装しています。このメソッドはJDK 1.5以上でのみ使用できます。設定するのは面倒です:
コードコピーは次のとおりです。
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 = new Proxy(proxy.type.http、addr);
//プロキシサーバーの名前がわかっている場合、直接使用できます
// 仕上げる
urlconnection conn = url.openconnection(proxy);
inputstream in = conn.getInputStream();
// inputstream in = url.openstream();
文字列s = ioutils.tostring(in);
System.out.println(s);
} catch(例外e){
e.printstacktrace();
}
}