Python提供了两个级别的访问网络服务。在低级别,您可以访问底层操作系统中的基本套接字支持,这允许您为面向连接和无连接协议实现客户端和服务器。
Python还具有提供对特定应用级网络协议(如FTP,HTTP等)的更高级别访问的库。
本章让您了解网络中最着名的概念 - 套接字编程。
套接字是双向通信通道的端点。套接字可以在一个进程内,在同一机器上的进程之间,或者在不同大陆的进程之间进行通信。
套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP,UDP等。该插座库提供特定的类来处理常见的传输以及用于处理其余的通用接口。
插座有自己的词汇:
术语 | 描述 |
---|---|
域 | 用作传输机制的协议族。这些值是常量,例如AF_INET,PF_INET,PF_UNIX,PF_X25等。 |
类型 | 两个端点之间的通信类型,通常用于面向连接的协议的SOCK_STREAM和用于无连接协议的SOCK_DGRAM。 |
协议 | 通常为零,这可以用于标识域和类型中的协议的变体。 |
主机名 | 网络接口的标识符:
|
港口 | 每个服务器监听呼叫一个或多个端口的客户端。端口可能是Fixnum端口号,包含端口号的字符string或服务名称。 |
要创建套接字,必须使用套接字模块中可用的socket.socket()函数,它具有一般的语法 -
s = socket.socket (socket_family, socket_type, protocol=0)
这是参数的描述 -
socket_family:这是AF_UNIX或AF_INET,如前所述。
socket_type:这是SOCK_STREAM或SOCK_DGRAM。
协议:这通常被省略,默认为0。
一旦拥有套接字对象,就可以使用所需的功能来创建客户端或服务器程序。以下是所需功能的列表 -
方法 | 描述 |
---|---|
s.bind() | 此方法将地址(主机名,端口号对)绑定到套接字。 |
s.listen() | 此方法设置并启动TCP侦听器。 |
s.accept() | 这被动地接受TCP客户端连接,等待直到连接到达(阻塞)。 |
方法 | 描述 |
---|---|
s.connect() | 此方法主动启动TCP服务器连接。 |
方法 | 描述 |
---|---|
s.recv() | 此方法接收TCP消息 |
s.send() | 该方法传输TCP消息 |
s.recvfrom() | 此方法接收UDP消息 |
s.sendto() | 该方法发送UDP消息 |
s.close() | 此方法关闭套接字 |
socket.gethostname() | 返回主机名。 |
要编写Internet服务器,我们使用套接字模块中可用的套接字功能来创建套接字对象。然后使用套接字对象调用其他函数来设置套接字服务器。
现在调用bind(hostname,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.connect(hosname,端口)打开一个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网络/互联网编程中的一些重要模块的列表。
协议 | 共同功能 | 港口号 | Python模块 |
---|---|---|---|
HTTP | 网页 | 80 | httplib,urllib,xmlrpclib |
NNTP | Usenet新闻 | 119 | nntplib |
FTP | 文件传输 | 20 | ftplib,urllib |
SMTP | 发送电子邮件 | 25 | smtplib |
POP3 | 获取电子邮件 | 110 | poplib |
IMAP4 | 获取电子邮件 | 143 | 伊马替利 |
Telnet | 命令行 | 23 | telnetlib |
Gopher | 文档传输 | 70 | gopherlib,urllib |
请检查上述所有库,以使用FTP,SMTP,POP和IMAP协议。
这是Socket编程的一个快速开始。这是一个广阔的话题。建议通过以下链接查找更多详细信息 -