WebServer 软件原理简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nvd11/article/details/42980247


一. B/S结构  和 C/S结构简介

1.1 C/S结构

所谓C/S 就是 Client - Server ,

在Client端有个界面程序.   User会通过这个Client端程序来读写  存放在Server端的数据.


我们常用的需要联网桌面程序例如 邮件客户端ThurderBird,  聊天工具Pidgin都是C/S结构的.


1.2 B/S结构

而B/S 结构 就是Browser - Server

User只需要通过浏览器就能读写 存放在Server端的的数据.


B/S结构无需在终端机器安装Client程序, 只需要1个浏览器.

网上很多网站, 例如论坛,  网页邮件客户端这些就是B/S结构的程序.



二, 什么是WebServer 和  WebServer软件

所谓webserver 就是 B/S结构的server.


而C/S 结构的Server作用跟webserver类似, 但是一般叫webserver.

所以本文是针对B/S机构来讲的.


所谓webserver软件就是能令1个Webserver启动http(https)服务的软件.

常见的webserver软件有:

IIS(微软),

JBoss,

WebLogic(收费)

Tomcat

等等


三, http网页浏览的原理.

在讨论WebServer的机制前, 我觉得有必要详述一下http网页浏览的原理.



3.1 网络传输协议简介


我们知道浏览器是可以打开本地html文件(网页文件)的.


而浏览一个网站,  只不过是利用浏览器远程打开 放在Webserver的网页文件而已.

问题来了, 那么我怎么打开1个网络上的server上的文件呢.


可能有人觉得很简单,  大家都利用ftp打开过的机器的文件吧.


只需要ip地址 以及 文件在机器上的目录就可以了?


实际上是不足够的.


实际上, 需要的元素要三样

1. server的ip地址

2. server的传输协议(例如ftp, sftp...等)

3. 对方开放的端口(port)


如果对方不开ftp服务, 你即使知道ip地址以及文件路径也没用.

就好如 你知道老王家的书柜上有一本好书,  但是如果老王不想让你看, 你也看不了的.


*首先你得知道老王家哪里.

*而ftp服务就如老王提供了1个看书服务.

* 端口就如老王家里开了一个窗口, 你可以通过这个窗口来申请借书..     你必须通过这个窗口才能借到书.   老王很可能开通其他窗口提供借酒, 借钱什么的...



而http协议跟ftp协议优点类似, 但是http只能通过浏览器访问, 而且只能打开网页文件.




3.2 http协议工作步骤.

好了假如服务器WebServer 有1个网页文件.

而我家里的及机器有一个浏览器.


那么我到底怎么才能通过这个浏览器来打开webServer上的网页文件呢.


大概原理如下图:



3.2.1 WebServer 启动 webserver(http协议)

作为网页服务器,  必须启动webserver服务, 例如启动Tomcat , 同时指定访问端口.



3.2.2 Client端利用browser发送1个连接请求(request) 到WebServer的指定端口.


例如我用FireFox 打开1个网页, 可以见到浏览器其实发送了1个get请求到Webserver的80端口(如果不在地址栏制定端口, 就会使用默认的http端口80)




在上面截图右下角, 就见到Request header信息, 这些就是浏览器发送给Webserver的信息.

它包括:

1. Host:  就是webserver的地址,  dns服务器会根据这个地址转换成真正的ip来找到指定的WebServer

2. User-Agent: 就是浏览者所使用的浏览器和操作系统信息, Webserver可以利用这些信息做一些逻辑上的分支处理.

3. Accept: 就是这个浏览器能支持显示什么内容.

还有Language, cookie等信息, 以后有机会再详解.


注意, 绝大部分的连接请求都是通过TCP/IP协议发出的.



3.2.3 WebServer受到browser的申请后, 把对应的网页文件附带一些信息发送回浏览器.(利用Socket的Stream)

一旦WebServer受到请求.

相当于构造了1个Socket对象.(后面会讲),  然后利用这个Socket对象发送回对应的网页文件,

那么浏览器就得到这个网页文件并显示给浏览者了.


下面就是webserver发送回的头文件信息:


包括压缩方式,

内容大小

内容格式

最近更新日期.

Server(webserver 软件)类型等.


最后, 还会吧网页文件的内容发送过来:






四, WebServer软件的工作职责.

通过, 上面的例子.

我们可以大概清楚WebServer软件的工作职责


1. 监听访问端口.

2. 一但有连接请求通过端口发送过来, 就建立一条与对方浏览器的通道(InputStream & OutputStream)

3. 把网页内容和相关信息发送给浏览器.


当然, 真正使用的webserver软件绝对没有上面写的这么简单, 但最关键的步骤原理都是一样的.


五, 利用java自己写1个webserver软件小程序.

我们知道了webserver 软件的运行原理.

也可以尝试自己写1个简单的webserver小程序出来了:

5.1 写1个html文件

<html>
<body>

<h1>My webserver mainPage</h1>

<p>hello world</p>

</body>
</html>

存放在某个目录, 例如:

/home/gateman/Studies/Java/java_start/single/mywebserver/index.html


5.2 利用java编写MyWebServer.java


代码:

public class MyWebServer{
    public static int port = 10010;
    public static String mainPagePath = "/home/gateman/Studies/Java/java_start/single/mywebserver/index.html";

    public static void main(String[] args){
        try{
            serverStart();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void serverStart() throws Exception{
        ServerSocket ss = new ServerSocket(port);
        File fileMainPage = new File(mainPagePath);
        byte[] bArr = new byte[8];
        int len;

        while(true){
            Socket s = ss.accept();
            System.out.println("get a Connection request!"); 

            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileMainPage));
            BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
            len = bis.read(bArr);
            while(-1 != len){
                bos.write(bArr,0,len); //maybe there's some previous data after len of the bArr 
                len = bis.read(bArr);
            }
         
            bos.flush();
            bos.close(); 
            bis.close();
            s.close(); 
        }
    }
}



步骤很简单:

1. 首先在类里指定所使用的端口.

2. 指定主页网页文件的位置.

3. 根据端口构建1个 ServerSocket对象(如果对这个类不了解, 请参考我另一篇博文:  http://blog.csdn.net/nvd11/article/details/42847601)

4. 利用while循环监听这个端口

5, 一旦有连接请求, 构造1个socket对象

6. 利用socket对象的outputstream, 把网页文件内容发送过去.



5.4 测试执行

利用javac 编译这个类

然后利用java命令来执行


那么这个程序就在监听端口了.


然后我们可以打开另1个虚拟机, 输入在浏览器输入ip地址和端口(192.168.1.107:10010), 就见到浏览器里显示了那个网页文件的内容:




5.5 小结

其实这个MyWebServer功能相当弱啦, 而且是没有执行相应标准的, 只是能用浏览器简单显示网页文件的内容, 并没有正确地显示网页文件.


常用的WebServer 软件例如Tomcat, Weblogic功能强大得多也健壮得多, 但是基本原理是相似的.















































猜你喜欢

转载自blog.csdn.net/nvd11/article/details/42980247
今日推荐