Bootstrap

Tomcat服务器、HTTP协议


一、JavaWeb基础

1.1 概念

JavaWeb: 使用Java语言开发基于互联网的项目
Web是一种分布式的运用框架。

1.2 软件架构

1.2.1 C/S架构

C/S:Client / Server,客户端 / 服务器端。

  • 在用户本地有一个客户端程序,在远程有一个服务器端程序
  • 优点

    用户体验好

  • 缺点

    开发、安装、部署、维护麻烦

1.2.2 B/S架构

B/S:Browser/Server,浏览器/服务器端。

  • 只需要一个浏览器,用户通过不同的网址(URL),客户访问不同的浏览器端程序。
  • 优点

    开发、安装,部署,维护 简单

  • 缺点

    如果应用过大,用户的体验可能会受到影响
    对硬件要求过高

1.3 网页资源分类

1.3.1 静态资源

使用静态网页开发技术开发的资源

  • 特点

    1.所有用户访问,得到的结果是一样的。
    2.静态资源,如:文本,图片,音频、视频, HTML,CSS,JavaScript
    3.如果用户请求的是静态资源,那么服务器会直接将静态资源发送给浏览器。浏览器中内置了静态资源的解析引擎,可以展示静态资源。

  • HTML:用于搭建基础网页,展示页面的内容
  • CSS:用于美化页面,布局页面
  • JavaScript:控制页面的元素,让页面有一些动态的效果

1.3.2 动态资源

使用动态网页技术发布的资源。

  • 特点

    1.所有用户访问,得到的结果可能不一样。
    2.动态资源,如:jsp/servlet,php,asp…
    3.如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,再发送给浏览器。

  • 注意

    • 浏览器只能解析静态资源(浏览器中内置有解析引擎)。
    • 欲学习动态资源,必须先学习静态资源!

1.4 浏览器内核

浏览器内核原名叫渲染引擎,用于根据指定的标准解析网页结构,将结构的文本、图片、链接、音频、视频等内容渲染到页面中。

浏览器名称渲染引擎
Chrome/SafariWebKit
FirfoxGecko
IETrident
OperaPresto(最新的是Blink)

1.5 网络通信三要素

  • IP:电子设备(计算机)在网络中的唯一标识。
  • 端口:应用程序在计算机中的唯一标识。 0~65536
  • 协议:规定了数据传输的规则
    • 基础协议:
      • TCP:传输控制协议。是通过三次握手后建立连接之后,在安全的连接中无需考虑大小,数据以IO流的形式进行传输; 速度稍慢,但保证了数据的准确性,属于安全协议,主要用于安全通信与数据的安全传输,数据的上传。
      • UDP:数据报协议。无需连接,将数据分成等大的数据块直接进行数据传输,因为如果数据过大,数据包增大,丢失的概率也增大,在传输过程中容易造成数据的丢失,属于不安全协议。由于UDP的传输速度快 ,主要用于数据的发送,适用于直播,视频。

1.6 服务器

  • 服务器:安装了服务器软件的计算机
  • 服务器软件:接收用户的请求,处理请求,做出响应
  • web服务器软件:接收用户的请求,处理请求,做出响应。
    • 在Web服务器软件中,可以部署Web项目,让用户通过浏览器来访问这些项目
    • Web容器
  • 常见的java相关的web服务器软件:
    • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    • JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范(如:Servlet/JSP…)。开源的,免费的。

JavaEE:Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范。

  • TCP进行数据发送、接收的基础代码
//客户端socket
public class ClientSocket {
	public static void main(String[] args) throws Exception {
		//创建客户端服务指定连接ip与端口
		Socket s = new Socket("192.168.0.101", 8888);
		//获取输出流对象
		OutputStream os = s.getOutputStream();
		//使用输出流对象将数据发送至服务器端
		os.write("abcdefg".getBytes());
		os.flush();
		//关闭客户端服务
		s.close();
	}
}
//服务器端Socket
public class ServiceSocket {
	public static void main(String[] args) throws Exception {
		 ServerSocket ss=new ServerSocket(8888);
		 //通过阻塞方法获取连接的客户端对象
		 Socket s = ss.accept();
		 //获取输入流
		 InputStream is = s.getInputStream();
		 byte [] b=new byte[1024];
		 int len =0;
		 //读取客户端发送信息并打印
		 while((len=is.read(b))!=-1){
			 System.out.println(new String(b,0,len));
		 }
		 s.close();
		 ss.close();  
	}
}

