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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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
1 2 3 4 5 6 7 8 | 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地址解析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #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) |
输出结果如下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理