Day1 HTTP协议

 网址

  • 客户端:实际指运行在本电脑的程序(浏览器应用程序)
  • 服务端:实际服务器的Web程序

网址的实现(IP)

        如何实现客户端和服务端之间的链接?满足request和response要求?实现二者的精确查找?

  1. 定位机器 --> 凭借网卡区分机器 --> 每个网卡有一个独特编号 --> 类似IP地址
  2. 定位机器程序 --> 通过端口区分程序 --> 每个程序运行时占用一个端口(端口约6w个,有的程序占用一个固定端口,有的程序无所谓端口号)
  3. 定位程序资源 --> url(统一资源定位符) --> 字符串网址,类似文本路径。

汇总:

        网址 =  协议名称://IP:端口号/uri

例如 百度网址:  http://202.108.22.5:80/index.html

域名网址

        IP数值记不住,所以实际生活中没人用IP搜索网址,改用域名搜索

即: 网址 =  协议名称://域名:端口号/uri

例如 百度网址:   http://baidu.com:80/index.html

域名网址的搜索过程

默认数据 

  1. 默认端口 

    http:80                  ftp:21              https:443

  2. 默认统一资源定位器url:index.html

模拟服务端接收客户端请求

模拟过程

  1. 定义一个ServerSocket类变量,准备接收浏览器传来的请求
  2. 接收请求
  3. 将接受的请求输出

代码实现

import java.io.*; //流
import java.net.*; //网络

public class HttpServer {
    public static void main(String[] args) throws Exception { // 处理ServerSocket定义的异常请求
        // ServerSocket在java.net里定义过的,需传参的函数,一个整数,表示你要占用的端口
        ServerSocket ss = new ServerSocket(10051); // 10051是瞎蒙的,他也不知道哪个端口被占用
        Socket s = ss.accept();
        InputStream in = s.getInputStream();
        int r;
        while ((r = in.read()) != -1) {
            System.out.print((char) r);
        }
        s.close();
    }
}

代码运行过程

  1. 运行代码
  2. 保持代码运行状态,在浏览器中输入地址,向程序发送请求,例如:http://127.0.0.1:10054/index.html
  3. 继续运行查看结果,对比http协议请求格式

运行结果截图

请求格式说明

模拟客户端接收服务端响应

模拟过程

  1. 创建一个客户端(请求访问的地址,地址端口号)
  2. 传入标准请求协议,等待服务端进行响应
  3. 接收服务端响应并输出

代码模拟

import java.net.*;
import java.io.*;
public class HttpClient {
    public static void main(String[] args)throws Exception{  //异常处理
        Socket s = new Socket("www.baidu.com",80); //地址/域名(注意字符),端口
        OutputStream out = s.getOutputStream();
        Writer writer = new OutputStreamWriter(out); //将字节流转换成字符流
        PrintWriter pw = new PrintWriter(writer);  //将字符流转换成打印流
        //开始一行行打印
        pw.println("GET /index.html HTTP/1.1");//协议第一行
        pw.println("Host: www.baidu.com");
        pw.println(""); //空行不能少
        pw.flush(); //不管写了多少,都要将缓冲区释放,不然有可能有部分数据会丢失
        //开始接受响应
        InputStream in = s.getInputStream(); // 得转为字符流,不然接收汉字会显示?? 因为汉字占两个字节
        InputStreamReader reader = new InputStreamReader(in,"UTF-8"); //转utf-8,不然可能会中文乱码
        int r;
        while ((r = reader.read()) != -1) {
            System.out.print((char) r);
        }
        s.close();
    }
}

运行代码截图:

响应格式说明:

今日作业

  1. 复习http协议
  2. 学习html语言至表单 https://www.w3school.com.cn/html/index.asp

Java学习要求

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值