学习Python的日子 Python高级(10)

Python高级
gevent实现并发下载
import gevent
import urllib.request
from gevent import monkey


monkey.patch_all()  # 猴子补丁  将标准库中涉及的IO切换成gevent的




def download(url):
print("GET %s" % url)


response = urllib.request.urlopen(url)  # 获取响应对象


data = response.read()  # 读取响应对象的中数据


print("下载了 %d bytes from %s" % (len(data), url))




def main():
g1 = gevent.spawn(download, "http://www.baidu.com")
g2 = gevent.spawn(download, "http://www.qq.com")
g3 = gevent.spawn(download, "http://www.163.com")


gevent.joinall([g1, g2, g3])




if __name__ == "__main__":
main()


协程
gevent实现TCP服务器

import gevent
from gevent import monkey,socket


monkey.patch_all()


def do_service(new_socket):
while True:
content=new_socket.recv(1024)
if len(content)==0:
print("下线啦")
break
print("接收到:%s" % content.decode("utf-8"))


def main():
server_socket=socket.socket()  # 使用的是gevent中的socket
server_socket.bind(("",8989))
server_socket.listen(5)


while True:
new_socket,new_addr=server_socket.accept()
# 创建一个协程
g1=gevent.spawn(do_service,new_socket)




if __name__=="__main__":
main()


客户端
from socket import *
from threading import Thread


client_socket = socket(AF_INET, SOCK_STREAM)


client_socket.connect(("192.168.28.77", 8989))


client_socket.send("hello".encode("utf-8"))


client_socket.close()
简易服务器
from socket import *


server_socket=socket(AF_INET,SOCK_STREAM)  # 使用的是gevent中的socket
server_socket.bind(("",8989))
server_socket.listen(5)


while True:
new_socket,new_addr=server_socket.accept()


content=new_socket.recv(1024)


print("===>",content)
print(content.decode("utf-8"))
静态服务器的类表示
from socket import *
from threading import Thread
import re




def handle_client(new_socket):
request_data = new_socket.recv(1024)
# print(request_data)
msg = request_data.decode("utf-8")
# print(msg)
list1 = msg.splitlines()
# print(list1[0])
file_name = re.match(r"\w+ +(/[^ ]*)", list1[0]).group(1)  # /hello.html
response_line = "HTTP/1.1 200 OK\r\n"
try:
# 打开文件
if file_name == "/":
fr = open("./index.html", "rb")
# 读取文件
content = fr.read()
else:
fr = open("." + file_name, "rb")
# 读取文件
content = fr.read()  #
except IOError:
fr = open("./error.html", "rb")
# 读取文件
content = fr.read()
response_line = "HTTP/1.1 404 NOT FOUND\r\n"
finally:
# 响应信息


response_header = "Server: ABC server\r\nContent-Type:text/html;charset=utf-8\r\n"
response_body = content.decode("utf-8")


response = response_line + response_header + "\r\n" + response_body


print("服务器响应的内容是:", response)


new_socket.send(response.encode("utf-8"))


new_socket.close()




class HttpServer:
def __init__(self):
self.server_socket = socket(AF_INET, SOCK_STREAM)
self.server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)


def bind(self, port):
self.server_socket.bind(("", port))


def start(self):
self.server_socket.listen(5)


while True:
new_socket, new_addr = self.server_socket.accept()
Thread(target=handle_client, args=(new_socket,)).start()


def stop(self):
self.server_socket.close()




if __name__ == "__main__":
server = HttpServer()  # 创建server对象
server.bind(8080)
server.start()  # 等待客户端的连接


静态web服务器-显示html页面
from socket import *
from threading import Thread
import re




def handle_client(new_socket):
request_data = new_socket.recv(1024)
# print(request_data)
msg = request_data.decode("utf-8")
# print(msg)
list1 = msg.splitlines()
# print(list1[0])
file_name = re.match(r"\w+ +(/[^ ]*)", list1[0]).group(1)  # /hello.html
response_line = "HTTP/1.1 200 OK\r\n"
try:
# 打开文件
if file_name == "/":
fr = open("./index.html", "rb")
# 读取文件
content = fr.read()
else:
fr = open("." + file_name, "rb")
# 读取文件
content = fr.read()  #
except IOError:
fr = open("./error.html", "rb")
# 读取文件
content = fr.read()
response_line = "HTTP/1.1 404 NOT FOUND\r\n"
finally:
# 响应信息


