下面是一个  多进程 服务器的创建

  1. import socket
  2. import re
  3. import multiprocessing
  4.  
  5. def service_client(new_socket):
  6. """为这个客户端返回数据"""
  7.  
  8. # 1. 接收浏览器发送过来的请求 ,即http请求
  9. # GET / HTTP/1.1
  10. # .....
  11. request = new_socket.recv(1024).decode("utf-8") # 浏览器当收到一个请求之后 由于有图片等(有超链接的) 又会提出新的请求
  12. # print(">>>"*50)
  13. # print(request)
  14.  
  15. request_lines = request.splitlines() # Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
  16. print("")
  17. print(">" * 20)
  18. print(request_lines)
  19.  
  20. # GET /index.html HTTP/1.1
  21. # get post put del
  22. file_name = ""
  23. ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
  24. if ret:
  25. file_name = ret.group(1)
  26. # print("*"*50, file_name)
  27. if file_name == "/":
  28. file_name = "/index.html"
  29.  
  30. # 2. 返回http格式的数据,给浏览器
  31.  
  32. try:
  33. f = open("./html" + file_name, "rb")
  34. except:
  35. response = "HTTP/1.1 404 NOT FOUND\r\n"
  36. response += "\r\n"
  37. response += "------file not found-----"
  38. new_socket.send(response.encode("utf-8"))
  39. else:
  40. html_content = f.read()
  41. f.close()
  42. # 2.1 准备发送给浏览器的数据---header
  43. response = "HTTP/1.1 200 OK\r\n"
  44. response += "\r\n"
  45. # 2.2 准备发送给浏览器的数据---boy
  46. # response += "hahahhah"
  47.  
  48. # 将response header发送给浏览器
  49. new_socket.send(response.encode("utf-8"))
  50. # 将response body发送给浏览器
  51. new_socket.send(html_content)
  52.  
  53. # 关闭套接
  54. new_socket.close()
  55.  
  56. def main():
  57. """用来完成整体的控制"""
  58. # 1. 创建套接字
  59. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  60. tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  61.  
  62. # 2. 绑定
  63. tcp_server_socket.bind(("", 7890))
  64.  
  65. # 3. 变为监听套接字
  66. tcp_server_socket.listen(128)
  67.  
  68. while True:
  69. # 4. 等待新客户端的链接
  70. new_socket, client_addr = tcp_server_socket.accept()
  71.  
  72. # 5. 为这个客户端服务
  73. # service_client(new_socket) # 下面用了多进程的方法代替了这句话
  74. p = multiprocessing.Process(target = service_client, args = (new_socket,))
  75. p.start()
  76. new_socket.close()
  77.  
  78. # 关闭监听套接字
  79. tcp_server_socket.close()
  80.  
  81. if __name__ == "__main__":
  82. main()

