文章目录一、Socket核心基础概念1. 什么是Socket2. TCP与UDP核心区别面试\实战重点3. Socket核心参数说明二、TCP通信完整实战面向连接、稳定通信1. TCP服务端代码可直接运行2. TCP客户端代码可直接运行3. 运行测试步骤4. TCP核心问题粘包现象与解决什么是粘包粘包解决方案生产通用三、UDP通信完整实战无连接、高速通信1. UDP服务端代码2. UDP客户端代码3. UDP核心特性四、Socket通用高频问题与解决方案1. 端口被占用报错2. 局域网无法通信3. recv接收不到数据、程序卡死4. 中文乱码问题5. TCP客户端异常断开服务端卡死五、TCP与UDP选型实战建议优先使用TCP的场景优先使用UDP的场景六、进阶拓展多线程TCP服务端支持多客户端同时连接本文基于Python原生socket库无需第三方依赖从基础概念、核心区别、TCP双向通信、UDP无连接通信、异常处理、粘包解决、生产避坑全方位实战讲解。所有代码均经过本地实测可直接运行适合零基础自学、面试备考、项目开发落地同时适配搜索引擎收录规则关键词布局合理。一、Socket核心基础概念1. 什么是SocketSocket本质是网络通信的端点是操作系统提供的网络编程接口。程序通过Socket绑定IP和端口实现跨设备、跨网络的数据收发。简单理解IP地址定位设备端口定位程序Socket实现两个程序的数据通道。Python内置socket标准库无需pip安装直接导入即可使用兼容Python3.6所有版本。2. TCP与UDP核心区别面试实战重点对比维度TCP传输控制协议UDP用户数据报协议连接特性面向连接三次握手建立通道无连接无需建立通道直接发包可靠性可靠传输丢包重传、有序到达不可靠无重传机制可能丢包、乱序传输速度较慢有校验、握手开销极速无额外校验开销数据限制流式传输无数据包边界数据报传输单次数据包有限制适用场景文件传输、网页、聊天通信、登录接口要求稳定直播、语音视频、游戏、物联网上报要求速度3. Socket核心参数说明创建Socket固定语法socket.socket(family, type)AF_INETIPv4协议99%场景使用SOCK_STREAMTCP流式套接字SOCK_DGRAMUDP数据报套接字二、TCP通信完整实战面向连接、稳定通信TCP通信必须遵循服务端先启动、客户端后连接的规则流程创建套接字→绑定端口→监听连接→三次握手建立通道→双向收发数据→关闭连接。1. TCP服务端代码可直接运行功能监听本地端口接收客户端连接双向收发消息异常自动容错# tcp_server.pyimportsocket# 1. 创建TCP套接字server_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2. 解决端口复用问题避免重启提示端口被占用server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# 3. 绑定IP和端口空IP代表监听本机所有网卡HOST0.0.0.0PORT8888server_socket.bind((HOST,PORT))# 4. 开启监听参数为最大等待连接数server_socket.listen(5)print(fTCP服务端启动成功监听端口{PORT})whileTrue:# 阻塞等待客户端连接client_conn,client_addrserver_socket.accept()print(f收到客户端连接{client_addr})try:# 循环收发数据whileTrue:# 单次最大接收1024字节数据recv_dataclient_conn.recv(1024)ifnotrecv_data:# 客户端主动断开连接print(f客户端{client_addr}断开连接)break# 字节解码为字符串recv_msgrecv_data.decode(utf-8)print(f接收{client_addr}消息{recv_msg})# 服务端回复消息send_msgf服务端已收到{recv_msg}client_conn.send(send_msg.encode(utf-8))exceptExceptionase:print(f通信异常{e})finally:# 关闭当前客户端连接client_conn.close()2. TCP客户端代码可直接运行# tcp_client.pyimportsocket# 1. 创建TCP套接字client_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2. 连接服务端HOST127.0.0.1PORT8888client_socket.connect((HOST,PORT))try:# 发送消息send_msgHello TCP Socketclient_socket.send(send_msg.encode(utf-8))# 接收服务端回复recv_dataclient_socket.recv(1024)print(服务端回复,recv_data.decode(utf-8))exceptExceptionase:print(连接异常,e)finally:# 关闭套接字client_socket.close()3. 运行测试步骤单独打开终端运行服务端python tcp_server.py再打开新终端运行客户端python tcp_client.py双向数据收发成功即为通信正常4. TCP核心问题粘包现象与解决什么是粘包TCP是流式协议无数据边界连续发送多条短数据时会被系统合并为一次接收导致数据粘连、解析错乱是TCP开发最常见的坑。粘包解决方案生产通用固定报文长度每次收发固定字节数数据首尾分隔符自定义特殊符号分割数据包头部声明长度报文头部携带数据长度精准接收三、UDP通信完整实战无连接、高速通信UDP无需建立连接不用listen、accept直接通过sendto发送数据、recvfrom接收数据代码更简洁传输效率更高。1. UDP服务端代码# udp_server.pyimportsocket# 创建UDP套接字 SOCK_DGRAMudp_serversocket.socket(socket.AF_INET,socket.SOCK_DGRAM)udp_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)# 绑定端口HOST0.0.0.0PORT9999udp_server.bind((HOST,PORT))print(fUDP服务端启动成功监听端口{PORT})whileTrue:# 接收数据客户端地址recv_data,client_addrudp_server.recvfrom(1024)recv_msgrecv_data.decode(utf-8)print(f收到{client_addr}消息{recv_msg})# 原路回复数据send_msgfUDP服务端响应{recv_msg}udp_server.sendto(send_msg.encode(utf-8),client_addr)2. UDP客户端代码# udp_client.pyimportsocket# 创建UDP套接字udp_clientsocket.socket(socket.AF_INET,socket.SOCK_DGRAM)HOST127.0.0.1PORT9999# 发送数据到服务端send_msgHello UDP Socketudp_client.sendto(send_msg.encode(utf-8),(HOST,PORT))# 接收服务端响应recv_data,_udp_client.recvfrom(1024)print(服务端回复,recv_data.decode(utf-8))udp_client.close()3. UDP核心特性无连接客户端无需connect随时发包自带地址接收数据时可直接获取客户端IP和端口无粘包问题UDP是数据报协议数据包独立边界清晰可能丢包网络波动时数据会丢失不适合关键数据传输四、Socket通用高频问题与解决方案1. 端口被占用报错报错信息Address already in use解决方法添加端口复用配置放在bind之前server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)2. 局域网无法通信原因服务端绑定127.0.0.1仅本机访问防火墙拦截端口解决方法绑定0.0.0.0监听所有网卡关闭防火墙或放行对应端口3. recv接收不到数据、程序卡死原因recv是阻塞方法无数据时会一直等待解决方法设置超时时间避免永久阻塞server_socket.settimeout(10) # 10秒无数据自动超时4. 中文乱码问题原因编码格式不统一解决方法统一使用utf-8编码发送encode、接收decode5. TCP客户端异常断开服务端卡死解决方法增加try-except异常捕获断开后自动释放连接继续监听新客户端五、TCP与UDP选型实战建议优先使用TCP的场景文件上传下载、数据同步网页访问、接口请求、账号登录即时聊天、指令下发需要100%送达优先使用UDP的场景视频直播、语音通话、游戏对局物联网设备心跳上报、传感器数据推送高并发低延迟、允许少量数据丢失的场景六、进阶拓展多线程TCP服务端支持多客户端同时连接原生单线程TCP服务端同一时间只能处理一个客户端生产环境需支持多客户端并发搭配多线程实现高并发通信。# 多线程TCP服务端支持多客户端importsocketimportthreading HOST0.0.0.0PORT8888# 客户端处理函数defhandle_client(conn,addr):print(f新客户端接入{addr})whileTrue:try:dataconn.recv(1024)ifnotdata:breakmsgdata.decode(utf-8)print(f{addr}{msg})conn.send(f已接收{msg}.encode(utf-8))except:breakconn.close()print(f客户端{addr}断开连接)if__name____main__:serversocket.socket(socket.AF_INET,socket.SOCK_STREAM)server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)server.bind((HOST,PORT))server.listen(5)print(多线程TCP服务端启动成功)whileTrue:conn,addrserver.accept()# 每个客户端开启独立线程tthreading.Thread(targethandle_client,args(conn,addr))t.daemonTruet.start()