Networking
Python提供两种级别的网络服务访问。 在较低级别,您可以访问底层操作系统中的基本套接字支持,这允许您为面向连接的协议和无连接协议实现客户端和服务器。
Python还具有库,可以提供对特定应用程序级网络协议的更高级别访问,例如FTP,HTTP等。
本章将帮助您了解网络中最着名的概念 - 套接字编程。
什么是套接字?
套接字是双向通信信道的端点。 套接字可以在进程内,同一台机器上的进程之间或不同大洲的进程之间进行通信。
套接字可以在许多不同的通道类型上实现:Unix域套接字,TCP,UDP等。 socket库提供了用于处理公共传输的特定类以及用于处理其余传输的通用接口。
套接字有自己的词汇 -
Sr.No. | 术语和描述 |
---|---|
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模块中提供的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对象,就可以使用所需的函数来创建客户端或服务器程序。 以下是所需的功能列表 -
服务器套接字方法
Sr.No. | 方法和描述 |
---|---|
1 | s.bind() 此方法将地址(主机名,端口号对)绑定到套接字。 |
2 | s.listen() 此方法设置并启动TCP侦听器。 |
3 | s.accept() 这被动地接受TCP客户端连接,等待连接到达(阻塞)。 |
客户端套接字方法
Sr.No. | 方法和描述 |
---|---|
1 | s.connect() 此方法主动启动TCP服务器连接。 |
通用套接字方法
Sr.No. | 方法和描述 |
---|---|
1 | s.recv() 此方法接收TCP消息 |
2 | s.send() 该方法传输TCP消息 |
3 | s.recvfrom() 此方法接收UDP消息 |
4 | s.sendto() 该方法发送UDP消息 |
5 | s.close() 此方法关闭套接字 |
6 | socket.gethostname() 返回主机名。 |
简单的服务器
要编写Internet服务器,我们使用套接字模块中提供的socket函数来创建套接字对象。 然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用bind(hostname, port)函数为给定主机上的服务指定port 。
接下来,调用返回对象的accept方法。 此方法等待,直到客户端连接到您指定的端口,然后返回表示与该客户端的连接的connection对象。
#!/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模块函数创建套接字客户端非常简单。
socket.connect(hosname, port )打开与port上hostname的TCP连接。 打开套接字后,可以像任何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 Internet modules
Python网络/ Internet编程中一些重要模块的列表。
协议 | 常用功能 | 港口号 | Python模块 |
---|---|---|---|
HTTP | 网页 | 80 | httplib, urllib, xmlrpclib |
NNTP | Usenet news | 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协议。
进一步的阅读 (Further Readings)
这是Socket编程的快速入门。 这是一个广泛的主题。 建议通过以下链接查找更多详细信息 -
Unix套接字编程。