Python 网络编程详解:TCP/UDP 基础与 SocketServer 封装实战
本文详解 Python 网络编程原理,通过客户端-服务器架构实现 TCP 与 UDP 通信。涵盖原始 Socket 编程及基于 SocketServer 的面向对象封装,提供完整代码示例,解析连接建立、数据收发与资源释放流程,帮助开发者快速掌握 Python 网络通信核心机制。
网络编程核心原理
尽管不同平台与编程语言拥有各自的语法特性,但网络编程的底层原理是相通的。理解 Unix Socket 编程机制,即可触类旁通其他语言的网络实现。网络通信主要分为面向连接的 TCP(传输控制协议)和无连接的 UDP(用户数据报协议)。TCP 对应数据流,确保数据传输的可靠性;UDP 对应数据报文,侧重于传输效率。本文将以客户端-服务器(C/S)架构为例,演示单向数据流通的实现过程,并提供原始 Socket 编程与面向对象封装两种实现方式,后者旨在降低实现复杂度,便于快速开发。
TCP 网络编程实现
TCP 通信需要建立连接,服务端通过监听端口等待客户端接入,客户端则主动发起连接请求。以下示例展示了基于原始 Socket 的 TCP 服务端与客户端实现。
TCP 服务端代码
# -*- coding: utf-8 -*-
from socket import *
from time import ctime
# 地址与端口配置
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
# 缓冲区大小
BUFSIZ = 1024
# 创建并绑定 socket
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
# 监听 5 个客户端连接
tcpSerSock.listen(5)
try:
while True:
print 'waiting for connection...'
# 接受客户端连接
tcpCliSock, addr = tcpSerSock.accept()
print '...connect from:', addr
# 接收并处理数据
while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
# 发送包含时间戳的响应数据
tcpCliSock.send('[%s] %s' % (ctime(), data))
# 关闭客户端 socket
tcpCliSock.close()
except EOFError, KeyboardInterrupt:
tcpSerSock.close()TCP 客户端代码
# -*- coding:utf-8 -*-
from socket import *
# 地址与端口配置
HOST = '127.0.0.1'
PORT = 21567
ADDR = (HOST, PORT)
# 缓冲区大小
BUFSIZ = 1024
# 创建并连接 socket
tcpCliSocket = socket(AF_INET, SOCK_STREAM)
tcpCliSocket.connect(ADDR)
while True:
data = raw_input('> ')
if not data:
break
# 发送数据
tcpCliSocket.send(data)
# 接收服务端响应
data = tcpCliSocket.recv(BUFSIZ)
if not data:
break
# 显示接收到的数据
print data
tcpCliSocket.close()UDP 网络编程实现
UDP 通信无需建立连接,服务端直接绑定端口等待数据报,客户端发送数据时指定目标地址。以下示例展示了基于原始 Socket 的 UDP 服务端与客户端实现。
UDP 服务端代码
# -*- coding: utf-8 -*-
from socket import *
from time import ctime
# 地址与端口配置
HOST = ''
PORT = 8000
ADDR = (HOST, PORT)
# 缓冲区大小
BUFFSIZE = 1024
# 创建并绑定 socket
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
try:
while True:
print 'waiting the message...'
# 接收数据及客户端地址
data, addr = udpSerSock.recvfrom(BUFFSIZE)
print 'received the message: '+data+' from: ', addr
# 发送包含时间戳的响应数据
udpSerSock.sendto('[%s] %s' % (ctime(), data), addr)
except EOFError, KeyboardInterrupt:
udpSerSock.close()UDP 客户端代码
# -*- coding: utf-8 -*-
from socket import *
# 地址与端口配置
HOST = 'localhost'
PORT = 8000
ADDR = (HOST, PORT)
# 缓冲区大小
BUFSIZ = 1024
# 创建 socket
udpCliSock = socket(AF_INET, SOCK_DGRAM)
while True:
data = raw_input('> ')
# 发送数据到指定地址
udpCliSock.sendto(data, ADDR)
# 接收服务端响应
data = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print data
udpCliSock.close()基于 SocketServer 的面向对象封装
为了简化网络编程的复杂性,Python 提供了 SocketServer 模块,通过面向对象的方式封装了服务器逻辑。以下示例展示了如何使用 TCPServer 和 StreamRequestHandler 实现 TCP 服务端,以及对应的客户端代码。
SocketServer 服务端代码
# -*- coding: utf-8 -*-
from SocketServer import TCPServer as TCP, StreamRequestHandler as SRH
from time import ctime
# 地址与端口配置
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
# 缓冲区大小
BUFSIZ = 1024
# 定义请求处理器
class MyRequestHandler(SRH):
def handle(self):
print '...connected from: ', self.client_address
# 读取客户端数据并发送响应
self.wfile.write('[%s] %s' % (ctime(), self.rfile.readline()))
# 创建并启动 TCP 服务器
TCPServ = TCP(ADDR, MyRequestHandler)
print 'waiting for connection...'
# 循环处理请求
TCPServ.serve_forever()SocketServer 客户端代码
# -*- coding:utf-8 -*-
from socket import *
# 地址与端口配置
HOST = '127.0.0.1'
PORT = 21567
ADDR = (HOST, PORT)
# 缓冲区大小
BUFSIZ = 1024
while True:
# 注意:SocketServer 的请求处理器默认行为是接受连接、处理请求后关闭连接
# 因此需要多次连接以发送多条消息
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
# 处理数据
data = raw_input('> ')
if not data:
break
# 发送数据(注意添加换行符)
tcpCliSock.send('%s\r\n' % data)
# 接收服务端响应
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
# 显示处理后的数据
print data.strip()
# 关闭当前连接
tcpCliSock.close()总结
本文通过具体代码示例,详细解析了 Python 中 TCP 与 UDP 网络编程的实现方式,并介绍了基于 SocketServer 的面向对象封装方法。掌握这些基础原理与代码实现,有助于开发者在实际项目中快速构建稳定的网络通信应用。以上就是 Python 网络编程详解及简单实例的详细内容,更多关于 Python 网络编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









