由于互联网的存在,使得计算机之间的交互非常方便,提供服务的主机称为服务器,访问服务的主机称为客户端。现有的服务架构主要有C/S和B/S架构两种。Java主要用于B/S架构中的服务端开发,即编写提供服务的服务器端代码。前面几篇文章介绍了B/S架构中的浏览器前端的相关服务,前端主要是给用户提供交互界面,然后通过网络将交互信息传送给服务端,因此本篇文章讲解网络的通信原理。网络原理可参考后续的计算机网络部分,这里简单概述应用层的相关内容。
本文介绍B/S架构的通信原理。
1. 互联网通信
简单地说,互联网通信指的是两台计算机之间通过网络实现数据传输行为,这里的数据可以是文件,也可以是其他信息等等,这就是互联网通信。通信的两端称为客户端和服务端,广义上说,客户端主要是用来请求数据,服务端主要是用来提供数据。
计算机本身并不具备请求数据和提供数据的能力,它只提供了网络端口(类似于楼盘底层的商铺房),如果想要它提供某种服务(接收某种类型的数据请求,并提供某种对应的回应),就需要在端口上监听该类型的数据请求,并能够对此做出相应(不恰当的例子,比如该商铺房被某商家承包,用于出售煎饼果子);请求服务也类似,必须能够发送某种类型的请求,以及接受相应的服务。
计算机要想提供某种服务,就要安装对应的软件,该软件底层会监听端口并提供服务。这里安装的软件称为通信模型。通信模型主要有两种,就是前面提到的C/S和B/S模型。
C/S模型
C/S模型分为C和S两部分:
- C指的是client software,客户端软件。客户端软件专门安装在客户端计算机上,帮助客户端向指定服务端计算机发送请求,索要资源文件,帮助客户端计算机将服务端计算机发送过来的二进制数据解析为文字、数字、图片、视频、命令等等(网络传输数据只能先将数据转换成特定的格式,然后再转换回来)。
- S指的是server software,服务器软件。服务器软件专门安装在服务端计算机上,服务器软件(简称服务器)用于接收来自特定的客户端软件发送的请求。服务器软件在接收到请求之后自动的在服务端计算机上定位被访问的资源文件。服务器软件自动将定位到的资源文件解析成二进制数据,通过网络发送回发起请求的客户端软件上。
- 适用场景:C/S通信模型普遍用于个人娱乐市场,比如微信、淘宝、京东以及大型网络游戏等等。大型企业办公领域相对较少。
- 优点:
- 安全性较高,单独的软件,只接收合法(特定)的请求和响应。
- 降低服务器端计算机的工作压力。
- 缺点:
- 增加客户获得服务的成本,客户需要安装软件,时不时地更新软件。并且对CPU、内存和硬盘等硬件有要求。
- 更新较为繁琐。
B/S模型
B/S模型分为B和S两部分:
- B指的是browser ,浏览器。浏览器安装在客户端计算机软件,可以向任意的服务器发送请求,索要资源文件。可以将服务器所返回的二进制数据解析为文字、数字、图片、视频、命令等等(网络传输数据只能先将数据转换成特定的格式,然后再转换回来)。
- S指的是server software,服务器软件。服务器软件专门安装在服务端计算机上,可以接收任意浏览器发送请求,自动地在服务端计算机上定位被访问的资源文件,自动的将定位的资源文件内容以二进制的形式发送回发起请求的浏览器上。
- 适用场景:既适用于个人娱乐市场,又广泛适用于企业的日常活动中。
- 优点:
- 不会增加用户获得资源的成本,因为大部分内容都是服务端提供的服务,对客户端浏览器要求不高,只负责解析内容即可。
- 几乎不需要更新浏览器。
- 缺点:
- 几乎无法有效的对服务端计算机资源文件进行保护,不安全,因为服务器接收任何客户端发起的请求,并不是特定的请求。
- 服务端计算机的压力较大,一切内容都是服务器端形成,然后再传输,客户端浏览器的渲染较为有限。
- 可以看到,实际上B/S模型就是特殊的C/S模型,只不过这个B可以自定义服务器端的IP地址,对客户端的硬件要求不高,但是一定程度上客户的体验没有C/S好。
一个WEB系统大致的通信步骤如下所示:
- 用户输入网址URL;
- 域名解析器进行域名解析,获得IP地址;
- 浏览器软件在网络中搜索该IP地址的主机,直到找到这台主机;
- 找到这台主机后,根据URL中的端口定位到主机上的服务器软件;
- 服务器软件得知URL中想要的资源文件名;
- 服务器软件在自身主机中开始搜寻资源文件,然后将内容返回给浏览器;
- 浏览器接收到来自服务器的代码(HTML、CSS、JS等等);
- 浏览器进行编译渲染,执行代码,展示结果。
2. 共享资源文件
可以通过网络进行传输的文件都被称为共享资源文件。所有的文件内容都可以通过网络传输,所有文件都是共享资源文件。Http服务器对于共享资源文件分类(Http服务器见后续的文章介绍):
- 静态资源文件
- 动态资源文件
2.1 静态资源文件
如果文件内容是固定的,这种文件可以被称为静态资源文件。常见的有文档、照片、视频等等。
另外,如果文件存放的不是内容而是命令,这些命令只能在浏览器编译与执行,这种文件也可以被称为静态资源文件。常见的有静态.html
文件、.css
文件、.js
文件。即网页内容是写死在HTML文档中的。
2.2 动态资源文件
如果文件存放的命令,不能在浏览器编译与执行,只能在服务端计算机编译执行,这样的文件可以被称为动态资源文件。常见的有.class
文件。网页中的内容需要Java程序来进行控制,比如需要查询数据库,显示具体的呢日用,这种就是动态网页技术,动态网页技术并不是说页面中有flash动画,而是说页面中的数据是动态的,根据数据库中数据的变化而变化。
静态资源文件可以直接在URL中表示,即请求调用某个静态资源文件,那么动态资源文件(Java程序)怎么请求呢?路径该怎么写呢?
对于一个动态的Web应用来说,一个请求和响应的过程中有多少个角色参数,角色和角色之间有多少个协议?
- 有哪些角色?
- 浏览器软件的开发团队(谷歌、火狐)
- WEB Server的开发团队(Tomcat、JBoss、WebLogic)
- DB Server的开发团队(Oracle、MySQL)
- webapp的开发团队
- webapp就是网络项目,网络应用。为了方便地程序移植,即webapp的相关程序可以在任意一个WEB Server上应用,所以Java制定了一些规范,即制定了一些接口,使得WEB Server的厂商在开发服务器的时候遵守了这些规范(比如Servlet),那么我们只需要实现Java中的这些接口即可,而WEB服务器负责调用这些接口,给用户提供功能,程序就具有了可移植性。
- 角色和角色之间需要遵守哪些规范和协议?
- webapp的开发团队 和 WEB Server的开发团队 之间有一套规范:JavaEE规范之Servlet规范。
- Servlet规范的作用:WEB Server 和 webapp解耦合。属于JavaEE规范,所以在Java SE的帮助文档中没有该接口的信息。
javax.servlet
包下。
- Servlet规范的作用:WEB Server 和 webapp解耦合。属于JavaEE规范,所以在Java SE的帮助文档中没有该接口的信息。
- 浏览器的开发团队 和 WEB Server的开发团队 之间有一套传输协议:HTTP。
- webapp的开发团队 和 DB Server的开发团队 之间有一套 JDBC 规范。
- webapp的开发团队 和 WEB Server的开发团队 之间有一套规范:JavaEE规范之Servlet规范。
角色之间的通信以及关系如下所示,可以看到WEB Server其实和数据库服务器一样,为我们提供了某项功能,即接收网络数据包,返回给我们一些数据,那么如果我们想要获得这些信息,就需要调用相关的接口如Servlet、JSP等等:
2.3 服务器调用资源文件
前面提到过,在接收到客户端的请求后,服务端会定位到请求的资源文件,然后再将文件传输给客户端。静态和动态资源文件,二者在服务器端被操作的时候有区别。
- 静态文件被索要时,Http服务器直接通过输出流将静态文件中的内容或命令以二进制形式推送给发起请求的浏览器。
- 动态文件被索要时,因为只能在服务端编译执行,而浏览器端不会,所以只能是在服务端执行完毕后。所以当动态文件被索要时,Http服务器需要创建当前
.class
文件的实例对象,通过实例对象调用对应的方法处理用户请求,比如创建计算器对象,计算两数之和,只需要接收浏览器传过来的两个参数即可,然后计算完毕后通过输出流以二进制形式返回浏览器计算结果。 - 简单地说,如果浏览器能够处理文件,服务器则直接将文件全部返回给浏览器,如果不能处理,服务器则首先自己处理,然后将处理结果返回给浏览器。
3. 开发人员职责
注意,前面提到了,接收到浏览器的请求之后,Http服务器会自动调用静态或执行动态文件,那么开发人员需要做些什么呢?主要有以下职责:
控制浏览器行为。
- 控制浏览器发送的请求地址(即向哪个服务器发送请求,HTML的地址栏以及表单等等);
- 控制浏览器发送请求的方式(表单get、post等等);
- 控制浏览器发送请求时携带的参数(表单);
- 控制浏览器接收结果的行为;
- 控制浏览器采用对应的编译器将接收到的二进制数据解析为文件、视频、图片和命令;
- 控制浏览器将解析内容或命令进行执行与展示(全局刷新展示以及局部刷新展示AJAX);
- 控制用户与浏览器之间的交流(JS以及其升级版JQuery)
开发动态资源文件来解决用户请求。
至于服务器中的静态资源文件,文档图片以及视频等等这是特定生成的,
.html
文件、.css
文件、.js
文件则需要前端工程师来编写;而动态资源文件.class
文件则需要Java程序员来编写。
4. 备注
参考B站《动力节点》。