内容摘要
1. 自己开发web框架
(1)tcpip、socket、http
tcpip是协议,是约定好的规范,位于网络5层模型的传输层。tcpip表示的是一系列协议。
规定好的协议总要操作系统实现了才能使用,而socket就是操作系统实现的,tcpip协议族的接口,用于创建一个套接字,可以理解为,通过网络读写的文件描述符,socket、bind、listen、accept、connect一系列都是操作系统提供的接口用于实现tcp协议相关的功能。
tcp协议可以让两个进程通过三次握手建立稳定的通信信道,发送字节流,而http协议建立在tcp协议之上,也就是说tcp协议可以让两个程序说话,而http协议定义了说话的规则。
总结:http连接=以http协议为通信协议的tcp连接http短连接=以http协议为通信协议的,请求一次就断开的tcp连接http长连接=以http协议为通信协议的,请求多次才断开的tcp连接(这个是为了通过减少建立tcp连接的次数达到节省两端资源的目的)
(2) socket通讯实践
服务端: 1、创建socket对象 2、bing 绑定ip及端口 3、对该端口进行监听 4、消息阻塞(等待客户端消息)
客户端: 1、创建socket对象 2、连接服务ip及端口 3、发送消息到服务器ip
python 的socket通信,要使用socket内置包: 服务端代码:
import socket
addr_ip = ('127.0.0.1',8005)
sk = socket.socket()
sk.bind(addr_ip)
sk.listen(5)
print('Service waiting.....')
conn,addr = sk.accept()
while True:
client_msg =conn.recv(1024)
print(str(client_msg))
send_msg = raw_input('发送消息:')
if send_msg !='exit':
conn.sendall('服务小强:'+send_msg)
else:
break
conn.close()
客户端代码:
import socket
addr_ip = ('127.0.0.1',8005)
sk = socket.socket()
sk.connect(addr_ip)
while True:
send_msg = raw_input('发送消息:')
if send_msg!='exit':
sk.sendall('客户小强:'+send_msg)
server_rev = sk.recv(1024)
print(str(server_rev))
else:
break
sk.close()
或者客户端使用浏览器代替。只需要编写服务端代码。
(2) HTML知识
如果用http请求的话,可以看到socket给回复的http请求是有固定格式的,叫http格式,分为head和body。 请求有请求头和请求体,如下所示:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: keep-alive
Cookie: BAIDUID=DDD39E6ED8BF5EC7AA901AEE453F3DCA:FG=1; PSTM=1626776433; BIDUPSID=B1CCC86FDCF9A94035AE6286A7AF3496; COOKIE_SESSION=113_0_1_2_13_1_0_0_1_1_0_0_92_0_10_0_1626777030_0_1626777020%7C2%230_0_1626777020%7C1; __yjs_duid=1_055e63905e8f03baae63733c7fb9b7a61626777591872; BAIDUID_BFESS=8AC53B89312FB662003EC68D19BE9505:FG=1
Host: www.baidu.com
sec-ch-ua: " Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"
sec-ch-ua-mobile: ?0
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36
响应也有响应头和响应体: 其中响应头如下: 响应体则为html显示的内容,本质为字符串。是浏览器认识字符串的格式,所以翻译成了浏览器显示的样子。 响应头和响应体之间用\r\n\r\n分割
accept-ranges: bytes
access-control-allow-origin: *
age: 162355
content-length: 7456
content-type: image/webp
date: Fri, 10 Sep 2021 03:08:48 GMT
etag: 9aa9cc8baa06417d516126122dae4b19
expires: Wed, 06 Oct 2021 11:48:31 GMT
last-modified: Thu, 01 Jan 1970 00:00:00 GMT
ohc-cache-hit: tj3un64 [4], czix227 [4]
ohc-file-size: 7456
server: JSP3/2.0.14
timing-allow-origin: *
(3)数据库(pymysql、SQLAlchemy)
2. Django框架
|