二、Tomcat服务器

2.1 Tomcat下载

在这里插入图片描述

  • 点击Download,选择Tomcat 8,往下滑,找到需要的版本,我选择的是Tomcat 8.5.69 的64-bit Windows zip。
    在这里插入图片描述在这里插入图片描述

2.2 Tomcat安装与卸载

安装版: 下载安装包根据提示输入参数进行安装

  • 一般用于Windows系统的安装,根据提示以及电脑的环境进行相应功能的安装

免安装版: 解压安装(常用)

  • 直接解压就可以使用(需要java运行环境),直接将功能解压使用
  • 解压压缩包即可

    注意:安装目录建议不要有中文和空格

  • 启动

    双击startup.bat(在安装目录下的bin目录)

    • 访问测试(访问自己):在浏览器输入http://localhost:8080 或者 127.0.0.1:8080(startuo.bat启动窗口不要关)
    • 访问他人http://别人的ip:8080
      在这里插入图片描述
  • 安装过程中常见问题

    1、黑窗口一闪而过?

    • 原因:Java环境变量设置有问题,没有正确配置JAVA_HOME环境变量
    • 解决方案:正确配置JAVA_HOME环境变量

    2、端口占用的问题?

    • ①杀死现有的程序

      • 打开命令行窗口,查看占用8080端口号的PID
        netstat -ano查看端口DOM命令
      • 打开任务管理器,根据PID在详细信息栏找到现有的程序,右键-结束程序。
    • ②杀死该进程

      • taskkill -pid 进程号
    • ③修改Tomcat的端口号

      • 修改 conf/server.xml 文件
        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />通过设置port为默认端口号
    • 一般会将Tomcat的默认端口号修改为80。80端口号是HTTP协议的默认端口号。
      • 好处:在访问时,就不用输入端口号
  • 关闭

    1、正常关闭

    • 双击 shutdown.bat(在安装目录下的bin目录)
    • Ctrl + C(在startuo.bat启动窗口中按Ctrl + C)

    2、 强制关闭

    • 点击启动窗口的×
  • 卸载

    把解压后的目录直接删除即可

  • 安装目录介绍

    • bin
      • 存放启动和开启Tomcat的脚本文件
      • 解压版会拥有相同的bat以及sh启动关闭脚本,这两个分别就是window系统以及linux中使用的脚本,解压版不知道运行环境是什么所以将脚本全部解压,安装版则根据安装环境进行对应脚本的复制
      • 注意:在关闭时尽量使用shutdown.bat进行关闭(之后由开发工具管理)
    • conf
      • Tomcat服务器的配置文件
      • server.xml配置服务启动时需要的参数(端口号)
      • web.xml配置服务器相关参数(会话超时时间)
    • lib
      • Tomcat服务器运行需要的jar文件
    • logs
      • Tomcat服务器运行产生的日志文件
      • 可以通过conf下的logging.properties进行日志配置(如果出现乱码说明日志编码与系统不符) java.util.logging.ConsoleHandler.encoding = GBK
    • temp
      • 运行时产生的临时文件
    • webapps
      • 存放的都是部署的项目
      • 可以将书写的代码存储,在运行过程中就可以直接进行访问
    • work
      • JSP和Session运行过程中产生的文件
      • 运行过程中编译的代码文件

2.3 Eclipse与Tomcat的结合配置

2.3.1 配置Tomcat安装目录

  • Windows—>Preperences—>Server—>Runtime Environment—>add—>选择版本—>配置tomcat安装目录---->选择运行jre版本—>Finish

  • 展示server窗口

    • Windows—>show view—>Servers–>添加Tomcat
    • 修改tomcat的部署目录

2.3.2 项目部署

  • 部署项目的方式

