HTTP:
无状态、短连接(connect--请求--响应--断开)
TCP:
不断开
WEB应用:
浏览器(socket客户端,直接使用chrome、ie等)
2.访问网站ip+端口
sk.socket()
sk.connect((ip+端口))
sk.send('hello')
5.接收到‘wellcome’
6.连接断开
网站(socket服务端,需要我们写代码)
1.监听自己的IP+端口
while True:
#等待用户连接
3.收到'hello'
4.响应‘wellcome’
用户断开
服务端最本质代码1.0
import socket
sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(5)
while True:
conn,addr = sock.accetp() # hang住:阻塞等待连接
#获取用户发送的数据
data = conn.recv(8096)
conn.send(b'wellcome123')
conn.close()
升级,按照HTTP协议规则 1.1
HTTP协议:
发送request:
1. request headers:
GET(POST) /index?p=123 HTTP/1.1 # 用\r\n分割
Host: 127.0.0.1:8000
Connection: keep-alive
......................
2.request body: # 请求头和请求体用两个/r/n分割
如果发送POST请求,那数据会放在请求体中。
P=123
响应:
1.response headers响应头
HTTP/1.1 200 OK
Set-Cookie: SessionID=13242342342
............
2.response body响应体
网站返回给访问者的页面内容(浏览器把返回的字符串解析):<html>.........</html>
继续升级,返回动态页面
while True:
conn,addr = sock.accetp() # hang住:阻塞等待连接
#获取用户发送的数据
data = conn.recv(8096)
data = str(data, encoding='utf-8')
# 得到请求头和请求体
headers, bodys = data.split('\r\n\r\n')
# 得到请求头里的数
# GET /index HTTP/1.1
# Host: 127.0.0.1:8000
temp_list = headers.split('\r\n')
#分割请求头第一行,得到方法,url等
#方法 GET, URL /index, HTTP/1.1
method,url,protocal = temp_list[0].split(' ')
#按http协议返回response headers
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
# 根据URL匹配路由
if url == '/index':
#如果匹配到路由,返回指定的页面,实现动态返回
conn.send(b'.......123')
else:
#如果没有匹配到路由返回404页面
conn.send(b'404 not found')
conn.close()
继续升级,根据路由调用函数并根据用户请求数据在函数中进行逻辑处理,返回动态页面。(已经近似django的处理)
def f1(request):
return b'f1'
def f2(request):
return b'f2'
routers = [
('/xxx', f1),
('/ooo', f2),
]
def run():
sock = socket.socket()
sock.bind(('127.0.0.1', 8080))
sock.listen(5)
while True:
conn,addr = sock.accetp() # hang住:阻塞等待连接
#获取用户发送的数据
data = conn.recv(8096)
data = str(data, encoding='utf-8')
# 得到请求头和请求体
headers, bodys = data.split('\r\n\r\n')
# 得到请求头里的数
# GET /index HTTP/1.1
# Host: 127.0.0.1:8000
temp_list = headers.split('\r\n')
#分割请求头第一行,得到方法,url等
#方法 GET, URL /index, HTTP/1.1
method,url,protocal = temp_list[0].split(' ')
#按http协议返回response headers
conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
# 遍历routers,进行路由匹配
func_name = None
for item in routers:
if item[0] = url:
func_name = item[1]
break
if func_name:
response = func_name()
else:
response = '404 not found'
conn.send(response)
conn.close()
if __name__ == '__main__':
run()