Python 3 – 网络编程
Python 提供两个级别的网络服务访问。在低级别上,您可以访问底层操作系统中基本的套接字支持,这允许您为面向连接和无连接的协议实现客户端和服务器。
Python 还拥有提供更高级别访问特定应用级网络协议(如 FTP、HTTP 等)的库。
本章将让您了解网络编程中最著名的概念 – 套接字编程。
什么是套接字?
套接字是双向通信通道的端点。套接字可以在进程内、在同一台机器上的进程之间或在不同大陆上的进程之间通信。
套接字可以在许多不同的通道类型上实现:Unix 域套接字、TCP、UDP 等。套接字库提供用于处理常见传输的特定类,以及用于处理其他传输的通用接口。
套接字有自己的词汇表 −
序号 | 术语和描述 |
---|---|
1 | domain 用作传输机制的协议族。这些值是常数,如 AF_INET、PF_INET、PF_UNIX、PF_X25 等。 |
2 | type 两个端点之间通信的类型,通常是面向连接的协议使用 SOCK_STREAM,面向无连接的协议使用 SOCK_DGRAM。 |
3 | protocol 通常为零,这可用于在域和类型内标识协议的变体。 |
4 | hostname 网络接口的标识符 − 一个字符串,可以是主机名、点分十进制地址或冒号(及可能的点)表示法中的 IPV6 地址 一个字符串“< broadcast >”,它指定一个 INADDR_BROADCAST 地址。 一个长度为零的字符串,它指定 INADDR_ANY,或 一个整数,解释为主机字节顺序中的二进制地址。 |
5 | port 每个服务器都侦听客户端调用一个或多个端口。端口可以是 Fixnum 端口号、包含端口号的字符串或服务名称的名称。 |
套接字模块
要创建套接字,您必须使用套接字模块中提供的 socket.socket() 函数,它的一般语法为 −
s = socket.socket (socket_family, socket_type, protocol=0)
下面是参数的描述 −
- socket_family − 这可能是 AF_UNIX 或 AF_INET,如前所述。
-
socket_type − 这是 SOCK_STREAM 或 SOCK_DGRAM。
-
protocol − 这通常被省略,默认为 0。
一旦您拥有了 socket 对象,那么您可以使用所需的函数创建您的客户端或服务器程序。下面是所需的函数列表 −
服务器套接字方法
序号 | 方法与描述 |
---|---|
1 | s.bind() 此方法将地址(主机名,端口号)绑定到套接字。 |
2 | s.listen() 此方法设置并启动TCP监听器。 |
3 | s.accept() 此方法被动地接受TCP客户端连接,等待直到连接到达(阻塞)。 |
客户端套接字方法
序号 | 方法与描述 |
---|---|
1 | s.connect() 此方法主动发起TCP服务器连接。 |
通用套接字方法
序号 | 方法与描述 |
---|---|
1 | s.recv() 此方法接收TCP消息。 |
2 | s.send() 此方法传输TCP消息 |
3 | s.recvfrom() 此方法接收UDP消息 |
4 | s.sendto() 此方法传输UDP消息 |
5 | s.close() 此方法关闭套接字 |
6 | socket.gethostname() 返回主机名。 |
一个简单的服务器
为了编写互联网服务器,我们使用socket模块中提供的socket函数创建一个socket对象。然后使用socket对象调用其他函数来设置socket服务器。
现在调用bind(hostname,port)函数来为给定主机上的服务指定一个端口。
接下来,调用返回对象的accept方法。这个方法等待直到一个客户端连接到你指定的端口,然后返回一个表示与该客户端的连接的连接对象。
#!/usr/bin/python3 # 这是 server.py 文件
import socket
# 创建一个 socket 对象
serversocket = socket.socket(
socket.AF_INET, socket.SOCK_STREAM)
# 获取本地机器名称
host = socket.gethostname()
port = 9999
# 绑定端口号
serversocket.bind((host, port))
# 设置最大连接数,超过后排队
serversocket.listen(5)
while True:
# 建立客户端连接
clientsocket,addr = serversocket.accept()
print("连接地址:%s" % str(addr))
msg = '欢迎访问!'+ "\r\n"
clientsocket.send(msg.encode('ascii'))
clientsocket.close()
一个简单的客户端
让我们编写一个非常简单的客户端程序,它打开一个连接到给定端口12345和给定主机的连接。使用Python的socket模块函数非常简单地创建一个套接字客户端。
socket.connect(hosname,port )打开到主机名在端口上的TCP连接。一旦打开套接字,您可以像使用任何IO对象一样从中读取。完成后,记得将其关闭,就像关闭文件一样。
例子
下面的代码是一个非常简单的客户端,它连接到给定的主机和端口,从套接字中读取任何可用数据,然后退出。
#!/usr/bin/python3 # 这是 client.py 文件
import socket
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 连接到主机名和端口号
s.connect((host, port))
# 接收不超过 1024 个字节
msg = s.recv(1024)
s.close()
print (msg.decode('ascii'))
现在在后台运行 server.py,然后运行上面的 client.py 来查看结果。
# 下面的代码将在后台启动服务器。
python server.py&
# 一旦服务器启动,请按如下方式运行客户端: python client.py
输出
这将产生以下结果−
在服务器终端
Got a connection from ('192.168.1.10', 3747)
在客户端终端
Thank you for connecting
Python 网络模块
下面给出了 Python 网络/Internet 编程中一些重要模块的列表−
协议 | 常用功能 | 端口号 | Python 模块 |
---|---|---|---|
HTTP | 网页 | 80 | httplib,urllib,xmlrpclib |
NNTP | Usenet 新闻 | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib,urllib |
SMTP | 发送电子邮件 | 25 | smtplib |
POP3 | 获取电子邮件 | 110 | poplib |
IMAP4 | 获取电子邮件 | 143 | imaplib |
Telnet | 命令行 | 23 | telnetlib |
Gopher | 文档传输 | 70 | gopherlib,urllib |
请检查上述所有库,以与 FTP、SMTP、POP 和 IMAP 协议一起工作。