1、直接将项目放到webapps目录下即可

  • /hello:项目的访问路径–>虚拟目录
  • 简化部署:将项目打成一个war包,再将war包放置到webapps目录下。
    • war包会自动解压缩

2、配置conf/server.xml文件
<Host>标签体中配置 <Context docBase="D:\hello" path="/hehe" />

  • docBase:项目存放的路径
  • path:虚拟目录
  • 浏览器访问:localhost:8080/hehe/hello

3、在conf\Catalina\localhost创建任意名称的xml文件
在文件中编写<Context docBase="D:\hello" />

  • 虚拟目录:xml文件的名称
  • 浏览器访问:localhost:8080/xml文件名/hello
  • 动态项目和静态项目的目录结构:
-- 动态web项目目录介绍
  -- 项目名
    -- 静态资源(HTML,CSS,JAVASCRIPT)
    -- WEB-INF(必须有)
      -- classes:java文件编译生成的字节码文件
      -- lib:项目运行需要的jar文件
      -- web.xml:核心配置文件
-- 静态WEB项目结构
  -- 项目名(文件夹)
    -- 静态资源
  • Web工程目录讲解
    • src: 所有Java代码的根目录,可以直接创建包书写Java代码
    • WebContent: 静态资源的根目录,保存在该文件夹下的静态资源可以直接访问
      • 经常用于保存MVC设计模式中的View层
    • WEB-INF: 存放配置与项目运行资源(受保护 不允许直接访问)
    • lib: 与Java项目不同,web项目是在运行时使用jar包,所以提供了存放jar包的文件夹,在执行项目时会自动将对应的jar文件加入项目运行,只需要将对应的jar包粘贴进入即可,会自动进行导入操作
    • web.xml: 用于配置当前项目运行相关信息(项目运行的欢迎界面 以及服务配置)
      • 当请求服务对应项目时 自动展示的页面

在这里插入图片描述

2.4 IDEA与Tomcat的相关配置

1、IDEA会为每一个Tomcat部署的项目单独建立一份配置文件

  • 查看控制台的log:Using CATALINA_BASE: "C:\Users\fqy\.IntelliJIdea2018.1\system\tomcat\_itcast"

2、工作空间项目 和 Tomcat部署的Web项目

  • Tomcat真正访问的是“Tomcat部署的Web项目”,“Tomcat部署的Web项目"对应着"工作空间项目” 的web目录下的所有资源
  • WEB-INF目录下的资源不能被浏览器直接访问。

3、断点调试:使用"小虫子"启动 dubug 启动

三、HTTP协议

3.1 概述

  • 概念

    HTTP:超文本传输协议(Hyper Text Transform protocol),定义了客户端和服务器端通信时,发送数据的格式

    • 应用层协议
  • 作用

    • 实现客户端与服务器端的数据传输
  • 协议目的

    • 就是为了请求和响应的时候有固定的格式。
  • 特点

    • 支持TCP / IP的高级协议。
    • 默认端口号为:80
    • 基于请求/响应模型的:一次请求对应一次响应。
    • 支持客户机/服务器(B / S)模式。
    • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
    • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决这个问题, Web程序引入了Cookie机制来维护状态

3.2 请求报文格式

一个HTTP请求报文由 请求行(request line)、请求头部(header)、空行请求数据 4个部分组成。

在这里插入图片描述

<request-line> 请求行

<headers> 请求头部

<blank line> 空行

