老男孩python学习自修第二十一天【socket】
1. 使用python编写一个静态的web服务器,能够处理静态页面的http请求
原理:
a. 使用socket进行服务端和浏览器之间的通信
b. 使用多线程处理多个客户端浏览器的请求
c. 解析用户请求并使用http协议发送响应数据
实现:
# coding:UTF-8 import socket import re from multiprocessing import Process def handle_request(client_socket): # 定义html服务器根目录 HTML_ROOT_DIR = "./html" # 接收用户的请求 request_data = client_socket.recv(1024) # 解析用户的请求 request_lines = request_data.splitlines() request_first_line = request_lines[0].decode("UTF-8") # 使用正则表达式取出请求的文件名 file_name = re.match(r"\w+ +(/[^ ]*) ", request_first_line).group(1) # 默认请求的文件名为index.html if "/" == file_name: file_name = "/index.html" file_path = HTML_ROOT_DIR + file_name # 读取请求资源的内容, 并构造响应报文 try: file = open(file_path, "rb") except IOError: response_first_line = "HTTP/1.1 404 Not Found\r\n" response_headers = "Server: My Web Static Server\r\n" response_body = "file is not found" response = response_first_line + response_headers + "\r\n" + response_body else: data = file.read() file.close() response_first_line = "HTTP/1.1 200 OK\r\n" response_headers = "Server: My Web Static Server\r\n" response_body = data.decode("UTF-8") response = response_first_line + response_headers + "\r\n" + response_body # 发送响应报文 client_socket.send(bytes(response, encoding="UTF-8")) # 关闭socket连接资源 client_socket.close() if __name__ == "__main__": '''这是主函数程序运行入口,如果该文件被当做模块导入则不执行''' # 创建一个服务端的socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置服务端socket重复利用端口地址 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定服务端socket的端口 server_socket.bind(("",8001)) # 设置服务端socket最大同时响应128个客户端请求 server_socket.listen(128) # 服务端永久等待客户端的请求, 来一个客户端请求则创建一个新的线程响应一个请求 while True: client_socket, client_address = server_socket.accept() print('["%s", "%s"]用户已经连接上服务器!' % client_address) handler = Process(target=handle_request, args=(client_socket,)) handler.start() client_socket.close()
老男孩python学习自修第二十一天【socket】的更多相关文章
- 老男孩 python学习自修第二十二天【文件上传与下载】
1.使用socket实现文件上传 server.py #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import os import SocketServe ...
- 老男孩python学习自修第二十四天【多进程】
1. 体验多进程的运行速度 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from multiprocessing import Pool import t ...
- 老男孩python学习自修第二十三天【多线程】
1. 线程的创建与运行 #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from threading import Thread def foo(param1 ...
- 老男孩python学习自修第十九天【异常处理】
1.常见的错误 TypeError 类型错误 NameError 没有该变量 ValueError 不期望的值 AttributeError 没有该属性 UnboundLocalError 没有该局部 ...
- 老男孩python学习自修第十八天【面向对象】
1.类与对象(构造方法与实例化) #!/usr/bin/env python # _*_ coding:UTF-8 _*_ class Province: def __init__(self, nam ...
- 老男孩python学习自修第十七天【装饰器】
装饰器:在某个方法执行前后去执行其他新定义的行为 例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def before_say_hello(): pr ...
- 老男孩python学习自修第十六天【常用模块之sys和os】
例子: sys.argv 命令行参数List,第一个元素是程序本身路径 sys.exit(n) 退出程序,正常退出时exit(0) sys.version 获取Python解释程序的版本信息 sys. ...
- 老男孩python学习自修第十五天【常用模块之time】
例如: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ import time if __name__ == "__main__": pr ...
- 老男孩python学习自修第十四天【序列化和json】
序列化是使用二进制的方式加密列表,字典或集合,反序列化是解密的过程:序列化开启了两个独立进程进行数据交互的通路 使用pickle进行序列化和反序列化 例如: pickle_test.py #!/usr ...
随机推荐
- Spring Boot设置上传文件大小
可以使用配置文件配置,也可以使用Bean在启动类中配置 配置文件为application.properties格式: spring.http.multipart.maxFileSize=10Mb sp ...
- python:while循环、运算符、初始编码
while循环 while -- 关键字 while 条件: 缩进代码块 以上循环是(死循环) 终止循环的方法 1.break 跳出循环,并且把循环给干掉了 2.continue 跳出本次循环,继续下 ...
- DAO层基础设计原理
在实际的开发中有一种项目的程序组织架构方案叫做MVC模式,按照程序 的功能将他们分成三个层,如下图 Modle层(模型层).View层(显示层).Controller层(控制层). Modle层:可以 ...
- open-falcon之使用mail-provider发邮件(支持smtp SSL协议)
一.首先确定go语言安装环境配置好 1.进入官网下载源码包 https://golang.org/dl/ 2.解压缩,配置环境变量 在/etc/profile最后加上export PATH=$PATH ...
- WebApi测试工具:SAEA.RESTED
写好一个Api接口不知道怎么测试?试试SAEA.RESTED吧——无需任何代码.不污染主项目.快速上手.不依赖IIS,可供多人共享使用!下面就跟着本文查看如何使用吧:1.下载安装:https://gi ...
- WPF效果(GIS三维篇)
二维的GIS已经被我玩烂了,紧接着就是三维了,哈哈!先来看看最简单的效果:
- React-菜鸟学习笔记(二)
这篇新颖的东西是React的组件的封装和引用 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- Linux Namespace : Network
Network namespace 在逻辑上是网络堆栈的一个副本,它有自己的路由.防火墙规则和网络设备.默认情况下,子进程继承其父进程的 network namespace.也就是说,如果不显式创建新 ...
- 深入理解Redis Cluster
Redis Cluster采用虚拟槽分区,所有的key根据哈希函数映射到0~16383槽内,计算公式: slot = CRC16(key) & 16383 每个节点负责维护一部分槽以及槽所映射 ...
- UART、SPI和I2C详解
做单片机开发时UART,SPI和I2C都是我们最经常使用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细的解释. UART UART是一种通用串行数据总线,用于异步通信.该总线双向通信,可以 ...