个人笔记:主要包括固定页面 指定页面http服务器 多进程网页http服务器 多线程网页http服务器
①固定页面的http服务器
import socket
def service_client(new_server_socket):
"""為这个客户端返回数据"""
# 1 接收客户端/浏览器 的数据
request = new_server_socket.recv(1024)
print(request.decode("utf-8"))
# 2 返回http 格式的数据 给浏览器
# 准备发送给浏览器的数据 --header
response = "HTTP/1.1 200 OK \r\n"
response += "\r\n"
# 准备发送给浏览器的数据body
response += "<h1>测试数据。<h1>"
new_server_socket.send(response.encode("gbk"))
# 关闭套接字
new_server_socket.close()
print("$"*50)
def main_send():
# 创建TCP套接字对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置当服务器先close 即服务器4次挥手后资源能够立即释放 这样保证下次运行程序可立即执行
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地信息
tcp_socket.bind(("", 7890))
# 让默认的套接字由主动变为被动 监听套接字负责客户端链接
tcp_socket.listen(128)
while True:
# 等待客户端的链接 accept返回值是个元祖(套接字 负责客户端服务 + 客户端地址)
new_server_socket, client_addr = tcp_socket.accept()
print(client_addr)
# 为这个客户端服务
service_client(new_server_socket)
# 关闭监听套接字
tcp_socket.close()
if __name__ == '__main__':
main_send()
②所需HTML页面的服务器
import socket
import re
def service_client(new_server_socket):
"""為这个客户端返回数据"""
# 1 接收客户端/浏览器 的数据
global file_name
request = new_server_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print("-"*39)
print(request_lines)
# 通过正则获取网页名称
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
# 若只输入端口号 则返回主页
if file_name =="/":
file_name = "/index.html"
# 2 返回http 格式的数据 给浏览器
try:
# 当前html目录下打开指定文件
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "file not found"
new_server_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 OK \r\n"
response += "\r\n"
# 准备发送给浏览器的数据body
new_server_socket.send(response.encode ( "utf-8" ) )
new_server_socket.send(html_content )
# 关闭套接字
new_server_socket.close()
def main_send():
# 创建TCP套接字对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置当服务器先close 即服务器4次挥手后资源能够立即释放 这样保证下次运行程序可立即执行
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地信息
tcp_socket.bind(("", 7890))
# 让默认的套接字由主动变为被动 监听套接字负责客户端链接
tcp_socket.listen(128)
while True:
# 等待客户端的链接 accept返回值是个元祖(套接字 负责客户端服务 + 客户端地址)
new_server_socket, client_addr = tcp_socket.accept()
print(client_addr)
# 为这个客户端服务
service_client(new_server_socket)
# 关闭监听套接字
tcp_socket.close()
if __name__ == '__main__':
main_send()
③多进程网页http服务器
import socket
import re
import multiprocessing
def service_client(new_server_socket):
"""為这个客户端返回数据"""
# 1 接收客户端/浏览器 的数据
global file_name
request = new_server_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print("-"*39)
print(request_lines)
# 通过正则获取网页名称
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
# 若只输入端口号 则返回主页
if file_name =="/":
file_name = "/index.html"
# 2 返回http 格式的数据 给浏览器
try:
# 当前html目录下打开指定文件
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "file not found"
new_server_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 OK \r\n"
response += "\r\n"
# 准备发送给浏览器的数据body
new_server_socket.send(response.encode ( "utf-8" ) )
new_server_socket.send(html_content )
# 关闭套接字
new_server_socket.close()
def main_send():
# 创建TCP套接字对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置当服务器先close 即服务器4次挥手后资源能够立即释放 这样保证下次运行程序可立即执行
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地信息
tcp_socket.bind(("", 7890))
# 让默认的套接字由主动变为被动 监听套接字负责客户端链接
tcp_socket.listen(128)
while True:
# 等待客户端的链接 accept返回值是个元祖(套接字 负责客户端服务 + 客户端地址)
new_server_socket, client_addr = tcp_socket.accept()
print(client_addr)
# 新的进程new_server_socket服务
# 为这个客户端服务
p = multiprocessing.Process(target=service_client, args=(new_server_socket,))
p.start()
# 关闭主进程的套接字
new_server_socket.close()
# 关闭监听套接字
tcp_socket.close()
if __name__ == '__main__':
main_send()
④多线程网页http服务器
import socket
import re
import threading
def service_client(new_server_socket):
"""為这个客户端返回数据"""
# 1 接收客户端/浏览器 的数据
global file_name
request = new_server_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print("-"*39)
print(request_lines)
# 通过正则获取网页名称
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
# 若只输入端口号 则返回主页
if file_name =="/":
file_name = "/index.html"
# 2 返回http 格式的数据 给浏览器
try:
# 当前html目录下打开指定文件
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "file not found"
new_server_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 OK \r\n"
response += "\r\n"
# 准备发送给浏览器的数据body
new_server_socket.send(response.encode ( "utf-8" ) )
new_server_socket.send(html_content )
# 关闭套接字
new_server_socket.close()
def main_send():
# 创建TCP套接字对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置当服务器先close 即服务器4次挥手后资源能够立即释放 这样保证下次运行程序可立即执行
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地信息
tcp_socket.bind(("", 7890))
# 让默认的套接字由主动变为被动 监听套接字负责客户端链接
tcp_socket.listen(128)
while True:
# 等待客户端的链接 accept返回值是个元祖(套接字 负责客户端服务 + 客户端地址)
new_server_socket, client_addr = tcp_socket.accept()
print(client_addr)
# 新的进程new_server_socket服务
# 为这个客户端服务
p = threading.Thread(target=service_client, args=(new_server_socket,))
p.start()
# 关闭监听套接字
tcp_socket.close()
if __name__ == '__main__':
main_send()
⑤协程网页http服务器
import socket
import re
import gevent
from gevent import monkey
monkey.patch_all()
def service_client(new_server_socket):
"""為这个客户端返回数据"""
# 1 接收客户端/浏览器 的数据
global file_name
request = new_server_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print("-"*39)
print(request_lines)
# 通过正则获取网页名称
ret = re.match(r"[^/]+(/[^ ]*)", request_lines[0])
if ret:
file_name = ret.group(1)
# 若只输入端口号 则返回主页
if file_name =="/":
file_name = "/index.html"
# 2 返回http 格式的数据 给浏览器
try:
# 当前html目录下打开指定文件
f = open("./html" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
response += "file not found"
new_server_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 OK \r\n"
response += "\r\n"
# 准备发送给浏览器的数据body
new_server_socket.send(response.encode ( "utf-8" ) )
new_server_socket.send(html_content )
# 关闭套接字
new_server_socket.close()
def main_send():
# 创建TCP套接字对象
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置当服务器先close 即服务器4次挥手后资源能够立即释放 这样保证下次运行程序可立即执行
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 绑定本地信息
tcp_socket.bind(("", 7890))
# 让默认的套接字由主动变为被动 监听套接字负责客户端链接
tcp_socket.listen(128)
while True:
# 等待客户端的链接 accept返回值是个元祖(套接字 负责客户端服务 + 客户端地址)
new_server_socket, client_addr = tcp_socket.accept()
print(client_addr)
# 新的进程new_server_socket服务
# 为这个客户端服务
gevent.spawn(service_client, new_server_socket)
if __name__ == '__main__':
main_send()