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)
输出结果如下


浙公网安备 33010602011771号