09 python socket编程
推荐的书籍
弄懂 HTTP、Socket、TCP 这几个概念
五层网络模型
当一个A服务器想一个B服务器通信从上而下经历以下几层
HTTP 要实现不同的功能就要遵守不同的协议 ,HTTP规定了一套协议的规范
socket 类似于一个插座,它是脱离于应用层,使得我们不用关系HTTP协议,直接和TCP和UDP建立链接
TCP 传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。
tcp通信需要经过创建连接、数据传送、终止连接三个步骤。
tcp 传输控制协议,通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,"打电话""
UDP 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地
socket 和 server 实现通信
实现聊天和多用户连接
socket_server.py
import socket import threading server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(('127.0.0.1', 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()
socket_client.py
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请求
使用urllib主要用于url地址解析
#requests -> urlib -> socket 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.1\r\nHost:{}\r\nConnection:close\r\n\r\n".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("\r\n\r\n")[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)
输出结果如下