套接字
说起套接字,我们得先知道什么是TCP,TCP协议对于web开发人员来讲那是最熟悉不过的,它是OSI七层网络模型中的传输层,是一种可靠的点对点传输。具体为什么这么可靠,我准备下一篇文章单独讲讲,因为发现是面试必问,并且有些面试官会问的很细很细。
如果把TCP比喻成一条马路的话,那么套接字就是在马路上的车辆。实现货物得点对点传输。
规范点说:所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。
python模拟一个socket连接
socket编程流程图如下
web框架中实现的socket一般不负责通信,socket一般是用运行服务器的容器去运行的。python中一般用uwsgi实现socket协议,用于和nginx通信。所以说这里来得web框架一般不用socket通信,而只是我们为了模拟socket连接过程而去这么写。
>>>延申:uwsgi是什么,和wsgi有什么关系,不多说,直接上图,如下图:
代码如下:
server端:
import socket
import threading
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('0.0.0.0', 8000))
server.listen()
def handle_sock(sock, addr):
while True:
data = sock.recv(1024)
print(data.decode("utf8"))
re_data = input()
sock.send(re_data.encode("utf8"))
#获取从客户端发送的数据
#一次获取1k的数据
while True:
sock, addr = server.accept()
#用线程去处理新接收的连接(用户)
client_thread = threading.Thread(target=handle_sock, args=(sock, addr))
client_thread.start()
客户端:
import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
while True:
re_data = input()
client.send(re_data.encode("utf8"))
data = client.recv(1024)
print(data.decode("utf8"))
socket模拟http请求
请求层级:#requests -> urlib -> socket
http对于大家来说想必很容易理解,这里直接上代码。
import socket from urllib.parse import urlparse
def get_url(url): #通过socket请求html url = urlparse(url) host = url.netloc path = url.path if path == "": path = "/"
#建立socket连接 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # client.setblocking(False) client.connect((host, 80)) #阻塞不会消耗cpu
#不停的询问连接是否建立好, 需要while循环不停的去检查状态 #做计算任务或者再次发起其他的连接请求
client.send("GET {} HTTP/1.1rnHost:{}rnConnection:closernrn".format(path, host).encode("utf8"))
data = b"" while True: d = client.recv(1024) if d: data = d else: break
data = data.decode("utf8") # 去掉请求头 html_data = data.split("rnrn")[1] print(html_data) client.close()
if __name__ == "__main__": import time start_time = time.time() for url in range(20): url = "http://shop.projectsedu.com/goods/{}/".format(url) get_url(url) print(time.time()-start_time)