深入 理解Http协议、什么是B/S模式学习

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(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println(""); pw.println("
"); pw.println("name"); pw.println(""); pw.println("age"); pw.println("
"); pw.println("张三"); pw.println(""); pw.println("20"); 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

你可能感兴趣的:(java技术)