精华内容
下载资源
问答
  • 简单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);

       

    }



    展开全文
  • 简单web服务器

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

    背景是我带了两个小朋友,最近有个自学任务,要搭建一个简单的web服务器。猜课程的目的应该是考察协议的设计。

    1. 利用现成的框架
    2. 利用Java中现成函数、利用现成的C语言库

    我晚上抽一个小时简单整理下,权做抛砖引玉吧。

    利用现成的框架

    sample.py

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    __author__ = 'Yeshen'
    
    from bottle import run, post, request, response, get, route
    
    @get('/')
    def login():
        return '<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1" /><title>YESHEN</title><style type="text/css">nav {color: #999;margin: 20% auto;text-align: center;}</style></head><body><nav><h1>2020</h1><p>趣果有间</p><p></p></nav></body></html>'
    
    if __name__ == "__main__":
        run(host='', port=12345, debug=False)
    
    pip intstall bottle
    python sample.py
    # http://127.0.0.1:12345
    

    PS:
    bottle算是很简单的框架了,平时开发过程中有什么接口服务端给不了的,自己部署一个也不会太难。
    文档参考:https://bottlepy.org/docs/dev/tutorial.html

    利用Java中现成函数

    sample.java

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    import java.util.Date;
    import java.util.StringTokenizer;
    
    /**
    * Written by Martin Ombura Jr. <@martinomburajr>
    * Modify by Yeshen at March 16.2020
    */
    public class sample {
        public static void main(String[] args) {
            connectToServer();
        }
    
        public static void connectToServer() {
            BufferedReader in = null; 
            PrintWriter out = null; 
            Socket connectionSocket = null;
            try {
                ServerSocket serverSocket = new ServerSocket(12345);
                connectionSocket = serverSocket.accept();
    
                in = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                out = new PrintWriter(connectionSocket.getOutputStream());
                InputStream inputToServer = connectionSocket.getInputStream();
                OutputStream outputFromServer = connectionSocket.getOutputStream();
                String input = in.readLine();
                StringTokenizer parse = new StringTokenizer(input);
                String method = parse.nextToken().toUpperCase(); 
                String content = "<!DOCTYPE html><html><head><meta charset='UTF-8'><meta name='viewport' content='width=device-width, initial-scale=1' /><title>YESHEN</title><style type='text/css'>nav {color: #999;margin: 20% auto;text-align: center;}</style></head><body><nav><h1>2020</h1><p>趣果有间</p><p></p></nav></body></html>";
                
                if (method.equals("GET")) {
                    out.println("HTTP/1.1 200 OK");
                    out.println("Server: Java HTTP Server from SSaurel : 1.0");
                    out.println("Date: " + new Date());
                    out.println("Content-type: text/html");
                    out.println("Content-length: " + content.length());
                    out.println(); 
                    out.flush();
                    out.println(content);
                    out.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if(in != null)in.close();
                } catch (Exception e) {
                    System.err.println("Error closing stream : " + e.getMessage());
                }
                try {
                    if(out != null)out.close();
                } catch (Exception e) {
                    System.err.println("Error closing stream : " + e.getMessage());
                } 
                try {
                    if(connectionSocket != null)connectionSocket.close();
                } catch (Exception e) {
                    System.err.println("Error closing stream : " + e.getMessage());
                } 
            }
        }
    }
    
    javac sample.java
    java sample
    # http://127.0.0.1:12345
    

    想了一下,我不能全部都做完。

    1. 自学文档中还剩下一些东西,研究下去,弄出来?
    2. 用其他语言如何实现这个功能(kotlin\c++)?
    3. 这个功能在Android中如何实现?
    4. 如何抓包?

    参考资料

    1. https://bottlepy.org/docs/dev/tutorial.html
    2. https://medium.com/martinomburajr/java-create-your-own-hello-world-server-2ca33b6957e
    展开全文
  • 简单的嵌入式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文件,编辑它,你就能得到你想要的界面

    效果如下:

    该页面为仿写淘宝页面

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

    2013-06-02 23:34:53
    完整的课程设计实验报告,亲测可用,直接按照说明搭建使用。
  • web服务器设计文档

    2013-05-30 00:22:43
    完成一个简单WEB服务器设计与实现,要求能够通过HTTP GET命令获得一个简单的HTML文件,这是web服务器开发总文档,由概要设计到实验结果,需要课程设计的可以下了。。
  • 嵌入式web服务器设计流程,一个简单WEB 服务器的过程。
  • 这是《计算机网络》的课程设计--多线程的Web服务器(带有课程设计报告),里面为Eclipse3.5的工程。支持HTTP1.1(但是不完善),支持多线程(采用的线程池),支持简单CGI(仅PHP的CGI模块通过测试),支持配置文件...
  • Ktor设计模板 需求条件 升级gradle 安装Oracle Java 1.8 入门。 使用Kotlin的网络框架Ktor创建并运行HTTP(S)服务器 适用于创建微服务和简单​​的网页。 由于Ktor是一个年轻的次要框架,因此编译和执行它还有很...
  • 20145221 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验 实验报告 队友博客:20145326蔡馨熠 实验博客:《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验 参考资料 《深入理解计算机系统》 ...

    20145221 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验

    实验报告

    参考资料

    转载于:https://www.cnblogs.com/20145221GQ/p/6129241.html

    展开全文
  • 手写简单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进行通讯编程的过程,了解一个实际的网络通讯应用程序整体...
  • 20145216 20145330 《信息安全系统设计基础》 实验五 简单嵌入式WEB 服务器实验 队友链接: http://www.cnblogs.com/20145330swx/p/6121220.html 转载于:https://www.cnblogs.com/sjy519/p/6131368.html...
  • 一个简单web服务器

    2017-03-01 17:44:02
    计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务器)请求信息和服务,HTTP目前协议的版本是1.1.HTTP是一种无状态的协议,无状态是指Web浏览器和Web服务器之间不需要建立持久的连接,这意味...
  • 计算机专家设计出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服务器可以实现简单的用户配置、...
  • 服务器开发的流程图 服务器架构的设计思路 服务器设计思路
  • 掌握在 ARM 开发板实现一个简单 WEB 服务器的过程。 学习在 ARM 开发板上的 SOCKET 网络编程。 学习 Linux 下的 signal()函数的使用。 实验内容 学习使用 socket 进行通讯编程的过程,了解一个实际的网络通讯应用...
  • Waffer是预先设计的MVC服务器 安装 有一个cli $ npm install -g waffer-cli 用法 查看 特征 Vue前端 默认情况下,使用和渲染网站。 定制组件 自定义组件在视图之间共享。 基础项目附带两个自定义组件,在每个视图...
  • 一.服务器的设计问题:DIY or 代理1.DIY——服务器接收请求,自己处理...二.web服务器功能常用的3种用户操作:1.列举目录信息;2.cat文件;3.运行程序请求处理: 目录:显示目录列表 文件:显示内容 .cgi文件:运行
  • Linux C小项目 —— 简单web服务器

    千次阅读 2018-02-05 21:48:16
    简单Web服务器 实现一个基于HTTP通信协议的web服务器。客户端向服务器程序发送所需文件的请求,服务器端分析请求并将文件发送个客户端。 1、整体程序设计 客户端发送所需文件,服务器返回该文件,通信结束。 ...
  • 最近参加了个比赛,题目就一句话,设计一个[u]简单实现web负载均衡服务器,最好是七层负载均衡[/u]。在做之前我完全不懂,一顿查资料。从什么是负载均衡,到什么是七层,什么http重定向方式、反向代理方式等等。最终...
  • 本篇讲述如何利用反向代理来实现web服务器负载均衡。 以上负载均衡架构图,优点是架构较简单,缺点是没有根据业务权重设计负载。 以上负载均衡是通过均衡服务器的实际承载,响应请求数量,传输数据流量,来...
  • 简单web服务器 计算机网络实验 多线程Web服务器设计与实现
  • web服务器

    2019-06-11 17:09:00
    是一个周末,这篇文章将从一个简单的例子来理解tomcat的底层设计; 本文将介绍 Java Web 服务器是如何运行的, Web 服务器也称为超文本传输协议( HyperText Transfer Protocol, HTTP)服务器, 因为它使用 Http 与其...
  • 在eclipse开发平台上使用Java编程技术设计Web服务器。本设计简单说明一下图形界面的设计流程,着重于介绍I/O接口的实现这一块。论文包括学术论文和源代码及其详解。

空空如也

空空如也

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

设计简单web服务器