Python提供对网络服务的两种访问级别.在较低级别,您可以访问底层操作系统中的基本套接字支持,这允许您为面向连接和无连接协议实现客户端和服务器.
Python也有库提供对特定应用程序级网络协议的更高级别访问,例如FTP,HTTP等.
本章让您了解网络中最着名的概念 - 套接字编程.
什么是套接字?
套接字是双向通信通道的端点.套接字可以在进程内,同一台机器上的进程之间或不同大洲的进程之间进行通信.
套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP, UDP,依此类推. socket 库提供了用于处理公共传输的特定类以及用于处理其余传输的通用接口.
套接字有自己的词汇 :
Sr.No. | Term&说明 |
---|---|
1 | domain 用作传输机制的协议族.这些值是常量,如AF_INET,PF_INET,PF_UNIX,PF_X25等. |
2 | type 两个端点之间的通信类型,通常是SOCK_STREAM用于连接面向无连接协议的协议和SOCK_DGRAM. |
3 | protocol 通常为零,这可用于识别域内协议的变体并输入. |
4 | hostname 网络接口的标识符 :
|
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.
协议 : 这通常被省略,默认为0.
一旦你有 socket 对象,那么你可以使用创建客户端或服务器程序所需的功能.以下是所需的函数列表 :
服务器套接字方法
Sr.No. | Method&说明 |
---|---|
1 | s.bind() 此方法将地址(主机名,端口号对)绑定到套接字. |
2 | s.listen() 此方法设置并启动TCP侦听器. |
3 | s.accept() 这被动接受TCP客户端连接,等待连接到达(阻塞). |
客户端套接字方法
Sr.No. | 方法&说明 |
---|---|
1 | s.connect() 此方法主动启动TCP服务器连接. |
常规套接字方法
Sr.No. | Method&说明 |
---|---|
1 | s.recv() 此方法接收TCP消息 |
2 | s.send() 此方法传输TCP消息 |
3 | s.recvfrom() 此方法接收UDP消息 |
4 | s.sendto() 此方法传输UDP消息 |
5 | s.close() 此方法关闭套接字 |
6 | socket.gethostname() 返回主机名. |
简单服务器
要编写Internet服务器,我们使用套接字模块中提供的套接字函数来创建套接字对象.然后使用套接字对象调用其他函数来设置套接字服务器.
现在调用 bind(主机名,端口)函数来指定端口用于给定主机上的服务.
接下来,调用返回对象的 accept 方法.此方法等待客户端连接到您指定的端口,然后返回表示与该客户端的连接的连接对象.
#!/usr/bin/python3 # This is server.py fileimport socket # create a socket objectserversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM) # get local machine namehost = socket.gethostname() port = 9999 # bind to the portserversocket.bind((host, port)) # queue up to 5 requestsserversocket.listen(5) while True: # establish a connection clientsocket,addr = serversocket.accept() print("Got a connection from %s" % str(addr)) msg = 'Thank you for connecting'+ "\r\n" clientsocket.send(msg.encode('ascii')) clientsocket.close()
一个简单的客户端
让我们编写一个非常简单的客户端程序,打开与给定端口12345和给定主机的连接.使用Python的 socket 模块函数创建套接字客户端非常简单.
socket.connect(hosname,port)在端口上打开与主机名的TCP连接.打开套接字后,可以像任何IO对象一样从中读取.完成后,请记得关闭它,就像关闭文件一样.
示例
以下代码是一个连接到a的非常简单的客户端给定主机和端口,从套接字读取任何可用数据,然后退出和减去;
#!/usr/bin/python3 # This is server.py fileimport socket # create a socket objectserversocket = socket.socket( socket.AF_INET, socket.SOCK_STREAM) # get local machine namehost = socket.gethostname() port = 9999 # bind to the portserversocket.bind((host, port)) # queue up to 5 requestsserversocket.listen(5) while True: # establish a connection clientsocket,addr = serversocket.accept() print("Got a connection from %s" % str(addr)) msg = 'Thank you for connecting'+ "\r\n" clientsocket.send(msg.encode('ascii')) clientsocket.close()
现在在后台运行此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
输出
这将产生以下结果 :
on server terminalGot a connection from ('192.168.1.10', 3747)On client terminalThank you for connecting
Python Internet模块
Python网络/互联网编程中一些重要模块的列表在下面和下面给出;
协议 | 常用功能 | 端口号 | 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协议.
进一步读数
这是套接字编程的快速入门.这是一个广泛的主题.建议通过以下链接查找更多详细信息和减号;
Unix Socket编程.
Python套接字库和模块.