初始web编程之伪装Tomcat

时隔多月,终于又开始写博客,希望此次重启博客,能坚持每天学习编程,坚持用博客记录自己对编程的理解与不解,不断提高自我。同时也希望能坚持使用github,不闲置我的仓库。
最近在学习web,首先那“前端三把斧”:HTML、CSS、JavaScript可真是砍死我了。
我学习的教材是电子工业出版社的《Java Web开发就该这样学》,受益匪浅。
首先,我们平时经常使用的web:全球广域网,与之相关的概念有浏览器和服务器。使用Tomcat这个Java官方推荐的Web Server来学习,我在安装完Tomcat以后做的第一件事,是在Chrome浏览器中输入
http://localhost:8080,然后便在浏览器界面看到了Tomcat这只大猫咪,感到十分地神奇,粗略地了解了一下原理:
在Tomcat根目录下webapps文件夹主要是web项目的发布目录,其中有一个ROOT文件夹,如果你直接访问localhost:8080而没有项目名,Tomcat默认是从ROOT开始访问。
再有,以要看xxx.html为例,Web访问过程大致如下:
用户再浏览器上输入的网址URL对应一个IP地址(由DNS实现),服务器得到一个IP地址后,会创建Socket对象与用户连接上,服务器会运行程序,这个程序是服务器端的Socket应用,里面有ServerSocket,该程序会监听一个端口,约定的Web服务端口是80/服务器的程序接收到浏览器发出的请求,会用IO流到自己所管理的目录中找xxx.html文件,然后通过网络发给用户的浏览器,浏览器就得到了文件,按照html的规则显示出文件。
Tomcat所管理的目录,就是webapps目录。
其中ROOT是默认的根目录。
在这里插入图片描述

而Web访问流程,会涉及Socket套接字的概念,Socket即IP地址+端口,这也是我这学期学习网络基础课程时遇到的知识,对其梳理如下:
套接字是位于传输层与应用层之间的,当应用层通过传输层进行数据通信时,TCP和UDP可能会遇到同时为几个应用程序进程提供并发服务的问题。而多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据,为了区别不同的连接和进程,许多计算机操作系统为TCP/IP协议与应用程序交互提供了Socket套接字接口。
套接字可以看成两个程序在进行通信时的端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。再具体说来,Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host B,Host B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host B的Socket中,然后程序B才能在Socket中阅读这段信息。
那么,当用户启动浏览器,输入网址——如http://localhost:8080,有计算机IP和端口号,服务器程序就会获得一个服务器端的Socket,然后获取这个Socket的输入流。在这里运用JavaSE部分的ServerSocket、InputStream、BufferReader实现伪造Tomcat,了解Web访问流程。

要通过互联网进行通信,至少需要一对套接字,一个运行于客户机端,称之为ClientSocket,另一个运行于服务器端,称之为serverSocket。
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
1) 服务器监听
2)客户端请求
3)连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
/**TCP 网络程序是指利用 Socket 编写的通信程序。*/
/**利用 TCP 协议进行通信的两个应用程序是有主次之分的,一个是服务器程序,一个是客户端程序,两者的功能和编写方法不太一样。*/
public class MyTomcat1 {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(8080);/**其中 ServerSocket 类表示 Socket 服务器端。ServerSocket(int port):创建绑定到特定端口的服务器套接字。*/
        System.out.println("Server startup in 1428ms");/**Socket 类表示 Socket 客户端*/
        Socket s = ss.accept();/**服务器调用 accept() 方法等待客户端来连接*/


        InputStream is = s.getInputStream();
/**Socket两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。
 getInputStream方法可以得到一个输入流,即从服务器端发回的数据流。
 GetOutputStream方法得到一个输出流,即将要发送到服务器端的数据流.
 其实是一个缓冲区,暂时存储将要发送过去的数据。*/

        InputStreamReader isr = new InputStreamReader(is);

        BufferedReader br = new BufferedReader(isr);

        System.out.println(br.readLine());
        /** BufferedReader从一个输入的字符流中读取文本,为字符、数组、一行文本的高效读取提供字符缓冲功能。
         BufferedReader的read()方法,功能:读取单个字符的个数。readLine()方法功能:读取一个文本行。*/
    }}




        /** 服务器套接字一次可以与一个套接字连接。
         如果多台客户端同时提出连接请求,服务器套接字会将请求连接的客户端存入队列中,然后从中取出一个套接字与服务器新建的套接字连接起来。
         若请求连接大于最大容纳数,则多出的连接请求被拒绝。
         默认的队列大小是 50。*/





//服务器端创建一个 ServerSocket(服务器端套接字)。
//客户端程序创建一个 Socket,请求与服务器建立连接。
//服务器接收客户的连接请求,同时创建一个新的 Socket 与客户建立连接,服务器继续等待新的请求。











真正的Tomcat会做什么事情呢?Tomcat会监听8080端口,当用户启动浏览器,输入网址访问计算机和定义好的端口8080时,程序会获得一个服务器端的Socket,然后获取这个Socket的输入流,这样就可以通过输入流接收用户浏览器发送过来的信息。

当在浏览器输入,再按刷新按钮:
在这里插入图片描述
此时IDEA的控制台输出为
在这里插入图片描述
/ohh即请求。(教材中举例为/aaa.html)。
添加若干行System.out.println(br.readLine());代码,按行再读入更多信息后,控制台输出为:

在这里插入图片描述
可看出:

GET是用户在浏览器的地址栏中以输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源。(服务器会到自己管理的目录中查找文件,如html文件)。GET是http1.1常用的请求方式。

HTTP/1.1是http协议的一个标准,并且支持持久连接(HTTP/1.1的默认模式使用带流水线的持久连接),在一个TCP连接上可以传送多个HTTP请求和响应

Host: 127.0.0.1:8080是告诉Tomcat用户要访问的IP地址和端口号。

Connection: keep-alive是Tomcat和浏览器之间的连接模式。即在一次TCP连接中可以持续发送多份数据而不会断开连接。通过使用keep-alive机制,可以减少tcp连接建立次数,也意味着可以减少TIME_WAIT状态连接,以此提高性能和提高httpd服务器的吞吐率。

Cache-Control: max-age=0:向server 发送http 请求确认 ,该资源是否有修改。有的话返回200 ,无的话 返回304。

Upgrade-Insecure-Requests: 1。

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36:告诉Tomcat浏览器是什么,操作系统是什么,支持的其他技术框架是什么。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3

Accept-Encoding: gzip, deflate, br:可以在服务器上将网页文件压缩了再传送,提高网页打开的效率。浏览器告诉Tomcat它能够打开gzip格式的压缩文件,即用户计算机有解压缩的能力。

Accept-Language: zh-CN,zh;q=0.9 客户计算机的操作系统是中文的。不同国家的人能够得到不同语言的网页,靠的就是浏览器提供给服务器的这个信息。

Cookie: JSESSIONID=276A788B58D57C0EE53E1F5018A25B5A

发布了47 篇原创文章 · 获赞 1 · 访问量 1299

猜你喜欢

转载自blog.csdn.net/weixin_41750142/article/details/94356651