[<request-body>] 请求数据
		//请求字符串格式
		POST /login.html	HTTP/1.1
		Host: localhost
		User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
		Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
		Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
		Accept-Encoding: gzip, deflate
		Referer: http://localhost/login.html
		Connection: keep-alive
		Upgrade-Insecure-Requests: 1
		
		username=zhangsan
  • 请求行

    请求行由请求方法字段URL字段HTTP协议版本字段3个字段组成,它们用空格分隔。如:GET /index.html HTTP/1.1

    1、提交方式
    HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。

    • get:将提交的参数拼接显示在请求行中,在URL地址栏后,不安全,传递的URL长度有限制
    • post:提交的参数封装在请求体内,比较安全,支持大数据传输(文件,图片)

    2、提交的路径
    3、协议版本

    • 1.0:发送一次请求,产生一次响应,连接断开,每一次请求响应都会建立新的连接
    • 1.1:发送一次请求,产生一次响应,连接并不会马上断开,会复用连接,如果一段时间没有请求,连接自动断开。
  • 请求头

    请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。
    请求头名称: 请求头值

    • Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。Host: localhost
    • user-agent:获取浏览器的版本信息。
      • 可以在服务器端获取该头的信息,解决浏览器的兼容性问题。
    • referer:获取网页的来源。Referer: http://localhost/login.html
      • 作用:防盗链、统计工作。
  • 空行

    最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
    空行,就是用于分割POST请求的请求头,和请求体的。

  • 请求体

    封装POST请求信息的请求参数。 请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

  • 使用Socket请求百度获取百度响应信息
//客户端Socket
public class ClientSocket {
	public static void main(String[] args) throws Exception {
		// 创建客户端服务指定连接IP与端口
		Socket s = new Socket("www.baidu.com", 80);
		// 获取输出流对象
		OutputStream os = s.getOutputStream();
		InputStream is = s.getInputStream();

		// 使用输出流对象将数据发送至服务器端
		os.write("GET / HTTP/1.1\n".getBytes());
		os.write("\r\n".getBytes());
		os.flush();
		
		
		byte[] b=new byte[1024];
		int len=0;
		while((len=is.read(b))!=-1){
			System.out.println(new String(b,0,len));
		}
		// 关闭客户端服务
		s.close();
	}
}
  • 百度响应信息
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 14615
Content-Type: text/html
Date: Mon, 09 Aug 2021 02:53:28 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=2891F7401E9F30AC9014BC5F4CF3FE8E:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=2891F7401E9F30AC9014BC5F4CF3FE8E; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1628477608; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=2891F7401E9F30ACD654ACBAE3F7E218:FG=1; max-age=31536000; expires=Tue, 09-Aug-22 02:53:28 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 162847760828380290667205192330022957930
Vary: Accept-Encoding
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1

<!DOCTYPE html><!--STATUS OK-->
<html>
.....
</html>

3.3 响应报文格式

HTTP响应也由四个部分组成,分别是:响应行响应头空行响应体

<response-line> 响应行

<headers> 响应头

<blank line> 空行

[<response-body>] 响应体
		//响应字符串格式
		HTTP/1.1 200 OK
		Content-Type: text/html;charset=UTF-8
		Content-Length: 101
		Date: Wed, 06 Jun 2018 07:08:42 GMT

		<html>
		  <head>
		    <title>$Title$</title>
		  </head>
		  <body>
		  hello , response
		  </body>
		</html>
  • 响应行

    响应行格式如下:
    组成HTTP-Version Status-Code Reason-Phrase CRLF

    • HTTP-Version:表示服务器HTTP协议的版本;协议/版本。
    • Status-Code:表示服务器发回的响应状态代码;响应状态码。
    • Reason-Phrase:表示状态代码的文本描述;状态码描述。

    协议版本
    状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
    状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

    • 1xx:指示信息–表示请求已接收,继续处理。
    • 2xx:成功–表示请求已被成功接收、理解、接受。
    • 3xx:重定向–要完成请求必须进行更进一步的操作。
    • 4xx:客户端错误–请求有语法错误或请求无法实现。
    • 5xx:服务器端错误–服务器未能实现合法的请求。

    常见状态代码、状态描述的说明如下:

    • 100 Continue:初始的请求已经接受,客户应当继续发送请求的其余部分。
    • 101 Switching Protocols:服务器将遵从客户的请求转换到另外一种协议。
    • 200 OK:客户端请求成功。
    • 201 created:成功创建。
    • 302 Found:重定向,新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
    • 304 Not Modified:代表上次的文档已经被缓存了, 还可以继续使用。
    • 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
    • 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
    • 403 Forbidden:服务器收到请求,但是拒绝提供服务。
    • 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
    • 405 method not allowed:该HTTP方法不被允许。
    • 410 gone - 这个URL对应的资源现在不可用。
    • 415 unsupported media type:请求类型错误。
    • 422 unprocessable entity:校验错误时用。
    • 429 too many request:请求过多。
    • 500 Internal Server Error:服务器发生不可预期的错误。
    • 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常
  • 响应头

    refresh:页面定时刷新
    location:重定向页面(与302状态码结合使用)
    格式头名称: 值
    常见的响应头:

    • Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
    • Content-disposition:服务器告诉客户端以什么格式打开响应体数据
      • 值:
        • in-line:默认值,在当前页面内打开
        • attachment;filename=xxx:以附件形式打开响应体。文件下载
  • 空行

    最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头。

  • 响应体

    传输的数据

  • 使用TCP模拟处理HTTP请求与响应
