Python 网络编程
Python 提供了对网络服务的两个级别的访问。在底层,你可以访问底层操作系统中的基本套接字支持,这允许你为面向连接和无连接协议实现客户端和服务器。
Python 也有提供对特定应用程序级网络协议(如 FTP、HTTP 等)的更高级别访问的库。
本章让你了解网络中最著名的概念——套接字编程。
什么是套接字?
套接字是双向通信通道的端点。套接字可以在进程内、同一台机器上的进程之间或不同大陆上的进程之间进行通信。
套接字可以通过多种不同的通道类型实现:Unix 域套接字、TCP、UDP 等等。这 socket 库提供了用于处理常见传输的特定类以及用于处理其余部分的通用接口。
套接字有自己的词汇:
序号. | 术语和说明 |
---|---|
1 |
Domain 用作传输机制的协议族。这些值是常量,例如 AF_INET、PF_INET、PF_UNIX、PF_X25 等。 |
2 |
type 两个端点之间的通信类型,通常 SOCK_STREAM 用于面向连接的协议,SOCK_DGRAM 用于无连接协议。 |
3 |
protocol 通常为零,这可用于识别域和类型内的协议变体。 |
4 |
hostname 网络接口的标识符:
|
5 |
port 每台服务器都侦听调用一个或多个端口的客户端。端口可以是 Fixnum 端口号、包含端口号的字符串或服务名称。 |
The socket Module
要创建套接字,你必须使用 socket.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() 返回主机名。 |
一个简单的服务器
要编写 Internet 服务器,我们使用 socket 套接字模块中可用的函数来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。
Now call 绑定(主机名,端口) 指定一个函数 port 为你在给定主机上的服务。
接下来,调用 accept 返回对象的方法。此方法等待客户端连接到你指定的端口,然后返回一个 联系 表示与该客户端的连接的对象。
#!/usr/bin/python # This is server.py file import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 12345 # Reserve a port for your service. s.bind((host, port)) # Bind to the port s.listen(5) # Now wait for client connection. while True: c, addr = s.accept() # Establish connection with client. print 'Got connection from', addr c.send('Thank you for connecting') c.close() # Close the connection
一个简单的客户端
让我们编写一个非常简单的客户端程序,它打开到给定端口 12345 和给定主机的连接。使用 Python 的创建套接字客户端非常简单 socket 模块功能。
The socket.connect(主机名,端口) 打开一个 TCP 连接到 hostname on the port .一旦你打开了一个套接字,你就可以像任何 IO 对象一样读取它。完成后,记得关闭它,就像关闭文件一样。
下面的代码是一个非常简单的客户端,它连接到给定的主机和端口,从套接字读取任何可用的数据,然后退出:
#!/usr/bin/python # This is client.py file import socket # Import socket module s = socket.socket() # Create a socket object host = socket.gethostname() # Get local machine name port = 12345 # Reserve a port for your service. s.connect((host, port)) print s.recv(1024) s.close() # Close the socket when done
现在在后台运行这个 server.py,然后在 client.py 上面运行以查看结果。
# Following would start a server in background. $ python server.py & # Once server is started run client as follows: $ python client.py
这将产生以下结果:
Got connection from ('127.0.0.1', 48437) Thank you for connecting
Python 互联网模块
Python网络/互联网编程中一些重要模块的列表。
Protocol | 常用功能 | Port No | Python 模块 |
---|---|---|---|
HTTP | 网页 | 80 | httplib、urllib、xmlrpclib |
NNTP | 新闻网新闻 | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib, urllib |
SMTP | 发送电子邮件 | 25 | smtplib |
POP3 | 获取电子邮件 | 110 | poplib |
IMAP4 | 获取电子邮件 | 143 | imaplib |
Telnet | 命令行 | 23 | 远程登录库 |
Gopher | 文件传输 | 70 | gopherlib, urllib |
请检查上述所有库以使用 FTP、SMTP、POP 和 IMAP 协议。
进一步阅读
这是 Socket 编程的快速入门。这是一个广阔的主题。建议通过以下链接了解更多详情:
-
Unix套接字编程 .
-
Python 套接字库和模块 .