Socket网络编程:TCP/UDP原理、服务端与客户端手写实战
博客导语
Socket是所有网络请求的底层,HTTP、爬虫、接口请求本质都是封装后的Socket通信。90%爬虫开发者只会调库不懂底层,遇到粘包、断连、超时问题完全无从下手。本文从零手写TCP、UDP服务端与客户端,吃透网络通信底层逻辑。
一、Socket核心概念
Socket(套接字)是操作系统提供的网络通信接口,通过「IP+端口」实现跨设备数据传输。
两大主流协议:
TCP:面向连接、可靠、三次握手、四次挥手、无数据丢失、流式传输
UDP:无连接、不可靠、速度快、数据包传输、适合直播/语音
二、TCP通信完整实战(一对一通信)
TCP服务端
import socket # 1. 创建socket对象 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定IP和端口 server.bind(("127.0.0.1", 8888)) # 3. 开启监听 server.listen(5) print("服务端启动成功,等待客户端连接...") # 4. 等待客户端连接 conn, addr = server.accept() print(f"客户端{addr}已连接") # 5. 收发数据 while True: data = conn.recv(1024).decode("utf-8") if not data: break print("收到客户端消息:", data) conn.send("服务端已收到!".encode("utf-8")) conn.close() server.close()TCP客户端
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(("127.0.0.1", 8888)) client.send("Hello Socket".encode("utf-8")) res = client.recv(1024).decode("utf-8") print("服务端回复:", res) client.close()三、UDP通信实战(无连接通信)
UDP服务端
import socket server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind(("127.0.0.1", 9999)) while True: data, addr = server.recvfrom(1024) print("收到消息:", data.decode("utf-8")) server.sendto("UDP收到".encode("utf-8"), addr)UDP客户端
import socket client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client.sendto("UDP测试消息".encode("utf-8"), ("127.0.0.1", 9999))四、高频面试&避坑总结
TCP面向连接、可靠、有序;UDP无连接、高效、可能丢包
TCP存在粘包问题,UDP无粘包
爬虫、HTTP、接口全部基于TCP
