Python网络编程详解:从套接字到TCP/UDP实现
本文详解Python网络编程核心概念,涵盖服务器与客户端架构、套接字类型及地址结构。重点讲解socket模块用法,提供TCP和UDP服务器的创建方法及完整代码示例,包括时间戳服务实现,帮助开发者快速掌握Python网络通信开发。
服务器由一系列硬件或软件组成,旨在为一个或多个客户端(即服务使用者)提供所需的服务。其核心职责是持续等待客户端发起的请求,响应这些请求以提供服务,随后继续等待后续请求。
客户端/服务器架构不仅适用于计算机硬件系统,同样广泛应用于计算机软件领域。
在服务器响应客户端请求之前,必须首先创建一个通信节点,该节点使服务器能够监听 incoming 请求。
一、套接字:通信端点
1、套接字
套接字是计算机网络中的一种数据结构,体现了前述“通信端点”的概念。在任何类型的网络通信开始之前,网络应用程序必须创建套接字。
存在两种类型的套接字:基于文件的套接字和面向网络的套接字。
2、套接字地址:主机-端口对
如果将套接字比作允许通信的基础设施(如电话插孔),那么主机名和端口号则类似于区号与电话号码的组合。有效的端口号范围是0到65535,其中小于1024的端口号通常预留给了系统使用。
3、面向连接的套接字和与无连接的套接字
面向连接的通信在开始数据传输前必须建立连接。实现这种连接类型的主要协议是TCP(传输控制协议)。
无连接的通信在开始通信前无需建立连接。其主要协议是UDP(用户数据报协议)。
二、Python中的网络编程
1、socket()模块函数
创建TCP/IP套接字的代码为:tcpSock = socket.socket(socket.AF_INEF,socket.SOCK_STREAM)。
创建UDP/IP套接字的代码为:udpSock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)。
2.常见的套接字对象方法和属性
| 名称 | 描述 |
| 服务器套接字方法 | |
| s.bind() | 将地址(主机名、端口号对)绑定到套接字上 |
| s.listen() | 设置并启动TCP监听器 |
| s.accept() | 被动接受TCP客户端连接,一直等待直到连接到达(阻塞) |
| 客户端套接字方法 | |
| s.connect() | 主动发起TCP服务器连接 |
| s.connect_ex() | connect的扩展版本,此时会以错误代码的形式返回问题,而不是抛出一个异常 |
| 普通的套接字方法 | |
| s.recv() | 接受TCP消息 |
| s.send() | 发送TCP消息 |
| s.sendall() | 完整的发送TCP消息 |
| s.recvfrom() | 接收UDP消息 |
| s.shutdown() | 关闭连接 |
| s.close() | 关闭套接字 |
3、创建TCP服务器
ss = socket() #创建服务器套接字
ss.bind() #套接字与地址绑定
ss.listen() #监听连接
inf_loop: #服务器无限循环
cs = ss.accept() #接收客户端连接
comm_loop: #通信循环
cs.recv()/cs.send() #对话(接收、发送)
cs.close() #关闭客户端套接字
ss.close() #关闭服务器套接字(可选)
#!/usr/bin/env python
#TCP时间戳服务器
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print('waiting for connecting...')
tcpClisock, addr = tcpSerSock.accept()
print('...connected from:',addr)
while True:
data = tcpClisock.recv(BUFSIZ)
if not data:
break
tcpClisock.send('[%s] %s' % (bytes(ctime(),'utf-8'),data))
tcpClisock.close()
tcpSerSock.close()
4、创建TCP客户端
cs = socket() cs.connect() comm_loop: cs.send()/cs.recv() cs.close()
#!/usr/bin/env python
#TCP时间戳客户端
from socket import *
HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpClisock = socket(AF_INET,SOCK_STREAM)
tcpClisock.connect(ADDR)
while True:
data = input('> ')
if not data:
break
tcpClisock.send(data)
data = tcpClisock.recv(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))
tcpClisock.close()
5、创建UDP服务器
ss = socket() ss.bind() inf_loop: cs = ss.recvfrom()/ss.sendto() ss.close()
#!/usr/bin/env python
#UDP时间戳服务器
from socket import *
from time import ctime
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpSerSock = socket(AF_INET,SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
print('waiting for message...')
data, addr=udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto('[%s] %s' % (ctime(),data),addr)
print('...received from and returned to:',addr)
udpSerSock.close()
6、创建UDP客户端
cs = socket() comm_loop: cs.send()/cs.recvfrom() cs.close()
#!/usr/bin/env python
#UDP时间戳客户端
from socket import *
HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
udpClisock = socket(AF_INET,SOCK_DGRAM)
while True:
data = input('> ')
if not data:
break
udpClisock.sendto(data,ADDR)
data, ADDR=udpClisock.recvfrom(BUFSIZ)
if not data:
break
print(data)
udpClisock.close()
以上就是本文关于Python网络编程详解的全部内容,希望对大家有所帮助。欢迎参阅:Python中enumerate函数代码解析、python数据类型判断type与isinstance的区别实例解析、python中requests库session对象的妙用详解等,有什么问题可以随时留言,有问题我就改。。。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