下面是一个多进程的  http  服务器

  1. import socket
  2. import re
  3. import threading
  4.  
  5. def service_client(new_socket):
  6. """为这个客户端返回数据"""
  7.  
  8. # 1. 接收浏览器发送过来的请求 ,即http请求
  9. # GET / HTTP/1.1
  10. # .....
  11. request = new_socket.recv(1024).decode("utf-8") # 浏览器当收到一个请求之后 由于有图片等(有超链接的) 又会提出新的请求
  12. # print(">>>"*50)
  13. # print(request)
  14.  
  15. request_lines = request.splitlines() # Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
  16. print("")
  17. print(">" * 20)
  18. print(request_lines)
  19.  
  20. # GET /index.html HTTP/1.1
  21. # get post put del
  22. file_name = ""
  23. ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
  24. if ret:
  25. file_name = ret.group(1)
  26. # print("*"*50, file_name)
  27. if file_name == "/":
  28. file_name = "/index.html"
  29.  
  30. # 2. 返回http格式的数据,给浏览器
  31.  
  32. try:
  33. f = open("./html" + file_name, "rb")
  34. except:
  35. response = "HTTP/1.1 404 NOT FOUND\r\n"
  36. response += "\r\n"
  37. response += "------file not found-----"
  38. new_socket.send(response.encode("utf-8"))
  39. else:
  40. html_content = f.read()
  41. f.close()
  42. # 2.1 准备发送给浏览器的数据---header
  43. response = "HTTP/1.1 200 OK\r\n"
  44. response += "\r\n"
  45. # 2.2 准备发送给浏览器的数据---boy
  46. # response += "hahahhah"
  47.  
  48. # 将response header发送给浏览器
  49. new_socket.send(response.encode("utf-8"))
  50. # 将response body发送给浏览器
  51. new_socket.send(html_content)
  52.  
  53. # 关闭套接
  54. new_socket.close()
  55.  
  56. def main():
  57. """用来完成整体的控制"""
  58. # 1. 创建套接字
  59. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  60. tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  61.  
  62. # 2. 绑定
  63. tcp_server_socket.bind(("", 7890))
  64.  
  65. # 3. 变为监听套接字
  66. tcp_server_socket.listen(128)
  67.  
  68. while True:
  69. # 4. 等待新客户端的链接
  70. new_socket, client_addr = tcp_server_socket.accept()
  71.  
  72. # 5. 为这个客户端服务
  73. # service_client(new_socket) # 下面用了多进程的方法代替了这句话
  74. p = threading.Thread(target = service_client, args = (new_socket,))
  75. p.start()
  76.  
  77. # 关闭监听套接字
  78. tcp_server_socket.close()
  79.  
  80. if __name__ == "__main__":
  81. main()
  1. import socket
  2. import re
  3. import gevent
  4. from gevent import monkey
  5.  
  6. monkey.patch_all()
  7.  
  8. def service_client(new_socket):
  9. """为这个客户端返回数据"""
  10.  
  11. # 1. 接收浏览器发送过来的请求 ,即http请求
  12. # GET / HTTP/1.1
  13. # .....
  14. request = new_socket.recv(1024).decode("utf-8") # 浏览器当收到一个请求之后 由于有图片等(有超链接的) 又会提出新的请求
  15. # print(">>>"*50)
  16. # print(request)
  17.  
  18. request_lines = request.splitlines() # Python splitlines() 按照行('\r', '\r\n', \n')分隔,返回一个包含各行作为元素的列表
  19. print("")
  20. print(">" * 20)
  21. print(request_lines)
  22.  
  23. # GET /index.html HTTP/1.1
  24. # get post put del
  25. file_name = ""
  26. ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
  27. if ret:
  28. file_name = ret.group(1)
  29. # print("*"*50, file_name)
  30. if file_name == "/":
  31. file_name = "/index.html"
  32.  
  33. # 2. 返回http格式的数据,给浏览器
  34.  
  35. try:
  36. f = open("./html" + file_name, "rb")
  37. except:
  38. response = "HTTP/1.1 404 NOT FOUND\r\n"
  39. response += "\r\n"
  40. response += "------file not found-----"
  41. new_socket.send(response.encode("utf-8"))
  42. else:
  43. html_content = f.read()
  44. f.close()
  45. # 2.1 准备发送给浏览器的数据---header
  46. response = "HTTP/1.1 200 OK\r\n"
  47. response += "\r\n"
  48. # 2.2 准备发送给浏览器的数据---boy
  49. # response += "hahahhah"
  50.  
  51. # 将response header发送给浏览器
  52. new_socket.send(response.encode("utf-8"))
  53. # 将response body发送给浏览器
  54. new_socket.send(html_content)
  55.  
  56. # 关闭套接
  57. new_socket.close()
  58.  
  59. def main():
  60. """用来完成整体的控制"""
  61. # 1. 创建套接字
  62. tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  63. tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  64.  
  65. # 2. 绑定
  66. tcp_server_socket.bind(("", 7890))
  67.  
  68. # 3. 变为监听套接字
  69. tcp_server_socket.listen(128)
  70.  
  71. while True:
  72. # 4. 等待新客户端的链接
  73. new_socket, client_addr = tcp_server_socket.accept()
  74.  
  75. # 5. 为这个客户端服务
  76. # service_client(new_socket) # 下面用了携程的方法代替了这句话
  77. gevent.spawn(service_client,new_socket)
  78.  
  79. # 关闭监听套接字
  80. tcp_server_socket.close()
  81.  
  82. if __name__ == "__main__":
  83. main()

