GET / HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
Referer: https://www.baidu.com/link?url=cdZ20CLs64GGVwC2sNNSHLSvoAMPLTRx6KIR9CVQNhC&wd=&eqid=a1ccba7c0008aec2000000035ca4396c
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BAIDUID=9FA6BB263924B208BA68DEA4C3ABD186:FG=1; BIDUPSID=9FA6BB263924B208BA68DEA4C3ABD186; PSTM=1552743782; BD_UPN=123353; pgv_pvi=7861436416; BDRCVFR[pNjdDcNFITf]=mk3SLVN4HKm; delPer=0; BD_CK_SAM=1; PSINO=1; H_PS_645EC=3db2WCSX%2BHuf5M7mtADFjV9VhMsd4zAdKkxm6FiVc%2FoKuVdpt0Ht7B%2FXth71feI797N4Xg; BD_HOME=0; H_PS_PSSID=1433_21086_28767_28723_28557_28585_26350_28518_28627_22159
GET的基本没有
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xa303a19400088ceb
Cache-Control: private
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html
Cxy_all: baidu+3cf0032dc188fe88d88948a98bc9c048
Date: Wed, 03 Apr 2019 04:42:32 GMT
Expires: Wed, 03 Apr 2019 04:41:38 GMT
Server: BWS/1.1
Set-Cookie: delPer=0; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1433_21086_28767_28723_28557_28585_26350_28518_28627_22159; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Vary: Accept-Encoding
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked
网页文件(省略)
import socket
def service_client(new_socket):
"""为这个客户端服务"""
# 1.接收浏览器发送过来的请求,即http请求
request = new_socket.recv(1024)
print(request)
# 2.返回http格式的数据给浏览器
# 2.1 准备发送给浏览器---> header
response = "HTTP/1.1 200 ok\r\n"
response += "\r\n"
# 2.2 准备发送给浏览器---> body
response += "lidadsasd
"
new_socket.send(response.encode("utf-8"))
# 3.关闭套接字
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)
tcp_server_socket.bind(("", 8080))
# 3.变为监听套接字
tcp_server_socket.listen(128)
while True:
# 4.等待新用户到来
new_socket,client_addr = tcp_server_socket.accept()
# 5.为这个客户端服务
service_client(new_socket)
tcp_server_socket.close()
if __name__ == '__main__':
main()
def service_client(new_socket):
"""为这个客户端服务"""
# 1.接收浏览器发送过来的请求,即http请求
request = new_socket.recv(1024).decode("utf-8")
request_lines = request.splitlines()
print("")
print(">>"*50)
print(request_lines)
ret= re.match(r"[^/]+(/[^ ]*)", request_lines[0])
file_name = ""
if ret:
file_name = ret.group(1)
print("**"*50,file_name)
if file_name == "/":
file_name = "/index.html"
# 2.返回http格式的数据给浏览器
try:
f = open("./网页" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
# 2.2 准备发送给浏览器---> body
response += "_____file not found______
"
new_socket.send(response.encode("utf-8"))
else:
response = "HTTP/1.1 200 ok\r\n"
response += "\r\n"
html_content = f.read()
f.close()
# 将response header发送给浏览器
new_socket.send(response.encode("utf-8"))
# 将response body发送给浏览器
new_socket.send(html_content)
# 3.关闭套接字
new_socket.close()
print("————————————该用户服务接收——————————————")
import multiprocessing
while True:
# 4.等待新用户到来
new_socket,client_addr = tcp_server_socket.accept()
# 5.为这个客户端服务 创建一个进程
P = multiprocessing.Process(target=service_client, args=(new_socket,))
P.start()
#关闭主进程链接的套接字
new_socket.close()
import threading
while True:
# 4.等待新用户到来
new_socket,client_addr = tcp_server_socket.accept()
# 5.为这个客户端服务 创建一个线程
P = threading.Thread(target=service_client, args=(new_socket,))
P.start()
# 线程之间共享资源
# new_socket.close()
import gevent
from gevent import monkey
monkey.patch_all()
pass
while True:
# 4.等待新用户到来
new_socket,client_addr = tcp_server_socket.accept()
# 5.为这个客户端服务 创建一个进程
gevent.spawn(service_client, new_socket)
# 创建套接字
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 重复使用套接字
tcp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
tcp_server.bind(("", 8080))
tcp_server.listen(128) # 监听套接字
# 设置套接字为非堵塞的方式
tcp_server.setblocking(False)
client_socket_list = list()
while True:
try:
new_socket,new_addr = tcp_server.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("----这个客户端没有发送数据过来----")
else:
if recv_data:
# 对方发送过来数据
print("----这个客户端发送数据过来----")
else:
# 对方调用close
client_socket_list.remove(client_socket)
client_socket.close()
建立连接—>数据传输—>关闭连接
…
…
建立连接—>数据传输—>关闭连接
建立连接—>数据传输…(保持连接)…数据传输—>关闭连接
代码实现: 利用非阻塞链接
def service_client(new_socket,request):
"""为这个客户端服务"""
request_lines = request.splitlines()
print("")
print(">>"*50)
print(request_lines)
ret= re.match(r"[^/]+(/[^ ]*)", request_lines[0])
file_name = ""
if ret:
file_name = ret.group(1)
print("**"*50,file_name)
if file_name == "/":
file_name = "/index.html"
# 2.返回http格式的数据给浏览器
try:
f = open("./网页" + file_name, "rb")
except:
response = "HTTP/1.1 404 NOT FOUND\r\n"
response += "\r\n"
# 2.2 准备发送给浏览器---> body
response += "_____file not found______
"
new_socket.send(response.encode("utf-8"))
else:
html_content = f.read()
f.close()
response_body = html_content
response_header = "HTTP/1.1 200 ok\r\n"
response_header += "Content-Length:%d\r\n" % len(response_body) # 向客服发送接收数据的长度,客户端接收完成自动关闭
response_header += "\r\n"
response = response_header.encode("utf-8") + response_body
# 将response header发送给浏览器
# 将response body发送给浏览器
new_socket.send(response)
# 3.变为监听套接字
tcp_server_socket.listen(128)
tcp_server_socket.setblocking(False) # 将套接字变成非堵塞
# 创建一个epoll对象
epl = select.epoll()
# 将监听套接字对应的fb注册到epoll中
epl.register(tcp_server_socket.fileno(),select.EPOLLIN)
fb_event_dict = dict()
while True:
# 4.等待新用户到来
fb_event_list = epl.poll() # 默认会堵塞,直到os监测数据到来,通过事件通知方式告诉这个程序,解堵塞
# [(fb,event),]
for fb,event in fb_event_list:
# 4.等待新用户到来
if fb == tcp_server_socket.fileno():
new_socket, client_addr = tcp_server_socket.accept()
epl.register(new_socket.fileno(),select.EPOLLIN)
fb_event_dict[new_socket.fileno()] = new_socket
elif event == select.EPOLLIN:
recv_data = fb_event_dict[fb].recv(1024).decode("utf-8")
if recv_data:
# 5.为这个客户端服务
service_client(fb_event_dict[fb], recv_data)
else:
fb_event_dict[fb].close()
epl.unregister(fb)
del fb_event_dict[fb]
print("————————————该用户服务接收——————————————")
tcp_server_socket.close()
如有好的意见,敬请留言告知