response_header = "Server: ABC server\r\nContent-Type:text/html;charset=utf-8\r\n"
response_body = content.decode("utf-8")


response = response_line + response_header + "\r\n" + response_body


print("服务器响应的内容是:", response)


new_socket.send(response.encode("utf-8"))


new_socket.close()




def main():
server_socket = socket(AF_INET, SOCK_STREAM)  # 使用的是gevent中的socket
server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server_socket.bind(("", 8989))
server_socket.listen(5)


while True:
new_socket, new_addr = server_socket.accept()
# 创建线程对象
Thread(target=handle_client, args=(new_socket,)).start()




if __name__ == "__main__":
main()


静态web服务器
from socket import *
from threading import Thread




def handle_client(new_socket):
request_data = new_socket.recv(1024)
print(request_data)
# 响应信息
response_line = "HTTP/1.1 200 OK\r\n"
response_header = "Server: ABC server\r\nContent-Type:text/html;charset=utf-8\r\n"
response_body = "<html><head><meta http-equiv='Content-Type' content='text/html;charset=utf-8'></head><body>马上可以去吃饭啦!</body></html>"


response = response_line + response_header + "\r\n" + response_body


print("服务器响应的内容是:", response)


new_socket.send(response.encode("utf-8"))
new_socket.close()




def main():
server_socket = socket(AF_INET, SOCK_STREAM)  # 使用的是gevent中的socket
server_socket.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
server_socket.bind(("", 8989))
server_socket.listen(5)


while True:
new_socket, new_addr = server_socket.accept()
# 创建线程对象
Thread(target=handle_client, args=(new_socket,)).start()




if __name__ == "__main__":
main()


动态web服务器
from socket import *
from threading import Thread
import re
import sys




class HttpServer:
def __init__(self):
self.server_socket = socket(AF_INET, SOCK_STREAM)
self.server_socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)


def bind(self, port):
self.server_socket.bind(("", port))


def start(self):
self.server_socket.listen(5)


while True:
new_socket, new_addr = self.server_socket.accept()
Thread(target=self.handle_client, args=(new_socket,)).start()


def stop(self):
self.server_socket.close()


def start_response(self, status, headers):
response_line = "HTTP/1.1 " + status + "\r\n"
response_headers = response_line
for header in headers:
response_headers += "%s:%s" % header + "\r\n"
self.response_header = response_headers


def handle_client(self, new_socket):
request_data = new_socket.recv(1024)
# print(request_data)
msg = request_data.decode("utf-8")
# print(msg)
list1 = msg.splitlines()
# print(list1[0])
file_name = re.match(r"\w+ +(/[^ ]*)", list1[0]).group(1)  # /hello.html   /ctime.py
response_line = "HTTP/1.1 200 OK\r\n"
# response_header = "Server: ABC server\r\nContent-Type:text/html;charset=utf-8\r\n"
if file_name.endswith("py"):  # 动态的文件   xxx.py
print("----->", file_name)
try:
m = __import__(file_name[1:-3])  # import ctime
except:
response_line = "HTTP/1.1 404 NOT FOUND\r\n"
self.response_header = response_line + "Server: ABC server\r\nContent-Type:text/html;charset=utf-8\r\n"
response_body = "文件没有找到,错误啦!"
else:
evn = {}
response_body = m.application(evn, self.start_response)  # 1. 构建响应头和响应行   2. 响应体




else:  # 静态的文件
try:
# 打开文件
if file_name == "/":
fr = open("./index.html", "rb")
# 读取文件
content = fr.read()
else:
fr = open("." + file_name, "rb")
# 读取文件
content = fr.read()  #
except IOError:
fr = open("./error.html", "rb")
# 读取文件
content = fr.read()
response_line = "HTTP/1.1 404 NOT FOUND\r\n"
finally:
# 响应信息
response_body = content.decode("utf-8")


response = self.response_header + "\r\n" + response_body


print("服务器响应的内容是:", response)


new_socket.send(response.encode("utf-8"))


new_socket.close()




if __name__ == "__main__":
sys.path.insert(1, "./wsgi")
server = HttpServer()  # 创建server对象
server.bind(8080)
server.start()  # 等待客户端的连接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值