//使用TCP处理HTTP请求并响应数据
public class TcpResponse {
	// 使用TCP socket介绍浏览器发生的HTTP请求 并解析请求中的数据
	// 根据HTTP响应的语法 将数据发送至浏览器显示
	// 客户端在浏览器输入网址 输入请求数据
	// localhost:8888/login?username=zhangsan&password=123456
	// 根据输入的数据判断账号密码 返回 登录成功 或 登录失败
	public static void main(String[] args) throws Exception {
		// 创建Sokect服务器监听指定端口
		ServerSocket ss = new ServerSocket(8888);
		while (true) {
			// 获取客户端连接对象
			Socket s = ss.accept();
			// 获取输入流 读取客户端发送的请求信息
			// 使用转换流与高效流读取
			InputStream is = s.getInputStream();
			// 使用转换流将字节流换行为字符流
			InputStreamReader isr = new InputStreamReader(is);
			// 创建字符高效流
			BufferedReader br = new BufferedReader(isr);
			// 如果使用while可能导致一直读取
			// 在获取请求信息时 实际基本只有第一行数据有用 所以获取第一行数据即可
			String readLine = br.readLine();
			// 解析请求数据获取请求信息
			// 使用空格获取中间数据
			String[] split = readLine.split(" ");
			System.out.println(split[1]);
			String data = split[1];
			// 判断是否包含? 判断请求格式是否符合标准
			String msg = "";
			if (data.contains("?")) {
				// 继续截取
				String[] dataArr = data.split("\\?");
				System.out.println("请求的服务地址为:" + dataArr[0]);
				HashMap<String, String> parseSring = parseSring(dataArr[1]);
				System.out.println("请求的数据为:" + parseSring);
				if(dataArr[0].equals("/login")){
					if(parseSring.get("username").equals("zhangsan")&&parseSring.get("password").equals("123456")){
						msg="登录成功";
					}else{
						msg="登录失败";
					}
				}else{
					msg="无法处理该请求";
				}
			} else {
				msg = "请输入正确的请求格式";
			}
			// 获取输出流
			OutputStream os = s.getOutputStream();
			// 根据HTTP响应格式 响应客户端的请求
			os.write("HTTP/1.1 200 OK\n".getBytes());
			// 设置页面解析数据的编码格式
			os.write("Content-Type: text/html ;charset=utf-8\n".getBytes());
			os.write("\r\n".getBytes());
			os.write(msg.getBytes());
			os.flush();
			os.close();
			// 关闭流
			br.close();
			s.close();
		}
		// ss.close();
	}
	
	//将参数字符串转换为map集合
	public static HashMap<String, String> parseSring(String str){
		HashMap<String, String> values=new HashMap<>();
		String[] split = str.split("&");
		for (String string : split) {
			String[] split2 = string.split("=");
			values.put(split2[0],split2[1]);
		}
		return values;
	}
}
  • 注意:

    1、使用TCP协议处理HTTP请求时 本质还是通过IO流进行数据的发送与返回。
    2、因为HTTP协议在1.1之后一次连接可以多次请求(长连接),所以不能使用while读取,否则会一直进行读取操作(等待客户端发送信息),不会继续进行,所以一般只读取首行即可。
    3、书写服务器接收数据后必须书写响应数据(按照HTTP协议响应的格式),否则浏览器会一直等待,直至超时,显示请求失败(因为没有接收到服务器的响应信息,默认理解为服务器找不到)。
    4、如果返回的数据存在中午,那么可能出现乱码,可以在相应的字符串中添加对应的编码集。
    os.write("Content-Type: text/html ;charset=utf-8\n".getBytes());

  • 使用TCP处理请求并返回响应的页面

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