18 11 26 用多进程 多线程 携程 实现 http 服务器的创建的更多相关文章

  1. python采用 多进程/多线程/协程 写爬虫以及性能对比,牛逼的分分钟就将一个网站爬下来!

    首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务.一个CPU,在一个时间切片里只能运行一个程序. 从操作系统的角度: 进程和线程,都 ...

  2. python 多进程/多线程/协程 同步异步

    这篇主要是对概念的理解: 1.异步和多线程区别:二者不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段.异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事 ...

  3. Python 多进程 多线程 协程 I/O多路复用

    引言 在学习Python多进程.多线程之前,先脑补一下如下场景: 说有这么一道题:小红烧水需要10分钟,拖地需要5分钟,洗菜需要5分钟,如果一样一样去干,就是简单的加法,全部做完,需要20分钟:但是, ...

  4. [18/11/26] this关键字、static关键字和静态块(及语句块)

    1.this关键字 this的本质就是“创建好的对象的地址”!  由于在构造方法调用前,对象已经创建.因此,在构造方法中也可以使用this代表“当前对象” [用法]   1.  在程序中产生二义性之处 ...

  5. 多线程、多进程、协程、缓存(memcache、redis)

    本节内容: 线程: a:基本的使用: 创建线程: 1:方法 import threading def f1(x): print(x) if __name__=='__main__': t=thread ...

  6. Python爬虫 | 多线程、多进程、协程

    对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了 ...

  7. web服务-2、四种方法实现并发服务器-多线程,多进程,协程,(单进程-单线程-非堵塞)

    知识点:1.使用多线程,多进程,协程完成web并发服务器 2.单进程-单线程-非堵塞也可以实现并发服务器 1.多进程和协程的代码在下面注释掉的部分,我把三种写在一起了 import socket im ...

  8. 也说性能测试,顺便说python的多进程+多线程、协程

    最近需要一个web系统进行接口性能测试,这里顺便说一下性能测试的步骤吧,大概如下 一.分析接口频率 根据系统的复杂程度,接口的数量有多有少,应该优先对那些频率高,数据库操作频繁的接口进行性能测试,所以 ...

  9. Python多线程、多进程和协程的实例讲解

    线程.进程和协程是什么 线程.进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实际使用这三种东西 参考: 进程.线程.协程之概念理解 进程(Process)是计算机中 ...

随机推荐

  1. imple-unpack---攻防世界

    拿到题目查壳没有发现.题目已经明确说了,基本上是有壳的,Linux下面看看 应该就是upx的壳了,下载upx进行脱壳,https://sourceforge.net/projects/upx/file ...

  2. stm32CubeMx CAN 发送数据

    平台  STM32F429 软件  STM32CubeMx 5.0.0 固件库  STM32Cube_FW_F4_V1.23.0 目的: 实现 CAN 的发送 一  简介 CAN是控制器局域网络(Co ...

  3. tools.quartz.about

    官方网站,中文文档,demo,  参考零, 参考一, 参考二, 参考三, 参考四 , 参考五 ,文档下载 .

  4. [Codeforces] #603 (Div. 2) A-E题解

    [Codeforces]1263A Sweet Problem [Codeforces]1263B PIN Code [Codeforces]1263C Everyone is a Winner! [ ...

  5. UVA 12510/CSU 1119 Collecting Coins DFS

    前年的省赛题,难点在于这个石头的推移不太好处理 后来还是看了阳神当年的省赛总结,发现这个石头这里,因为就四五个子,就暴力dfs处理即可.先把石头当做普通障碍,进行一遍全图的dfs或者bfs,找到可以找 ...

  6. jmeter性能测试--浪涌测试

    1.         Ultimate Thread Group 右键测试计划-添加-Theads(Users)-Ultimate Thread Group,如下图1所示 图1 图2 参数说明,如下图 ...

  7. springboot创建bean

    springboot创建bean的方式有两种: 1.直接类上加注解@Component@Controller@Service ... 2.使用@Bean注解配合@Configuration注解 区别是 ...

  8. Sublime和Python中文编码的一些问题

    Windows下的控制台中,应该是这样的逻辑: 1.如果是Unicode字符串的话,首先根据控制台编码进行转换 2.之后进行输出 所以在Windows控制台下,假设str = u'中文', 1.直接p ...

  9. .net Form 的Autoscalemode属性

    .net Form 的Autoscalemode属性如果设置成Font 将会随着系统字体的大小来改变form大小 有时候会造成布局混乱,小心使用

  10. 吴裕雄--天生自然C++语言学习笔记:C++ 动态内存

    栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运 ...