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