用java写的http代理(原理)

  • Post author:
  • Post category:java


折腾了几天,搞出了一个网页代理服务器,只能代理http 网页。

用法:chrome 浏览器加proxy switchomega插件。端口号8000。如在本机上运行,代理主机为 127.0.0.1 当然也可放在其他主机上,代理地址写布署的主机地址 注意,插件只能选http

通道,不能选https或者Sock 4或者 5。

全部代码

import java.io.*;
import java.net.*;
import java.util.concurrent.*;

public class Daili {
	public static void main(String[] args) {
		ExecutorService es=Executors.newFixedThreadPool(5);
		
		try {
			ServerSocket ss = new ServerSocket(8000);
		
		while(true) {
			Socket sc=ss.accept();
			es.execute(new Runnable() {
				public void run() {
					try {
						InputStream is=sc.getInputStream();
						String s="";
						String zz="";
						int k;
						do {
							k=is.read();
							s=s+(char)k;
						}while(s.indexOf("\r\n\r\n")<0);
						 System.out.println(s);
				
//1----------------------------------------------------------------------------------------------------------
						if(s.indexOf("CONNECT")>=0) {
							zz=s.substring(7,s.indexOf("HTTP/1.1")-1);
							zz=zz.trim();
							zz="https://"+zz;
						}
					    if(s.indexOf("GET")>=0) {
					    	
					    	zz=s.substring(4,s.indexOf("HTTP/1.1")-1);
							zz=zz.trim();
							
					    }
					   
					    
					    System.out.println(zz);
//2----------------------------------------------------------------------------------------------------------	
//URLconnect 被请求网页的内容数据
						try {
							URL url=new URL(zz);
							try {
								URLConnection uc=url.openConnection();
								uc.setConnectTimeout(5000);
								uc.setReadTimeout(3000);
								int g=uc.getContentLength();
					
								InputStream is2=uc.getInputStream();
						
								OutputStream os=sc.getOutputStream();
								  os.write("HTTP/1.1 200 ok\r\n".getBytes());
                                                   
						        os.write("Server:java\r\n".getBytes());
						
					  	   os.write(("Content-Length:1000\r\n").getBytes());
						
							os.write(("Content-Language:en\r\n").getBytes());
							os.write("\r\n".getBytes() );
								
								  os.flush();
                                        System.out.println(zz);
                                                      
                            for(int c=0;c<g;c++) {
						    	os.write(is2.read());
						    
								
							   }
                              
								os.flush();		
								System.out.println(2);
							
								
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							
						} catch (MalformedURLException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
							
							
							
//3-----------------------------------------------------------------------------------------------------------
					
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			});
		}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		
	}
}

效果:
1b845ff65e5f48eb9996002651841cc9.png



版权声明:本文为m0_59802969原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。