精华内容
下载资源
问答
  • 简单web服务器设计与实现一、设计内容及设计要求WWW的工作基于客户机/服务器计算模型,由Web浏览器(客户机)和Web服务器(服务器)构成,两者之间采用超文本传送协议(HTTP)进行通信,HTTP协议的作用原理包括四个步骤...

    简单

    web

    服务器的设计与实现

    一、

    设计内容及设计要求

    WWW

    的工作基于客户机

    /

    服务器计算模型,

    Web

    浏览器

    (

    客户机

    )

    Web

    务器

    (

    服务器

    )

    构成,两者之间采用超文本传送协议(

    HTTP

    )进行通信,

    HTTP

    协议

    的作用原理包括四个步骤:连接,请求,应答

    ,

    关闭应答。

    设计内容

    Web

    服务器是

    web

    中的关键部件,

    设计一个简单的

    Web

    服务器,

    用户提供简单的信息服务。

    设计要求

    本实验要求完成一个简单的

    web

    服务器的设计与实现,能够通过

    HTTP Get

    命令获得一个简单的

    HTML

    文件。

    设计目的

    通过

    web

    服务器的设计与实现,可以达到以下目的:掌握网络编程

    的知识与技能;掌握

    HTTP

    协议的相关知识;熟悉网络软件的开发过程,

    锻炼解决实际问题的能力。

    二、

    总体设计

    HTTP

    协议的作用原理包括四个步骤:

    连接:

    Web

    浏览器与

    Web

    服务器建立连接,打开一个称为

    socket

    (套接字)

    的虚拟文件,此文件的建立标志着连接建立成功。

    请求:

    Web

    浏览器通过

    socket

    Web

    服务器提交请求。

    HTTP

    的请求一般是

    GET

    POST

    命令(

    POST

    用于

    FORM

    参数的传递)

    GET

    命令的格式为:

    GET

    路径

    /

    文件名

    HTTP/1.0

    文件名指出所访问的文件,

    HTTP/1.0

    指出

    Web

    浏览器使用的

    HTTP

    版本。

    应答:

    Web

    浏览器提交请求后,通过

    HTTP

    协议传送给

    Web

    服务器。

    Web

    务器接到后,进行事务处理,处理结果又通过

    HTTP

    传回给

    Web

    浏览器,从而在

    Web

    浏览器上显示出所请求的页面。

    关闭连接:当应答结束后,

    Web

    浏览器与

    Web

    服务器必须断开,以保证其它

    Web

    浏览器能够与

    Web

    服务器建立连接。

    展开全文
  • 简单web服务器设计与实现

    万次阅读 2017-01-27 19:48:09
    socket web服务器

    一、综合训练目的与要求

    运用数据通信及网络课程所学的知识,设计一个简单的http服务器,在实现的过程中学习网络套接字编程、HTTP 协议、Web 服务器等知识;提供静态网页浏览服务功能;Web 服务器可配置参数有主目录、首页文件名、HTTP 端口号等项,锻炼UNIX环境下网络编程的能力,熟悉socket编程原理和http协议,从而巩固所学网络知识。

    二、综合训练任务

    1)要能实现get方法;

    2)能响应请求的html页面;

    3)还能够响应请求的gif,jpg的等图片文件;

    4)能响应请求的目录的信息,并以列表显示;

    5) 能读取文本文件txt。

     

    三、总体设计

    3.1 工作原理

     

         网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用叫Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 

    Linux网络编程中常用的系统调用函数包括:初始化(socket)、连接(connect)、绑定(bind)、监听(1isten)、接收(accept)、关闭(close)、发送(send)。 

    Socket接口通过以下函数为应用编程提供服务: 1)socket():创建一个套接字; 

    2) bind():用于将套接字与本地或远程某个地址和端口建立关联; 3) listen():用于在服务器一端监听是否有连接请求; 4) connect():客户通过调用该函数主动与服务器建立连接; 5) accept():用于接收来自客户的连接请求,服务器先创建一个新的套接字,用新套接字与客户进行通信,原套接字仍保持侦听状态,以便接收其他连接请求;6)send()和recv():SOCK_STREAM类型套接字数据的发送和接收; 7) close():关闭套接字。

     HTTP协议是基于请求/响应模式的。一个客户机与服务器建立连接后,发送一个请求给服务器。服务器接到请求后,给予相应的响应信息。在Internet上,HTTP通信通常发生在TCP/IP连接之上,建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息:包括请求修饰符、客户机信息和可能的内容服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容,客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客http工作流程图户机与服务器断开连接。 

    基于HTTP协议的客户/服务器模式的信息交换分四个步骤:建立连接、发送请求信息、发送响应信息和关闭连接

     

    3.2设计过程

     

    Web服务器的工作方式都是以套接字机制为基础的。对于一个B/S通信模型,在服务器端,首先创建一个套接字,并将此套接字与服务器公认的IP地址绑定在一起,接着将套接字转换成侦听套接字来侦听用户的请求,在接收到客户机的请求后就建立连接,然后服务器和客户机之间就可以进行通信了。多个请求时服务器使用不同的进程来

    进行处理,互不干扰。以下为web服务器的工作流程图:

     


    四、详细设计说明

    1、服务器端 

    1)创建一个socket; 

    2)将该socket与本机地址/端口号捆绑; 

    3)在监听端口上监听客户机的连接请求; 

    4) 当accept捕捉到一个连接请求时,就建立连接线路并返回一个新的通信文件描述符; 

    5)父进程创建一个子进程,父进程关闭通信文件描述符并继续监听端口上其它客户机的连接请求; 

    6)子进程通过通信文件描述符与客户机进行通信,通信结束后终止子进程并关闭通信文件描述符。

     

    2、浏览器端

    1)创建一个socket; 

    2)向指定的服务器主机及端口发出连接请求,请求成功将返回通信文件描述符;

    3)调用connect函数与服务器建立连接;

    4)连接成功之后与服务器进行通信:

    ①、建立子进程;

    ②、处理get方式请求的静态网页;

    ③、接收请求

    ④、执行相关程序(CGI,sh)

    ⑤、回应请求

    5)通信完毕后关闭通信文件描述符。


    五、实习总结

    本次Linux综合实训,这次我们成功实现了一个小型的http服务器,能访问我们自己的网页;其次,在实现http服务器的过程中,熟悉了http协议等网络相关知识,巩固并实践了上学期网络课程所学内容;还有,我们又锻炼了UNIX环境下编程开发能力,基本了解了Web服务器的设计和工作原理,更加深了对socket套接字建立服务器端的过程,掌握了一些Linux下c语言网络编程方法,更加深了我对书本知识的理解。

        遇到的最大问题:实现CGI接口时,CGI无法获取到测试网页表单中的参数,表单提交后找不到路径,直接跳到404页面。原因是表单提交请求方式是get,get请求方式的参数显示在地址栏上文件后缀名之后,服务器没有匹配到文件类型字符串,故无法找到页面。


    六、核心代码

    1、socket服务器端

     

    intmake_server_socket_q(int,int);

     

     

    intmake_server_socket(int protnum)

    {

        returnmake_server_socket_q(protnum,BACKLOG);

    }

     

     

     

    intmake_server_socket_q(int portnum,int backlog)

    {

        struct sockaddr_in saddr;

        //创建服务器socket

        intsock_id;

      

     

        sock_id=socket(PF_INET, SOCK_STREAM, 0);

     

        if(sock_id==-1)//失败

        {

            return -1;

        }

        bzero((void *)&saddr,sizeof(saddr));

        saddr.sin_addr.s_addr=htonl(INADDR_ANY);

        saddr.sin_port=htons(portnum);

        saddr.sin_family=AF_INET;

        //绑定

        if(bind(sock_id,(struct sockaddr*)&saddr,sizeof(saddr))!=0)

            return -1;

        //监听

        if(listen(sock_id,backlog)!=0)

            return -1;

        return sock_id;

     

    }

     

     

     

    intconnect_to_server(char *host,int portnum)

    {

        int sock;

        struct sockaddr_in servadd;//the number tocall

        struct hostent *hp;//used to get number

        //

        sock = socket(PF_INET,SOCK_STREAM,0);//geta line

        if(sock==-1)

            return -1;

        //清空

        bzero(&servadd,sizeof(servadd));

        hp = gethostbyname(host);

        if(hp==NULL)

            return -1;

        bcopy( hp->h_addr,(structsockaddr*)&servadd.sin_addr, hp->h_length);

        // servadd.sin_addr=htonl(INADDE_ANY);

        servadd.sin_port=htons(portnum);

        servadd.sin_family=AF_INET;

        if(connect(sock,(structsockaddr*)&servadd,sizeof(servadd))!=0)

            return -1;

        return sock;

    }

     

    2、浏览器端

     

    main(intac,char*av[])

    {

        //socket描述符和accept描述符

        int sock,fd;

        FILE *fpin;

        //保存请求

        char request[BUFSIZ];

        if(ac==1)

        {

            fprintf(stderr,"usage:wsportnum\n");

            exit(1);

        }

        sock=make_server_socket(atoi(av[1]));//atoi方法将字符串变成整型

        if(sock==-1) exit(2);

     

        while(1)

        {

            //该函数会阻塞等待客户端请求到达

            fd =accept(sock,NULL,NULL);

            //只读方式接收请求(文件流)

            fpin=fdopen(fd,"r");

            //得到请求

            fgets(request,BUFSIZ,fpin);

            //打印到控制台请求记录

            printf("got a call :request =%s",request);

               read_til_crnl(fpin);

            //处理请求

            process_rq(request,fd);

            //结束本次请求

            fclose(fpin);

        }

    }

     

     

     

    //读取完整的请求

    read_til_crnl(FILE*fp)

    {

        char buf[BUFSIZ];

       while(fgets(buf,BUFSIZ,fp)!=NULL&&strcmp(buf,"\r\n")!=0);

    }

     

     

    //处理请求

    process_rq(char*rq, int fd)

    {

        char cmd[BUFSIZ],arg[BUFSIZ];

        //创建子进程,如果不是子进程则结束

        if (fork()!=0)

            return;

        strcpy(arg,"./");

        if(sscanf(rq,"%s%s",cmd,arg+2)!=2)

            return;

        if(strcmp(cmd,"GET")!=0)//只能处理静态网页get方式

            cannot_do(fd);

        else if (not_exist(arg))//请求出错

            do_404(arg,fd);

        else if (isadir(arg))//判断是否为目录

            do_ls(arg,fd);

        else if (ends_in_cgi(arg))//是否为cgi程序

            do_exec(arg,fd);

        else if (ends_in_sh(arg))//是否为sh程序

            do_exec_sh(arg,fd);

        else

            do_cat(arg,fd);

    }

     

     

    //获取头部信息

    header(FILE*fp,char*content_type)

    {

        fprintf(fp,"HTTP/1.0 200OK\r\n");

        if(content_type)

            fprintf(fp,"Content-type:%s\r\n",content_type);

    }

     

    //请求501错误

    cannot_do(intfd)

    {

        FILE *fp =fdopen(fd,"w");

     

           fprintf(fp,"HTTP/1.0 501 NotImplemented\r\n");

       fprintf(fp,"Content-type:text/plain\r\n");

        fprintf(fp,"\r\n");

        fprintf(fp,"Sorry,HTTP 501!\n\n无法处理请求!");

        fclose(fp);

     

    }

     

     

    //请求出错404

    do_404(char*item,int fd)

    {

        FILE *fp=fdopen(fd,"w");

     

        fprintf(fp,"HTTP/1.0 404 NotFound\r\n");

       fprintf(fp,"Content-type:text/plain\r\n");

        fprintf(fp,"\r\n");

        fprintf(fp,"Sorry,HTTP 404!\n\nTheitem you requested: %s \r\nis not found\r\n",item);

        fclose(fp);

    }

     

     

    //判断是否为目录

    isadir(char*f)

    {

        struct stat info;

        return(stat(f,&info)!=-1&&S_ISDIR(info.st_mode));

     

    }

     

     

    //不存在

    not_exist(char*f)

    {

        struct stat info;

        return (stat(f,&info)==-1);

    }

     

     

    //显示目录下内容

    do_ls(char*dir,intfd)

    {

        FILE *fp;

     

        fp = fdopen(fd,"w");

       header(fp,"text/plain;charset=UTF-8");

        fprintf(fp,"\r\n");

        fflush(fp);

     

        dup2(fd,1);

        dup2(fd,2);

        close(fd);

       execlp("ls","ls","-l",dir,NULL);

        perror(dir);

        exit(1);

    }

     

     

    //返回文件类型

    char*file_type(char *f)//return 'extension' of file

    {

        char *cp;

        if((cp=strrchr(f,'.'))!=NULL)

            return cp+1;

        return " ";

    }

     

    //cgi类型文件

    ends_in_cgi(char*f)

    {

       return(strcmp(file_type(f),"cgi")==0);

    }

     

     

     

    //执行shell程序

    ends_in_sh(char*f)

    {

       return(strcmp(file_type(f),"sh")==0);

    }

     

    do_exec_sh(char*prog,int fd)

    {

        system(prog);

    }//shell

     

     

    //执行可执行程序cgi

    do_exec(char*prog,int fd)

    {

        FILE *fp;

        fp =fdopen(fd,"w");

        header(fp,NULL);

        fflush(fp);

       

        dup2(fd,1);

        dup2(fd,2);

        close(fd);

        execl(prog,prog,NULL);

        perror(prog);

       

    }



    展开全文
  • 回想一下一个http请求的过程,你在浏览器输入xxx.com,经过域名解析 --> 发起tcp的3次握手 --> 建立tcp连接后发起http请求 -->... 浏览器对页面进行渲染呈现给用户。每一个web服务器程序都需要从网络接受h...

    回想一下一个http请求的过程,你在浏览器输入xxx.com,经过域名解析 --> 发起tcp的3次握手 --> 建立tcp连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户。

    ddcb8fc8565d93304e49046abb54492c.png

    每一个web服务器程序都需要从网络接受http请求,然后提供http回复给请求者。http回复一般包含一个html文件,有时也可以包含纯文本文件、图像或其他类型的文件。

    画外音:web服务器就是一个处理http请求的应用程序。

    实现大致步骤:

    • 初始化服务端ServerSocket
    • 初始化TreadPool
    • while(true)等待客户端连接
    • <>
    • 客户端请求
    • clientHandler处理客户端的请求
    • 线程池的线程处理handler
    • 根据输入流解析请求(解析请求行,解析消息头,解析消息正文)
    • 根据输出流创建响应对象(发送状态行信息,发送响应头信息,发送响应正文信息)
    • <>
    • 寻找servlet 根据请求路径找到需要哪个servlet处理(选择handler)
    • 通过反射机制加载这个类
    • 实例化servlet
    • servlet处理请求(执行handler结束)
    • <>

    一个应用程序是不是先要启动起来?main函数当然要有,init方法当然有,我们先不管高性能之类的东西,多路复用Reactor之类的,但是总的有处理并发能力吧,线程池大小默认处理器的核心数,多的也处理不过来!服务器通信归根结底都是socket通信,包括redis服务器都是底层都是socket通信。我们怎么知道http请求来了,先长轮询。

    private ServerSocket server;private ExecutorService threadPool;public WebServer() { try { System.out.println("init server begin"); server = new ServerSocket(8080); int poolSize = Runtime.getRuntime().availableProcessors(); threadPool = newFixedThreadPool(poolSize - 1); System.out.println("init server end"); } catch (Exception e) { e.printStackTrace(); } }public void start() { try { while (true) { //TODO } } catch (Exception e) { e.printStackTrace(); }}public static void main(String[] args) { WebServer server = new WebServer(); server.start();}

    http请求来了,怎么处理?当然需要有定义handler去处理。

     Socket socket = server.accept(); ClientHandler handler = new ClientHandler(socket); threadPool.execute(handler);

    handler处理客户端请求并完成响应:

    private class ClientHandler implements Runnable { private Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } public void run() { try { //根据输入流解析请求 HttpRequest request= new HttpRequest(socket.getInputStream()); //先判断用户请求的是否为后端请求 if (ServerContext.servletMapping.containsKey( request.getRequestLine()) ) { //通过反射机制加载这个类 //实例化这个Servlet } else { //查看请求的该页面是否存在,存在直接跳转 } else { //设置状态代码404等,跳转404页面 } } } catch (Exception e) { e.printStackTrace(); } finally { socket.close();  } }

    处理过来的请求当然要根据输入流解析请求,根据输出流创建响应对象。需要判断是不是后端请求,如果不是后端请求,需要找到对应的文件,设置响应头,设置响应体,返回给浏览器,找不到则返回404。如果是后端请求需要经过servlet,我们肯定需要通过请求路径找到对应的配置文件,我们配置可以放在xml里面,也可以放到map里面,通过反射机制加载某个类,然后实例化某个servlet,处理完设置请求头,设置请求体返回给客户端。

    知识点:IPO模型。

    一个简单的web服务器的思路已经基本有了,但是为什么springboot应用不用你单独启动服务器?springboot默认使用的是 Tomcat 作为内嵌的服务器。所以,我们搭建一个工程将会变得非常的简单。springboot应用会自动启动一个嵌入的Tomcat服务器实例,至于怎么做到自动的,你问过自己为什么吗?

    展开全文
  • 简单的嵌入式web服务器设计

    千次阅读 2019-06-01 17:54:18
    实验原理 WEB浏览器 ...个人电脑上常见的网页浏览器包括Internet Explorer、Firefox、... Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站...

    实验原理

    WEB浏览器

        浏览器是个显示网页伺服器或档案系统内的HTML文件,并让用户与此些文件互动的一种软件。个人电脑上常见的网页浏览器包括Internet Explorer、Firefox、Safari。浏览器是最经常使用到的客户端程序。

    WEB服务器

        Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。

        通俗的讲,Web服务传送页面使得浏览器可以浏览,它专门处理HTTP请求。

    嵌入式服务器架构

    常见的嵌入式WEB服务器有lighttpd、shttpd、thttpd、boa、mathopd、minihttpd、appweb、goahead等上百种

    SOCKET编程技术

        Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程

        Socket可以支持数据的发送和接收,它会定义一种称为套接字的变量,发送数据时首先创建套接字,然后使用该套接字的sendto等方法对准某个IP/端口进行数据发送;接收端也首先创建套接字,然后将该套接字绑定到一个IP/端口上,所有发向此端口的数据会被该套接字的recv等函数读出。如同读出文件中的数据一样 

    HTTP协议

    HTTP--Hyper Text Transfer Protocol,超文本传输协议,是一种建立在TCP上的无状态连接,整个基本的工作流程是客户端发送一个HTTP请求,说明客户端想要访问的资源和请求的动作,服务端收到请求之后,服务端开始处理请求,并根据请求做出相应的动作访问服务器资源,最后通过发送HTTP响应把结果返回给客户端。其中一个请求的开始到一个响应的结束称为事务,当一个事物结束后还会在服务端添加一条日志条目

    一次完整的HTTP请求需要七个步骤

    图片来源:http://android.jobbole.com/85218/

    HTTP报文:

    它是HTTP应用程序之间发送的数据块。这些数据以一定的文本信息开头,这些信息描述了报文的内容及含义,报头后跟着数据部分

    一次http请求,http会从客户端流到服务器,服务器的工作完成后,报文从服务器流到客户端

    所有的http报文都可以分为请求报文和响应报文。它们的结构基本相同,只有起始语法些许不同

    图片来源:https://www.cnblogs.com/zhuifeng/p/4072248.html

     

    请求报文:它会向Web服务器请求一个动作

    请求报文的格式:

    起始行: <method> <request-URL> <version>

    头部:   <headers>

    主体:   <entity-body>

     

    响应报文:它会将请求的结果返回给客户端。

    响应报文的格式:

    起始行:  <version> <status> <reason-phrase>

    头部:    <headers>

    主体:    <entity-body>

    1、方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比如,GET、POST或HEAD
    
    2、请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的绝对路径就可以了,服务器可以假定自己是URL的主机/端口
    
    3、版本(version):报文所使用的HTTP版本。其格式:HTTP/<主要版本号>.<次要版本号>
    
    4、状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(比如,“成功”、“出错”等等)
    
    5、原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义,因此,尽管响应行HTTP/1.0 200 NOT OK和HTTP/1.0 200 OK中原因短语的含义不同,但同样都会被当作成功指示处理
    
    6、头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头部列表的结束和实体主体部分的开始
    
    7、实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。

    SOCKET编程接口

    1.socket()函数

    int socket(int domain,int type,int protocol);
    
    说明:socket()函数创建一个套接字
    参数:
    domain    应用程序所在主机使用的通信协议族
    type      建立的套接字类型
    protocol  使用的特定协议

    2.bind()函数

    int bind(int sockfd,struct sockaddr *my_addr,socklen_t addrlen);
    
    说明:将套接字地址和所创建的套接字id联系起来
    参数:
    sockfd        socket返回的文件描述符
    my_addr       指向结构体sockaddr的指针,保存地址信息(端口、ip)
    addrlen       sockaddr的长度

    3、connect函数

    int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen);
    
    说明:建立套接字连接,成功返回0,否则返回-1
    参数:
    
    sockfd        socket返回的文件描述符
    serv_addr     保存着连接信息的结构体sockaddr
    addrlen       sockaddr的长度

    4、listen()函数

    int listen(int sockfd,int backlog);
    
    说明:使得一个进程可以接受其它进程的请求,使其变为服务器进程
    
    参数:
    sockfd        socket返回到文件描述符
    backlog       允许建立连接的数目

    5、accept()函数

    int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);
    
    说明:用于流式套接字的通讯,返回实际发送的数据的字节数
    参数:
    
    sockfd        socket返回的文件描述符
    addr          保存套接字信息的结构体
    addrlen       addr的长度
    

    6、send()函数

    ssize_t send(int sockfd,const void *msg,size_t len,int flags);
    
    说明:用于流式套接字或数据报套接字的通讯,返回实际发送的数据的字节数
    
    参数:
    sockfd    发送数据的套接字描述符
    msg       指向发送数据的指针
    len       发送数据的长度
    flags     默认为0

    7、recv()函数

    ssize_t recv(int sockfd,void *buf,size_t len,int flags);
    
    说明:    用于流式套接字的通讯,返回值为实际读入缓冲的数据的字节数
    
    参数:
    sockfd    要读的套接字描述符
    buf       要读的消息的缓冲区
    len       缓冲的最大长度
    flags     默认为0

    Apache服务器的安装

    Web服务器一般指网站服务器,是指驻留于Inter网上某种类型的计算机程序,它可以向浏览器客户端提供文档,也可以放置网站文件,让全世界浏览;它可以放置数据文件,让全世界下载。

    Apaches世界排名第一的Web服务器软件。它可以运行在所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用。

    如果你使用的linux系统为Ubuntu,你可以很方便的下载apache

    终端输入:apt-get install apache2

    只需一个指令,你就能完成apache的安装,如果你想要进行apache的各种配置,请自行搜索

    安装之后,apache默认是开启的且每次会随系统启动

    终端输入:apachectl -v查看apache的版本

    当然,你可以在浏览器输入你服务器的ip地址(安装服务器的linux的ip),如果你得到默认界面,那么一切都是正常的

    之后,你就能在/var/www/html/下找到index.html文件,编辑它,你就能得到你想要的界面

    效果如下:

    该页面为仿写淘宝页面

    展开全文
  • 本文实例讲述了Python编程实现的简单Web服务器。分享给大家供大家参考,具体如下:最近有个需求,就是要创建一个简到要多简单就有多简单的web服务器,目的就是需要一个后台进程用来接收请求然后处理并返回结果,因此...
  • 简单web服务器

    2020-03-16 23:31:19
    背景是我带了两个小朋友,最近有个自学任务,要搭建一个简单web服务器。猜课程的目的应该是考察协议的设计。 利用现成的框架 利用Java中现成函数、利用现成的C语言库 我晚上抽一个小时简单整理下,权做抛砖引玉...
  • web服务器设计文档

    2013-05-30 00:22:43
    完成一个简单WEB服务器设计与实现,要求能够通过HTTP GET命令获得一个简单的HTML文件,这是web服务器开发总文档,由概要设计到实验结果,需要课程设计的可以下了。。
  • 简单web服务器实现

    2013-06-02 23:34:53
    完整的课程设计实验报告,亲测可用,直接按照说明搭建使用。
  • 嵌入式web服务器设计流程,一个简单WEB 服务器的过程。
  • 设计了一种基于LwIP协议的嵌入式设备Web服务器。利用网页就可以配置嵌入式设备内部参数及程序升级。充分利用STM32平台内部集成以太网模块和LwIP轻型网络协议栈的特点,通过以太网物理层芯片LAN8720和RJ45接口相连,...
  • 这是《计算机网络》的课程设计--多线程的Web服务器(带有课程设计报告),里面为Eclipse3.5的工程。支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件...
  • 在eclipse开发平台上使用Java编程技术设计Web服务器。本设计简单说明一下图形界面的设计流程,着重于介绍I/O接口的实现这一块。论文包括学术论文和源代码及其详解。
  • 20145221 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验 实验报告 队友博客:20145326蔡馨熠 实验博客:《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验 参考资料 《深入理解计算机系统》 ...
  • 手写简单web服务器

    2018-11-15 09:13:00
    手写简单web服务器 一、用到的知识 oop,容器,io,多线程,网络编程,xml解析,反射,HTML,http 1.反射 将Java类中的各种结构映射成一个个Java对象,利用反射对一个类进行解剖,反射是框架设计灵魂 jdk9 用...
  • 1、掌握在ARM开发板实现一个简单WEB服务器的过程 2、学习在ARM开发板上的SOCKET网络编程 3、学习在Linux下的signal()函数的使用 实验内容 学习使用socket进行通讯编程的过程,了解一个实际的网络通讯应用程序整体...
  • 一个简单web服务器

    2017-03-01 17:44:02
    计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味...
  • 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验 队友链接: http://www.cnblogs.com/20145330swx/p/6121220.html 转载于:https://www.cnblogs.com/sjy519/p/6131368.html...
  • 最近看了《HTTP权威指南》和《UNP》有了写一个简单web服务器的想法,正好这个学期没有什么课,所以就花了一个星期这样写了一个出来,鉴于本人水平有限,如果有什么设计或代码错误的,希望各位指出哈。 tinyhttp ...
  • 计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味...
  •  打开浏览器,输入服务器IP,例如 http://192.168.0.3 ,如果端口号不是80,例如是8000,则输入 http://192.168.0.3:8000 。这时浏览器向服务器发送的HTTP协议头如下: GET / HTTP/1.1 Host: 192.168.0.3:8000 ...
  • 服务器开发的流程图 服务器架构的设计思路 服务器设计思路
  • 第18章 一个简单Web服务器的例子SHTTPD在第6章的用户空间网络程序简介中对HTTP协议进行了简单的介绍,本章将实现一个简单的Web服务器程序——SimpleHTTPDemo,简称SHTTPD。这个Web服务器可以实现简单的用户配置、...
  • 简单web服务器 计算机网络实验 多线程Web服务器设计与实现
  • 最近参加了个比赛,题目就一句话,设计一个[u]简单实现web负载均衡服务器,最好是七层负载均衡[/u]。在做之前我完全不懂,一顿查资料。从什么是负载均衡,到什么是七层,什么http重定向方式、反向代理方式等等。最终...
  • 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程。 学习在 ARM 开发板上的 SOCKET 网络编程。 学习 Linux 下的 signal()函数的使用。 实验内容 学习使用 socket 进行通讯编程的过程,了解一个实际的网络通讯应用...
  • 摘要:设计并实现了基于SOPC技术的嵌入式Web服务器简单介绍了SOPC技术的特点及构建方法,随后对该嵌入式Web服务器的实现在硬件和软件两方面都作了详细论述,其中运用Nios II软核处理器作为主控制器,实时多任务...
  • 一.服务器的设计问题:DIY or 代理1.DIY——服务器接收请求,自己处理...二.web服务器功能常用的3种用户操作:1.列举目录信息;2.cat文件;3.运行程序请求处理: 目录:显示目录列表 文件:显示内容 .cgi文件:运行
  • Linux C小项目 —— 简单web服务器

    千次阅读 2018-02-05 21:48:16
    简单Web服务器 实现一个基于HTTP通信协议的web服务器。客户端向服务器程序发送所需文件的请求,服务器端分析请求并将文件发送个客户端。 1、整体程序设计 客户端发送所需文件,服务器返回该文件,通信结束。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,402
精华内容 1,360
关键字:

简单web服务器设计