上一章Python教程请查看:python访问MySQL数据库及其操作
Python提供对网络服务的两种级别的访问,在较低的级别上,你可以访问底层操作系统中的基本套接字支持,它允许你为面向连接和无连接的协议实现客户机和服务器。
Python还有一些库,可以提供对特定应用程序级网络协议(如FTP、HTTP等)的高级访问。
本章让你了解网络编程中最著名的概念——Socket编程。
1、套接字是什么?
套接字是双向通信信道的端点,套接字可以在进程内、同一机器上的进程之间或不同主机上的进程之间通信。
套接字可以在许多不同的通道类型上实现:Unix域套接字、TCP、UDP等等,套接字库提供了处理公共传输的特定类,以及处理其余传输的通用接口。
socket有自己的词汇
编号 | 术语和说明 |
1 | Domain 用作传输机制的协议族,这些值是常量,如AF_INET、PF_INET、PF_UNIX、PF_X25等等。 |
2 | type 两个端点之间的通信类型,通常是面向连接的协议的SOCK_STREAM和无连接协议的SOCK_DGRAM。 |
3 | protocol 通常为零,此值可用于标识域和类型中的协议变体。 |
4 | hostname 网络接口的标识符 一个字符串,可以是一个主机名,一个四点式地址,或者一个冒号(可能还有点)的IPV6地址一个字符串“<broadcast>”,它指定INADDR_BROADCAST地址。0长度的字符串,指定INADDR_ANY或整数,按主机字节顺序解释为二进制地址。 |
5 | port 每个服务器都侦听客户机对一个或多个端口的调用。端口可以是Fixnum端口号、包含端口号的字符串或服务名称。 |
2、套接字模块
要创建套接字,必须使用套接字模块中提供的socket.socket()函数,该函数具有一般的语法
s = socket.socket (socket_family, socket_type, protocol=0)
这里是参数的说明:
- 如前所述,它可以是AF_UNIX,也可以是AF_INET。
- socket_type,即SOCK_STREAM或SOCK_DGRAM。
- 协议protocol——这通常被忽略,默认为0。
有了socket对象之后,就可以使用所需的函数来创建客户机或服务器程序,以下是所需功能的列表。
3、服务器套接字的方法
编号 | 方法和说明 |
1 | s.bind() 此方法将地址(主机名、端口号对)绑定到套接字。 |
2 | s.listen() 该方法设置并启动TCP监听器。 |
3 | s.accept() 这被动地接受TCP客户端连接,等待连接到来(阻塞)。 |
4、客户端套接字的方法
编号 | 方法和说明 |
1 | s.connect() 此方法主动启动TCP服务器连接。 |
5、一般的套接字的方法
编号 | 方法和说明 |
1 | s.recv() 此方法接收TCP消息 |
2 | s.send() 这个方法传输TCP消息 |
3 | s.recvfrom() 此方法接收UDP消息 |
4 | s.sendto() 此方法传输UDP消息 |
5 | s.close() 此方法关闭套接字 |
6 | socket.gethostname() 返回的主机名。 |
6、一个简单的服务器
要编写Internet服务器,我们使用socket模块中的socket函数来创建socket对象,然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用bind(主机名、端口)函数来为给定主机上的服务指定端口。
接下来调用返回对象的accept方法。此方法将一直等待,直到客户端连接到你指定的端口,然后返回表示到该客户端的连接的连接对象。
#!/usr/bin/python
import socket # 导入socket模块
s = socket.socket() # 创建socket对象
host = socket.gethostname() # 获取本地主机
port = 12345 # 设置端口号
s.bind((host, port)) # 绑定端口
s.listen(5) # 等待客户端连接
while True:
c, addr = s.accept() # 建立连接
print '连接来自于: ', addr
c.send('信息...')
c.close() # 关闭连接
7、一个简单的客户端
让我们编写一个非常简单的客户端程序,它打开到给定端口12345和给定主机的连接,使用Python的套接字模块函数创建套接字客户机非常简单。
socket.connect(hosname, port)在端口上打开到主机名的TCP连接,打开套接字后,就可以像读取任何IO对象一样读取它,完成后记得关闭它,就像关闭文件一样。
下面的代码是一个非常简单的客户机,它连接到给定的主机和端口,从套接字中读取所有可用数据,然后退出:
#!/usr/bin/python
import socket # 导入socket模块
s = socket.socket() # 创建socket对象
host = socket.gethostname() # 获取本地主机
port = 12345 # 设置端口号
s.connect((host, port))
print s.recv(1024)
s.close() # 关闭连接
8、Python网络模块
Python网络/Internet编程中一些重要模块的列表。
协议 | 一般功能 | 端口号 | Python模块 |
HTTP | Web pages | 80 | httplib, urllib, xmlrpclib |
NNTP | Usenet news | 119 | nntplib |
FTP | File transfers | 20 | ftplib, urllib |
SMTP | Sending email | 25 | smtplib |
POP3 | Fetching email | 110 | poplib |
IMAP4 | Fetching email | 143 | imaplib |
Telnet | Command lines | 23 | telnetlib |
Gopher | Document transfers | 70 | gopherlib, urllib |
请检查上面提到的所有库,以使用FTP、SMTP、POP和IMAP协议。
评论前必须登录!
注册