//使用TCP处理HTTP请求并响应数据
public class TcpResponseHtml {
	// 使用TCP Socket介绍浏览器发生的HTTP请求 并解析请求中的数据
	// 根据HTTP响应的语法 将数据发送至浏览器显示
	// 客户端在浏览器输入网址 输入请求数据
	// localhost:8888/login?username=zhangsan&password=123456
	// 根据输入的数据判断账号密码 返回 登录成功 或 登录失败
	public static void main(String[] args) throws Exception {
		// 创建Sokect服务器监听指定端口
		ServerSocket ss = new ServerSocket(8888);
		while (true) {
			// 获取客户端连接对象
			Socket s = ss.accept();
			// 获取输入流 读取客户端发送的请求信息
			// 使用转换流与高效流读取
			InputStream is = s.getInputStream();
			// 使用转换流将字节流换行为字符流
			InputStreamReader isr = new InputStreamReader(is);
			// 创建字符高效流
			BufferedReader br = new BufferedReader(isr);
			// 如果使用while可能导致一直读取
			// 在获取请求信息时 实际基本只有第一行数据有用 所以获取第一行数据即可
			String readLine = br.readLine();
			String[] split = readLine.split(" ");
			String data = split[1];

			// 获取输出流
			OutputStream os = s.getOutputStream();
			// 根据HTTP响应格式 响应客户端的请求
			os.write("HTTP/1.1 200 OK\n".getBytes());
			// 设置页面解析数据的编码格式
			os.write("Content-Type: text/html ;charset=utf-8\n".getBytes());
			os.write("\r\n".getBytes());

			// 创建返回页面的文件对象
			File path = new File("D:/eclipse/work/Day0809/src/com/yunhe/tcpTOhttp");
			File f = new File(path, data);
			// 读取文件将文件写入响应中
			try {
				FileInputStream fis = new FileInputStream(f);
				byte b[] = new byte[1024];
				int len = 0;
				while ((len = fis.read(b)) != -1) {
					os.write(b, 0, len);
				}
				fis.close();
			} catch (FileNotFoundException e) {
				System.out.println(data+"文件不存在");
			}

			os.flush();
			os.close();
			// 关闭流
			br.close();
			s.close();
		}
	}
}
  • HTTP协议与TCP协议的区别:

    1.使用位置不同

    • HTTP是应用层协议,TCP是传输层协议(TCP更底层)
    • HTTP针对于万维网数据请求与响应,TCP就是直连数据传输

    2.连接方式不同

    • HTTP基于请求与响应进行连接
    • TCP经过三次握手建立连接

    3.同一个连接中数据交互次数不同

    • HTTP请求一次建立一次连接(1.0),在1.1之后可以多次 但是一定时间没有请求则断开
    • TCP可以在连接期间无限制的进行数据的交互,直至主动断开

    4.数据交互方式不同

    • HTTP在连接时会将数据书写在请求中,服务器通过解析请求获取数据
    • TCP在建立连接后直接进行数据的交互
  • get请求与post请求区别:

    • get请求发送数据在url地址栏传输,post请求在请求体中传输。
    • get请求相比post不安全。
    • get请求可以被书签保存,但是post不可以(因为书签保存的是url可以保存请求的数据)。
    • get请求在浏览器页面后退时无影响,post可能导致表单的重复提交。
    • get请求浏览器会主动缓存相应的数据,post不会主动缓存。
    • get请求根据不同浏览器设置请求数据上限不定(一般为2k),post请求可以看做无大小限制。
    • get请求发送1次,post请求发送2次(请求会将数据同url一同发送,post则是请求地址响应后再次发送)。

每日一点点进步
不进则退

;