import socket
import re
import multiprocessing
import threading
import time
from gevent import monkey
import gevent
monkey.patch_all()
def service_client(new_socket):
#receive request from browser
request = new_socket.recv(1024)
request_lines = request.splitlines()
re_request = re.match(r"[^/]+([^ ]*)", request_lines[0])
filename = ""
if re_request:
filename = re_request.group(1)
#return http formal data to browser(header )
try:
f = open("./html" + filename, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response = "\r\n"
response += "----file not found ----"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response = "HTTP/1.1 200 OK\r\n"
response += "\r\n"
new_socket.send(response.encode("utf-8"))
# return http formal data to browser(body)
new_socket.send(html_content)
#close socket
new_socket.close()
def return_fixed_html_file():
#creat socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#bind
tcp_server_socket.bind(("", 7890))
#listen socket
tcp_server_socket.listen(128)
while True:
# waiting new client connection
new_socket, client_addr = tcp_server_socket.accept()
# serving this client
service_client(new_socket)
#close socket
tcp_server_socket.close()
def multitasking():
#creat socket
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#服务器关闭后,不会端口占用
#bind
tcp_server_socket.bind(("", 7890))
#listen socket
tcp_server_socket.listen(128)
while True:
# waiting new client connection
new_socket, client_addr = tcp_server_socket.accept()
# serving this client
'''p = multiprocessing.Process(target=service_client, args=(new_socket,))
p.start()
#fd文件描述符是一个数字,对应特殊文件,例如网络接口
new_socket.close()#子进程复制了new_socket,硬链接只是删除了一个名字。
'''
'''p = threading.Thread(target=service_client, args=(new_socket,))
p.start()'''
gevent.spawn(service_client,new_socket)
#close socket
tcp_server_socket.close()
def unblock():
tcp_server_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_tcp.bind(("", 7890))
tcp_server_tcp.listen(128)
tcp_server_tcp.setblocking(False)#设置套接字为非堵塞方式
client_socket_list = list()
while True:
time.sleep(1)
try:
new_socket, new_addr = tcp_server_tcp.accept()
except Exception as ret:
print("No new client")
else:
print("come a new client")
new_socket.setblocking(False)
client_socket_list.append(new_socket)
for client_socket in client_socket_list:
try:
recv_data = client_socket.recv(1024)
except Exception as ret:
print(ret)
print("no data")
else:
print("no exception")
print(recv_data)
if recv_data:
print("received data")
else:
client_socket.close()
client_socket_list.remove(client_socket)
28.python http协议(protocol)
最新推荐文章于 2024-04-17 17:34:59 发布