Python 3 – 网络编程

Python 3 – 网络编程

Python 提供两个级别的网络服务访问。在低级别上,您可以访问底层操作系统中基本的套接字支持,这允许您为面向连接和无连接的协议实现客户端和服务器。

Python 还拥有提供更高级别访问特定应用级网络协议(如 FTP、HTTP 等)的库。

本章将让您了解网络编程中最著名的概念 – 套接字编程。

什么是套接字?

套接字是双向通信通道的端点。套接字可以在进程内、在同一台机器上的进程之间或在不同大陆上的进程之间通信。

套接字可以在许多不同的通道类型上实现:Unix 域套接字、TCP、UDP 等。套接字库提供用于处理常见传输的特定类,以及用于处理其他传输的通用接口。

套接字有自己的词汇表 −

序号 术语和描述
1 domain 用作传输机制的协议族。这些值是常数,如 AF_INET、PF_INET、PF_UNIX、PF_X25 等。
2 type 两个端点之间通信的类型,通常是面向连接的协议使用 SOCK_STREAM,面向无连接的协议使用 SOCK_DGRAM。
3 protocol 通常为零,这可用于在域和类型内标识协议的变体。
4 hostname 网络接口的标识符 −
一个字符串,可以是主机名、点分十进制地址或冒号(及可能的点)表示法中的 IPV6 地址
一个字符串“< broadcast >”,它指定一个 INADDR_BROADCAST 地址。
一个长度为零的字符串,它指定 INADDR_ANY,或
一个整数,解释为主机字节顺序中的二进制地址。
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。

  • 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() 返回主机名。

一个简单的服务器

为了编写互联网服务器,我们使用socket模块中提供的socket函数创建一个socket对象。然后使用socket对象调用其他函数来设置socket服务器。

现在调用bind(hostname,port)函数来为给定主机上的服务指定一个端口。

接下来,调用返回对象的accept方法。这个方法等待直到一个客户端连接到你指定的端口,然后返回一个表示与该客户端的连接的连接对象。

#!/usr/bin/python3           # 这是 server.py 文件
import socket                                         

# 创建一个 socket 对象
serversocket = socket.socket(
            socket.AF_INET, socket.SOCK_STREAM) 

# 获取本地机器名称
host = socket.gethostname()                           

port = 9999                                           

# 绑定端口号
serversocket.bind((host, port))                                  

# 设置最大连接数,超过后排队
serversocket.listen(5)                                           

while True:
   # 建立客户端连接
   clientsocket,addr = serversocket.accept()      

   print("连接地址:%s" % str(addr))

   msg = '欢迎访问!'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

一个简单的客户端

让我们编写一个非常简单的客户端程序,它打开一个连接到给定端口12345和给定主机的连接。使用Python的socket模块函数非常简单地创建一个套接字客户端。

socket.connect(hosname,port )打开到主机名在端口上的TCP连接。一旦打开套接字,您可以像使用任何IO对象一样从中读取。完成后,记得将其关闭,就像关闭文件一样。

例子

下面的代码是一个非常简单的客户端,它连接到给定的主机和端口,从套接字中读取任何可用数据,然后退出。

#!/usr/bin/python3           # 这是 client.py 文件

import socket

# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# 获取本地主机名
host = socket.gethostname()                           

port = 9999

# 连接到主机名和端口号
s.connect((host, port))                               

# 接收不超过 1024 个字节
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

现在在后台运行 server.py,然后运行上面的 client.py 来查看结果。

# 下面的代码将在后台启动服务器。
python server.py&

# 一旦服务器启动,请按如下方式运行客户端: python client.py

输出

这将产生以下结果−

在服务器终端
Got a connection from ('192.168.1.10', 3747)
在客户端终端
Thank you for connecting

Python 网络模块

下面给出了 Python 网络/Internet 编程中一些重要模块的列表−

协议 常用功能 端口号 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 协议一起工作。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程