HTTP协议是电脑与电脑之间通过网络传输的协议。所以为了更好的理解HTTP,我们就来模拟一个服务器,用浏览器发送请求,看看浏览器发来的消息是什么。
下面是一个模拟服务器的代码
package cn.hncu.dage.BS;
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 研究Http协议 (用来模仿服务器接收浏览器访问,看看浏览器发来什么请求信息)
* @author胡龙华
* @version 2017-4-10 下午2:31:27
* @fileName MyServer.java
*/
public class MyServer {
public static void main(String[] args) {
try {
ServerSocket s = new ServerSocket(8080);
Socket sk = s.accept();
System.out.println(sk.getInetAddress().getHostAddress()+"..connected!");
// 源: 网络
InputStream in = sk.getInputStream();
BufferedInputStream bin = new BufferedInputStream(in);
// 目的: 显示屏
byte [] buf = new byte [1024];
int len=0;
while( (len=bin.read(buf))!=-1){
String str = new String(buf);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
收到的信息如下
127.0.0.1..connected!(这个是我自己的消息)
GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, image/jxr, */*
Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393
Accept-Encoding: gzip, deflate
Host: 127.0.0.1:8080
Connection: Keep-Alive
请求行,包含: 请求方式(GET或POST) 空格 请求的资源路径 空格 http的协议版本
接下来是请求消息头(...)
空行
请求体(包括浏览器向服务器提交的表单数据等)
那么如何模拟服务器相应浏览器呢? 写一个Html文件发给浏览器就好了
新加代码
用PrintWriter的好处在于原样输出
//给浏览器发网页----通过s向客户端发网页内容
PrintWriter pw = new PrintWriter(sk.getOutputStream(),true);
pw.println("HTTP/1.1 200 OK");
pw.println("Content-Type: text/html;charset=UTF-8");
pw.println("");
pw.println("");
pw.println("");
pw.println("");
pw.println("欢迎光临城院Java社区
");
pw.println("");
pw.println("");
pw.println("");
pw.println("name");
pw.println(" ");
pw.println("");
pw.println("age");
pw.println(" ");
pw.println(" ");
pw.println("");
pw.println("");
pw.println("张三");
pw.println(" ");
pw.println("");
pw.println("20");
pw.println(" ");
pw.println(" ");
pw.println("
");
pw.println("");
pw.println("");
s.close();
接下来我们就模拟一个浏览器 来给服务器发送消息,看看服务器给我们什么应答消息
package cn.hncu.dage.BS;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 模拟浏览器,访问服务器,看看服务器给我们什么应答
* @author胡龙华
* @version 2017-4-10 下午3:19:40
* @fileName MyBrowse.java
*/
public class MyBrowse {
public static void main(String[] args) {
try {
Socket s = new Socket("www.hncu.net", 80);
//向服务器发出请求信息 按照前面浏览器给服务器发的格式
PrintWriter pw = new PrintWriter(s.getOutputStream(),true);
pw.println("GET / HTTP/1.1");//请求头
pw.println("Accept: */*");
pw.println("Host: www.hncu.net:80");
pw.println();//空行
//读取服务器应答消息
InputStream in = s.getInputStream();
byte [] buf = new byte[1024];
int len =0;
while( (len = in.read(buf))!=-1){
String str = new String(buf,0,len);
System.out.println(str);
}
s.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
应答消息
HTTP/1.1 200 OK
Date: Mon, 10 Apr 2017 07:46:25 GMT
Server: VWebServer
X-Frame-Options: SAMEORIGIN
Last-Modified: Mon, 10 Apr 2017 07:32:57 GMT
ETag: "649f-54ccafbe8dc40"
Accept-Ranges: bytes
Content-Length: 25759
Vary: User-Agent,Accept-Encoding
Cache-Control: max-age=600
Expires: Mon, 10 Apr 2017 07:56:25 GMT
Content-Type: text/html
Content-Language: zh-CN