Python Socket入门学习

发布时间:2026/7/25 19:23:44
Python Socket入门学习 前言网络编程是后端开发、爬虫、内网穿透、即时通讯等场景的基础而Socket就是实现网络通信最核心的接口。很多初学者刚接触网络编程时会被TCP、UDP、IP、端口等概念搞得一头雾水。本篇从基础概念出发使用原生Python标准库socket从零搭建服务端与客户端通信示例带你快速上手Socket编程。前置要求掌握Python基础语法无需深入网络底层原理。Python内置socket模块不需要额外pip安装。一、什么是SocketSocket套接字可以理解为网络上两个程序通信的端点。两台主机想要互相传递数据一端开启服务监听另一端发起连接依靠IP地址端口唯一标识一个Socket通信通道。两种最常用通信协议TCP面向连接、可靠通信数据不会丢失、顺序不变。通信前必须建立连接三次握手文件传输、聊天软件大多使用TCP。UDP无连接、不可靠通信不用建立连接发送速度快适合直播、语音通话、广播场景可能丢包。Pythonsocket库同时支持TCP与UDP套接字。二、TCP通信完整示例重点TCP通信流程服务端创建socket → 绑定IP端口(bind) → 开始监听(listen) → 阻塞等待连接(accept) → 收发数据客户端创建socket → 连接服务端(connect) → 收发数据2.1 TCP服务端代码 server.pyimportsocket# 1. 创建TCP套接字 SOCK_STREAM代表TCPserver_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 2. 绑定地址与端口0.0.0.0代表监听本机所有网卡HOST0.0.0.0PORT8888server_socket.bind((HOST,PORT))# 3. 开启监听参数为允许等待的最大连接数server_socket.listen(5)print(f服务端启动成功监听端口{PORT})# 4. 循环等待客户端接入whileTrue:# accept()阻塞直到有客户端连接conn,addrserver_socket.accept()print(f新客户端接入{addr})# 接收客户端数据缓冲区大小1024字节dataconn.recv(1024)ifnotdata:conn.close()continueprint(收到客户端消息,data.decode(utf-8))# 向客户端发送响应resp服务端已收到你的消息conn.send(resp.encode(utf-8))# 关闭当前客户端连接conn.close()2.2 TCP客户端代码 client.pyimportsocket# 创建TCP套接字client_socketsocket.socket(socket.AF_INET,socket.SOCK_STREAM)# 连接服务端地址HOST127.0.0.1PORT8888client_socket.connect((HOST,PORT))# 发送数据socket只能传输字节流字符串需要encode编码msgHello Socket!client_socket.send(msg.encode(utf-8))# 接收服务端返回消息recv_dataclient_socket.recv(1024)print(收到服务端响应,recv_data.decode(utf-8))# 关闭套接字client_socket.close()运行测试终端先运行服务端python server.py新开终端运行客户端python client.py输出效果服务端控制台 服务端启动成功监听端口8888 新客户端接入(127.0.0.1, 51234) 收到客户端消息 Hello Socket! 客户端控制台 收到服务端响应 服务端已收到你的消息⚠️ 注意要点Socket传输只有bytes字节流字符串必须encode()接收后使用decode()解码127.0.0.1仅本机访问想要局域网其他设备连接服务端绑定0.0.0.0客户端填写服务端局域网IP端口不能被其他程序占用占用会抛出OSError。三、UDP通信示例UDP不需要建立连接不需要listen和accept收发更加轻量化。UDP服务端 udp_server.pyimportsocket# SOCK_DGRAM 代表UDPudp_serversocket.socket(socket.AF_INET,socket.SOCK_DGRAM)udp_server.bind((0.0.0.0,9999))print(UDP服务端启动端口9999)whileTrue:data,addrudp_server.recvfrom(1024)print(f来自{addr}消息{data.decode(utf-8)})udp_server.sendto(UDP收到.encode(utf-8),addr)UDP客户端 udp_client.pyimportsocket udp_clientsocket.socket(socket.AF_INET,socket.SOCK_DGRAM)udp_client.sendto(UDP测试消息.encode(utf-8),(127.0.0.1,9999))data,addrudp_client.recvfrom(1024)print(服务端回复,data.decode(utf-8))udp_client.close()四、常见踩坑总结编码报错收发忘记encode/decode中文极易出现乱码统一使用utf-8端口占用修改PORT或者关闭占用端口的进程客户端连不上防火墙拦截、IP填写错误、服务端未绑定0.0.0.0recv阻塞卡死TCP连接断开后recv会返回空字节代码中需要判断单次recv不能接收全部大数据缓冲区有限传输大文件需要循环接收。五、进阶拓展方向原生基础Socket仅实现一对一短连接通信后续可以延伸学习使用多线程/多进程处理多个客户端并发连接IO多路复用 select / selectors 实现高并发服务基于Socket实现简易聊天室、文件传输封装协议头自定义通信数据包格式异步网络编程 asyncio socket第三方框架Twisted、gevent。结束语Socket是网络编程的基石HTTP、WebSocket底层依然基于Socket封装。熟练掌握原生socket模块能帮助你理解各类网络框架底层通信逻辑。本篇示例均为最简可运行代码建议手动敲一遍运行调试加深理解。