多进程操作:
# -*-UTF-8-*-
# -lv wq --
# 多进程
import multiprocessing
import socket
def service_client(new_socket):
request = new_socket.recv(1024).decode("utf-8")
# print(request)
# print("#"*50)
# print(type(request))
request_lines = request.split(" ", maxsplit=2)
file_name = request_lines[1]
if file_name == "/":
file_name = "/index.html"
try:
f = open("../day01/html" + file_name, 'rb')
except:
response_head = "HTTP/1.1 404 NOT FOUND\r\n"
response_head += '\r\n'
response_body = "-----file not found ------".encode("utf-8")
new_socket.send(response_head.encode("utf-8")) # 类型为字符串
new_socket.send(response_body) # 类型为二进制
else:
response_body = f.read()
f.close()
response_head = "HTTP/1.1 200 OK\r\n"
# 分割http响应头和响应body
response_head += '\r\n'
new_socket.send(response_head.encode("utf-8")) # 类型为字符串
new_socket.send(response_body) # 类型为二进制
new_socket.close()
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定
tcp_server_socket.bind(("", 9999))
# 3.监听套接字
tcp_server_socket.listen(128)
while True:
# 4.等待连接
new_socket, client_addr = tcp_server_socket.accept()
p = multiprocessing.Process(target=service_client,args=(new_socket,))
p.start()
#service_client(new_socket)
new_socket.close()
# 关闭监听套接字
tcp_server_socket.close()
if __name__ == '__main__':
main()
多线程操作:
# -*-UTF-8-*-
# -lv wq --
# 多线程
import socket
import threading
def service_client(new_socket):
request = new_socket.recv(1024).decode("utf-8")
# print(request)
# print("#"*50)
# print(type(request))
try:
request_lines = request.split(" ", maxsplit=2)
file_name = request_lines[1]
if file_name == "/":
file_name = "/index.html"
try:
f = open("../day01/html" + file_name, 'rb')
except:
response_head = "HTTP/1.1 404 NOT FOUND\r\n"
response_head += '\r\n'
response_body = "-----file not found ------".encode("utf-8")
new_socket.send(response_head.encode("utf-8")) # 类型为字符串
new_socket.send(response_body) # 类型为二进制
else:
response_body = f.read()
f.close()
response_head = "HTTP/1.1 200 OK\r\n"
# 分割http响应头和响应body
response_head += '\r\n'
new_socket.send(response_head.encode("utf-8")) # 类型为字符串
new_socket.send(response_body) # 类型为二进制
except IndexError:
pass
new_socket.close()
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定
tcp_server_socket.bind(("", 9999))
# 3.监听套接字
tcp_server_socket.listen(128)
while True:
# 4.等待连接
new_socket, client_addr = tcp_server_socket.accept()
p = threading.Thread(target=service_client,args=(new_socket,))
p.start()
#service_client(new_socket)
# 关闭监听套接字
tcp_server_socket.close()
if __name__ == '__main__':
main()
并发协程操作:
import socket
# 单进程非阻塞并发
# 协程
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定
tcp_server_socket.bind(("", 9999))
# 3.监听套接字
tcp_server_socket.listen(128)
tcp_server_socket.setblocking(False) # 设置套接字为非阻塞的方式
client_socket_list = list()
while True:
# 4.等待连接
try:
new_socket, client_addr = tcp_server_socket.accept()
except Exception as ret:
print("---没有新的客户端到来---")
else:
print("---来了个新的客户端---")
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("---这个客户端没有发送数据---")
else:
print("---没有异常的---")
print(recv_data)
if recv_data:
# 对方发送过来数据
print("客户端发送过来了数据")
else:
# 对方调用close,导致recv的返回
client_socket.close()
client_socket_list.remove(client_socket)
print("--客户端已经关闭--")
以上都是短链接的连接方式,而下面这种发送是属于长链接,用于提高多用户并发访问的速率:
# 非阻塞长链接
import socket
import re
def service_client(new_socket, recv_data):
request = recv_data.decode("utf-8")
# print(request)
# print("#"*50)
# print(type(request))
request_lines = request.split(" ", maxsplit=2)
file_name = request_lines[1]
if file_name == "/":
file_name = "/index.html"
try:
f = open("../day01/html" + file_name, 'rb')
except:
response_head = "HTTP/1.1 404 NOT FOUND\r\n"
response_head += '\r\n'
response_body = "-----file not found ------".encode("utf-8")
new_socket.send(response_head.encode("utf-8")) # 类型为字符串
new_socket.send(response_body) # 类型为二进制
else:
response_body = f.read()
f.close()
response_head = "HTTP/1.1 200 OK\r\n"
response_head += "Content-Length: %d\r\n" % len(response_body)
# 分割http响应头和响应body
response_head += '\r\n'
new_socket.send(response_head.encode("utf-8")) # 类型为字符串
new_socket.send(response_body) # 类型为二进制
# new_socket.close()
# 非阻塞协程
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定
tcp_server_socket.bind(("", 9999))
# 3.监听套接字
tcp_server_socket.listen(128)
tcp_server_socket.setblocking(False) # 设置套接字为非阻塞的方式
client_socket_list = list()
while True:
# 4.等待连接
try:
new_socket, client_addr = tcp_server_socket.accept()
except Exception as ret:
pass
else:
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:
pass
else:
if recv_data:
service_client(client_socket, recv_data)
else:
client_socket.close()
client_socket_list.remove(client_socket)
# 关闭监听套接字
tcp_server_socket.close()
def read_html(file_path):
file = open(file_path, 'rb')
file_data = file.read()
file.close()
return file_data
if __name__ == '__main__':
main()