菜鸟笔记
提升您的技术认知

http web服务器的简单实现-ag真人游戏

阅读 : 825

    web服务器是我们每天浏览的这些网页的基础,它接收用户的请求,处理,最后向客户发回响应,常见的web服务器有iis,apache,nginx等等,这里说明下apache与tomcat的区别:apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet容器,是apache的扩展。 apache和tomcat都可以做为独立的web服务器来运行,但是apache不能解释java程序(jsp,serverlet)。两者都是一种容器,只不过发布的东西不同:apache是html容器,功能像iis一样;tomcat是jsp/servlet容器,用于发布jsp及java的,类似的有ibm的websphere、bea的weblogic,sun的jrun等等。

    web服务器进行服务时候的主要步骤

  1. 建立连接——接收一个客户端连接
  2. 接受请求——从网络中读取一条http请求报文
  3. 处理请求——对请求报文进行解析,并进行下一步工作
  4. 访问资源——访问请求报文中指定的资源
  5. 构建响应——创建正确的响应报文
  6. 发送响应——将响应发回客户端
  7. 记录事务过程——将与完成事务有关的信息记录在日志中。

     当客户端与服务器建立连接成功以后,客户端会向服务器发出其请求报文,这个请求报文中包含着以特定格式记录的请求信息,如请求行,请求首部,以及请求实体。当服务器接收完请求报文之后,按照约定格式对请求进行解析,了解客户端需要的东西。服务器有很多种类:单线程,多线程多进程,复用结构,服用多线程结构。多线程多进程服务器为每一个连接都提供了一个线程或者进程,对其进行监控处理。复用结构服务器会监视所有的连接,但是只有连接状态发生变化时才会对连接进行处理,连接空闲或者等待的时候并不会绑定线程或者进程。复用多线程服务器将他们两个的特点结合到一起,更高效的利用资源。

    通常客户端会请求一些资源,如图片等,当服务器解析完客户端的请求之后,便会寻找客户端请求的资源,寻找资源的方法有很多种,可以使用docroot对路径补全,以寻找目标文件在服务器上的真实路径并访问,当然也有一台服务器上有很多站点的情况,这时便可以使用虚拟主机对docroot进行配置,也可以使用cgi访问动态的服务器资源。

    获得想要访问的资源或者被拒绝之后,根据结果构建响应报文,最后将构建好的响应报文回送给客户端。

    下面是一个用java实现的简单web服务器demo:

 1 import java.io.datainputstream;
 2 import java.io.printstream;
 3 import java.net.serversocket;
 4 import java.net.socket;
 5 public class webserver {
 6 
 7     /**
 8      * @param args
 9      */
10     public static void main(string[] args) {
11         // todo auto-generated method stub
12         //i对线程标记,port为监听的机器端口号
13         int i=1,port=80;
14         serversocket serversocket=null;
15         socket socket=null;
16         try {
17             //新建一个服务器监听对象
18             serversocket=new serversocket(port);
19             system.out.println("listening!!");
20             //连续监听客户端请求
21             while (true) {
22                 socket=serversocket.accept();//这里会等待客户端的请求
23                 new connectionthread(socket, i).start();//一旦接受到客户端请求,便开启请求事务处理线程对请求进行异步处理
24                 i  ;
25             }
26         } catch (exception e) {
27             // todo: handle exception
28         }
29     }
30 }
31 //事务处理线程
32 class connectionthread extends thread{
33     socket socket=null;
34     int count;
35     public connectionthread(socket s,int i) {
36         // todo auto-generated constructor stub
37         socket=s;
38         count=i;
39     }
40     public void run() {
41         try {
42             string ip=socket.getinetaddress().tostring();//获取ip
43             int destport=socket.getport();//获取端口
44             system.out.println("client:" ip ":" destport);
45             printstream outstream=new printstream(socket.getoutputstream());//获取输出流
46             datainputstream instream=new datainputstream(socket.getinputstream());//获取输入流
47             stringbuilder instring=new stringbuilder();
48             string temp;
49             //打印接收到的请求
50             while (!(temp=instream.readline()).equals("")) {
51                 instring.append(temp "\n");                
52             }
53             system.out.println("request:\n" instring.tostring());
54             //向客户端返回特定的响应首部
55             outstream.println("http/1.0 200 ok");
56             outstream.println("content-type:text/html");
57             outstream.println("content-length:" "this is a test!!".length());
58             outstream.println("");
59             outstream.println("this is a test!!");
60             outstream.flush();
61         } catch (exception e) {
62             // todo: handle exception
63         }
64     }
65 }

访问localhost的请求报文:

demo的响应报文:

页面效果就是显示一句话:

可以看到,响应报文的传输方法就是按一定格式通过流进行传送。

网站地图