Python网络编程Socket实现服务端与客户端操作详解
本文详解Python中Socket模块的网络编程实现,涵盖TCP与UDP两种协议的服务端及客户端代码示例。内容涉及Socket创建、绑定端口、监听连接、数据收发及异常处理,重点解析Windows环境下的兼容性问题及长连接实现方法,帮助开发者掌握基础网络通信逻辑。
本文详细介绍利用Python标准库socket模块进行网络编程的方法,重点演示如何构建服务端与客户端。
文章主要内容概览:
- Socket基础概念解析
- TCP协议示例:
- TCP协议服务端实现
- TCP协议客户端实现
- UDP协议示例:
- UDP协议服务端实现
- UDP协议客户端实现
文章首次发布于2018-02-08 01:14
后续更新记录:
- 2018-03-20:重构了文章结构,并补充了UDP通信的相关内容
- Socket(套接字)是网络通信的接口,应用程序通过它向网络发起请求或响应网络请求。
- 网络中两个程序通过双向通信连接交换数据,该连接的一端被称为一个socket。
- 可以将Socket类比为电话线插口,只有当插口连接正确时,通信才能建立。
- 在Python中,使用socket模块进行网络连接的传输操作。
- 若使用socket模块创建TCP客户端和服务端,需注意以下细节:
- 使用Socket前需导入模块:import socket
- 具体的创建流程见下文示例
服务端代码示例:
TCP服务端通常包含以下步骤:建立Socket、绑定IP地址和端口、监听端口、等待连接、接收数据、传输数据以及关闭连接。
- 建立Socket:server=socket.socket(socket.AF_INET, socket.SOCK_STREAM),其中参数默认即为socket.AF_INET和socket.SOCK_STREAM。
- 绑定端口:server.bind(('IP地址',端口)),注意地址和端口号需组成一个元组(tuple)。
- 设置监听:server.listen()。
- 接受连接:conn,addr=server.accept(),该方法返回一个连接实例和一个地址元组,地址为客户端IP,后续数据操作需基于此连接实例进行。
- 发送数据:conn.send(data),注意发送的数据必须是字节流,因此字符串需先使用encode()编码。
- 接收数据:conn.recv(size),size指定接收的字节数,若需将接收的字节流转换为Unicode字符串,需使用decode()解码。
- 关闭连接:close()。
import socket server=socket.socket()#建立socket server.bind(('localhost',1234))#绑定 server.listen()#监听 print("开始等待。。。") conn,addr=server.accept()#接收连接 print("连接成功") data=conn.recv(1024)#接收数据 print(data.decode()) conn.send(data)#发送数据 server.close()#关闭连接 print("--------------------")- 上述基础代码存在局限:仅能处理一次连接,结束后服务端Socket即关闭。若需支持连续连接,需修改代码以不立即关闭Socket。
#服务器端 import socket server = socket.socket() server.bind(('localhost',1234)) #绑定ip和端口 server.listen(5) #监听 while True: print("开始等待") conn, addr = server.accept() print(conn, addr) print("客户端连接") while True: data = conn.recv(1024) print("recv:",data) if not data: #当data=0时为真 print("连接断开...") break conn.send(data) server.close()注意:上述基础代码在Linux系统中可正常运行,但在Windows系统中可能会报错。
若需在Windows环境下运行,需添加异常捕获机制。
#服务器端 import socket server = socket.socket() server.bind(('localhost',1234)) #绑定ip和端口 server.listen(5) #监听 while True: print("开始等待") conn, addr = server.accept() print(conn, addr) print("客户端连接") while True: try: data = conn.recv(1024) print("recv:",data) if not data: #当data=0时为真 print("连接断开...") break conn.send(data) except ConnectionResetError as e: print(e) break server.close()客户端代码示例:
TCP客户端通常包含以下步骤:建立Socket、连接远程服务端Socket、传输数据、接收数据以及关闭连接。
- 建立Socket:client=socket.socket()。
- 建立连接:client.connect(('IP地址',端口)),地址和端口号需组成元组。
- 发送数据:client.send(data),数据必须为字节流,字符串需先使用encode()编码。
- 接收数据:client.recv(size),数据为字节流,需使用decode()转换为Unicode字符串。
- 关闭连接:close()。
import socket client=socket.socket()#建立socket client.connect(('localhost',1234))#连接 client.send("你好".encode())#发送数据 data=client.recv(1024)#接收数据 print(data.decode()) client.close()#关闭连接- 上述基础代码存在局限:仅能发送一次数据,发送后连接即断开。若需多次发送数据且不自动断开(前提是服务端支持多次接收),需修改代码。
import socket client=socket.socket() client.connect(('localhost',1234)) while True: cmd=input(">>") if len(cmd)==0: continue client.send(cmd.encode()) cmd_res=client.recv(1024) print(cmd_res.decode()) client.close()
UDP服务端代码示例:
UDP服务端通常包含以下步骤:创建Socket、绑定端口、传输数据以及接收数据。
- 创建Socket:server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)。
- 绑定端口:server.bind(addr),其中addr为包含(地址,端口)的元组。
- 接收数据:data,client_addr=server.recvfrom(1024)。
- 发送数据:server.sendto(data,client_addr)。
import socket import time server=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) server.bind(("localhost",1234)) start_time=time.time() while True: data,addr=server.recvfrom(1024) print(data,addr) server.sendto("hello".encode(),addr) time.sleep(1) if time.time()-start_time>30: break server.close()UDP客户端代码示例:
UDP客户端通常包含以下步骤:创建Socket、传输数据以及接收数据。
- 创建Socket:client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)。
- 发送数据:server.sendto(data,addr),其中addr为包含(地址,端口)的元组。
- 接收数据:data,server_addr=client.recvfrom(1024)。
import socket,time client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) addr=("localhost",1234) start_time=time.time() while True: client.sendto(time.ctime().encode(),addr) data,addr= client.recvfrom(1024) print(data) time.sleep(1) if time.time()-start_time>30: break client.close() - 若使用socket模块创建TCP客户端和服务端,需注意以下细节:
更多关于Python网络编程的内容,请参阅本站相关专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》。
希望本文所述的代码示例对您的Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









