web/http服务器实现

简介: web/http服务器实现

文章目录

项目开发流程

程序编码

项目实例


项目开发流程

  1. 需求分析:实现基本的HTTP服务器,支持浏览器的访问(支持标准http协议)
  1. 接收浏览器发送HTTP请求;
  2. 解析请求数据,请求方式(GET),请求文件(html…),协议版本;
  3. 根据请求构建响应头,发送响应头:
  4. HTTP/1.1 200 Ok
  5. HTTP/1.1 404 File not found
  6. 根据请求文件,从服务器目录中获取对应的文件,发送给浏览器。
  1. 概要设计:绘制基本框图

20200208103422483.png

  1. 详细设计:绘制程序流程图

web整体框架总流程

20200208104042767.png

最外层流程

20200208104213335.png

程序读取配置文件流程

20200208104058981.png

子进程处理客户端请求流程

20200208104109236.png

服务器初始化流程

20200208104132741.png

正常请求响应流程

20200208104145770.png

响应404流程

20200208104159372.png

4. 编码:编写程序代码


程序编码

  1. 创建TCP并发服务器(多进程、多线程)
  2. 从配置中读取端口号–>将端口号写入配置文件configure中,创建服务器时从配置文件中读取端口号。(在启动服务器时添加-b选项使得服务器工作在守护进程模式)
int sockfd = socket(AF_INET,SOCK_STREAM,0);
  if(-1 == sockfd){
  perror("socket");
  return -1;
  }
  struct sockaddr_in server_addr;
  server_addr.sin_famlily = AF_INET;
  server_addr.sin_port = htons(8080)
  server_addr.sin_addr.s_addr = INADDR_ANY;
  if(bind(sockfd,(struct sockaddr*)&server_addr,
  sizeof(server_addr)) == -1){
  perror("bind");
  return -1;
  }
  listen(sockfd,10);
  //准备和客户端通信的socket套接字
  int client_fd;
  struct sockaddr_in client_addr;
  socklen_t len = sizeof(client_addr);
  client_fd = accept(sockfd,&client_addr,&len);
  //创建子进程fork
  //创建子线程pthread_create
  char buf[1024]={0};
  read(client_fd,buf,1024);
  puts(buf);//客户端发来的请求信息

  1. 接收客户端请求,打印请求数据,了解浏览器发来的请求数据包的内容。
  2. 解析请求数据包,保存必要数据
typedef struct{
   char method[12];//请求方法,GET 
   char path[128]; //请求文件,http、jpg..
   char protocol[20];//请求协议版本,HTTP/1.1
}request_t;

  1. 创建响应头结构体
typedef struct{
   int status;//状态码 200,404
   char protocol;//协议版本,HTTP/1.1
   char file_type[32];//类型信息
}response_t

  1. 从服务器目录(www)查找请求文件是否存在,存在则返回status=200,否则status=404.
  2. 构建响应头
  3.  
协议版本:与请求行获取的协议版本一致
  类型信息:根据请求的文件后缀匹配
  eg:
  如果客户请求是html文件,类型信息为"text/html"
  同理支持如下类型:
  *.html  --> "text/html"
  *.jpg/*.jpeg  --> "image/jpeg"
  *.png  --> "image/png"
  *.gif  --> "image/gif"
  *.css  --> "text/css" 
  ...

  1. 发送响应头给客户端
eg:
write("HTTP/1.1 200 OK\r\n");
write("Content-Type:text/html\r\n");
write("\r\n");

  1. 发送请求的文件
/*
如果status==200,说明请求文件存在,打开文件将文件内容发送给http客户端。
如果status==404,说明请求文件不存在,
发送"www/error.html"
*/
int fd = open("要给浏览器发送的文件");
int bytes_read=0;
int bytes_write=0;
int buffer[1024] = {0};
char* ptr;
while(bytes_read = read(fd,buffer,1024)){
   if(bytes_read == -1){break;}
   else if(bytes_read > 0){
    ptr = buffer;
  while(bytes_write =
  write(client_fd,ptr,bytes_read)){
    if(bytes_write == bytes_read){//写完
      break; 
    }
       else{//只写一部分
        ptr += bytes_write
       bytes_read -= bytes_write;
    }
  }
   }
}

  1. 关闭连接

项目实例

  • 测试结果:

20200208121927477.png


相关文章
|
12天前
|
前端开发 JavaScript 安全
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第27天】本文介绍了HTTP/2和HTTPS在前端性能调优中的应用。通过多路复用、服务器推送和头部压缩等特性,HTTP/2显著提升了Web性能。同时,HTTPS确保了数据传输的安全性。文章提供了示例代码,展示了如何使用Node.js创建一个HTTP/2服务器。
26 3
|
1月前
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
84 1
|
13天前
|
前端开发 安全 应用服务中间件
前端性能调优:HTTP/2与HTTPS在Web加速中的应用
【10月更文挑战第26天】随着互联网的快速发展,前端性能调优成为开发者的重要任务。本文探讨了HTTP/2与HTTPS在前端性能优化中的应用,介绍了二进制分帧、多路复用和服务器推送等特性,并通过Nginx配置示例展示了如何启用HTTP/2和HTTPS,以提升Web应用的性能和安全性。
16 3
|
17天前
|
搜索推荐 安全 网络安全
服务器支持HTTPS的时机和条件
【10月更文挑战第23天】服务器支持HTTPS的时机和条件
12 5
|
1月前
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
35 1
使用Netty实现文件传输的HTTP服务器和客户端
|
11天前
|
存储 Oracle 关系型数据库
oracle服务器存储过程中调用http
通过配置权限、创建和调用存储过程,您可以在Oracle数据库中使用UTL_HTTP包发起HTTP请求。这使得Oracle存储过程可以与外部HTTP服务进行交互,从而实现更复杂的数据处理和集成。在实际应用中,根据具体需求调整请求类型和错误处理逻辑,以确保系统的稳定性和可靠性。
12 0
|
1月前
|
缓存 网络协议 前端开发
Web 性能优化|了解 HTTP 协议后才能理解的预加载
本文旨在探讨和分享多种预加载技术及其在提升网站性能、优化用户体验方面的应用。
|
1月前
|
Java PHP
PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。理解其垃圾回收机制有助于开发高效稳定的PHP应用。
【10月更文挑战第1天】PHP作为广受青睐的服务器端脚本语言,在Web开发中占据重要地位。其垃圾回收机制包括引用计数与循环垃圾回收,对提升应用性能和稳定性至关重要。本文通过具体案例分析,详细探讨PHP垃圾回收机制的工作原理,特别是如何解决循环引用问题。在PHP 8中,垃圾回收机制得到进一步优化,提高了效率和准确性。理解这些机制有助于开发高效稳定的PHP应用。
43 3
|
2月前
|
缓存 移动开发 安全
Web安全-HTTP响应拆分(CRLF注入)漏洞
Web安全-HTTP响应拆分(CRLF注入)漏洞
144 8
|
2月前
|
缓存 安全 应用服务中间件
Web安全-HTTP Host头攻击
Web安全-HTTP Host头攻击
122 7