【JAVA网络流之浏览器与服务器模拟】
一、模拟服务器获取浏览器请求http信息
代码:
1 package p06.TCPTransferImitateServer.p01.ImitateServer; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.PrintWriter; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 /** 9 * 该类模拟服务器,浏览器通过输入http://localhost:9988访问。 10 * @author kuangdaoyizhimei 11 * 12 */ 13 public class ImitateServerDemo { 14 public static void main(String[] args) throws IOException { 15 ServerSocket ss=new ServerSocket(9988); 16 Socket socket=ss.accept(); 17 InputStream is=socket.getInputStream(); 18 byte buf[]=new byte[10240]; 19 int length=is.read(buf); 20 System.out.println(new String(buf,0,length)); 21 PrintWriter pw=new PrintWriter(socket.getOutputStream(),true); 22 pw.println("我是狂盗一枝梅!"); 23 24 socket.shutdownOutput(); 25 socket.close(); 26 ss.close(); 27 } 28 }
运行结果:
1.服务端(得到浏览器请求信息):
2.浏览器端(显示服务端响应的内容):
二、模拟浏览器向服务器发出请求并获取服务器的响应内容。
这里使用的服务器软件:apache
代码:
1 package p07.TCPTransferImitateBrowser.p01.ImitateBrowser; 2 3 /** 4 * 该类的作用是模拟浏览器向服务器请求一个页面,并将html代码显示出来 5 * 请求信息从之前获取的浏览器请求得到 6 */ 7 import java.io.BufferedReader; 8 import java.io.IOException; 9 import java.io.InputStream; 10 import java.io.InputStreamReader; 11 import java.io.OutputStream; 12 import java.io.PrintWriter; 13 import java.net.Socket; 14 import java.net.UnknownHostException; 15 16 17 public class ImitateBrowser { 18 public static void main(String[] args) throws UnknownHostException, IOException { 19 Socket socket=new Socket("192.168.209.1",80); 20 InputStream is=socket.getInputStream(); 21 OutputStream os=socket.getOutputStream(); 22 PrintWriter pw=new PrintWriter(os,true); 23 pw.println("GET /myWeb/index.html HTTP/1.1"); 24 pw.println("Host: localhost"); 25 pw.println("Connection: close");//这里写close 26 pw.println("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 27 pw.println("User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.103 Safari/537.36"); 28 pw.println("Accept-Encoding: gzip,deflate,sdch"); 29 pw.println("Accept-Language: zh-CN,zh;q=0.8,en;q=0.6"); 30 pw.println(); 31 pw.println(); 32 pw.flush(); 33 BufferedReader br=new BufferedReader(new InputStreamReader(is)); 34 String str=null; 35 System.out.println("响应内容:"); 36 while((str=br.readLine())!=null) 37 { 38 System.out.println(str); 39 } 40 br.close(); 41 socket.close(); 42 } 43 }
运行结果:
三、注意事项
两个程序中的请求行和请求实体之间必须有一行空行,否则请求失败,这里使用pw.println();实现空行