概述
在上一节,我们介绍了如何在Python中使用Json,包括:Json序列化、Json反序列化、读Json文件、写Json文件、将类对象转换为Json、将Json转换为类对象等内容。在这一节,我们将介绍如何在Python中使用网络。Python网络编程覆盖的范围非常广,包括:套接字编程、socketserver、HTTP和Web开发、异步编程和asyncio等。在本专栏中,我们将只介绍比较基础的套接字编程和socketserver。
套接字编程
套接字是用于在计算机之间进行通信的基本接口。Python的socket库提供了一个用于创建和管理套接字的接口,你可以使用这个库来创建客户端和服务器应用程序。socket库提供了许多用于网络编程的函数,以下是一些常用的函数列表。
接下来,我们介绍几个比较重要的套接字函数。
1、创建套接字:使用socket()函数创建一个套接字对象。
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
在上面的示例代码中,我们创建了一个TCP套接字。AF_INET参数指定了该套接字使用IPv4协议,SOCK_STREAM参数指定了该套接字使用TCP协议。
2、连接服务器:使用connect()函数连接到服务器。
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('localhost', 8000) sock.connect(server_address)
在上面的示例代码中,我们创建了一个套接字,并将其连接到本地主机8000端口上的服务器。
3、发送和接收数据:使用send()函数发送数据,使用recv()函数接收数据。
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_address = ('localhost', 8000) sock.connect(server_address) message = b'Hello, HOPE' sock.send(message) data = sock.recv(1024) print('Received', repr(data)) sock.close()
在上面的示例代码中,我们创建了一个套接字,并将其连接到本地主机8000端口上的服务器。然后,我们发送了一个消息,并等待接收响应。最后,我们关闭了套接字。
下面我们给出一个简单的服务端程序和客户端程序。服务端程序的示例代码如下:
# Server.py import socket # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定IP地址和端口号 server_socket.bind(('localhost', 8000)) # 开始监听连接 server_socket.listen() print('Waiting connect...') # 接受客户端连接 client_socket, client_address = server_socket.accept() print('Client connect success:', client_address) # 接收客户端发送的数据 data = client_socket.recv(1024) print('Recv data:', data.decode()) # 向客户端发送数据 client_socket.send('Hello client'.encode()) # 关闭连接 client_socket.close() server_socket.close()
客户端程序的示例代码如下:
# Client.py import socket # 创建socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect(('localhost', 8000)) # 向服务器发送数据 client_socket.send('Hello server'.encode()) # 接收服务器发送的数据 data = client_socket.recv(1024) print('Recv data:', data.decode()) # 关闭连接 client_socket.close()
socketserver
socketserver模块是一个用于构建基于套接字的网络服务器的模块。这个模块提供了一些类,比如:SocketServer、TCPServer、UDPServer等,用于处理底层的socket通信,并且还提供了处理器类,用于处理每个客户端的请求。
下面我们给出一个基于socketserver的服务端程序,其示例代码如下:
# Server2.py import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): self.data = self.request.recv(1024).decode() print(f'Recv data from {self.client_address[0]}: {self.data}') self.request.sendall(b"Hello client") socketserver.TCPServer.allow_reuse_address = True server = socketserver.TCPServer(('localhost', 8000), MyTCPHandler) server.serve_forever()
在上面的示例代码中,我们创建了一个自定义的TCP处理器类MyTCPHandler,该类继承自socketserver.BaseRequestHandler。这个处理器类有一个handle()函数,当有新的客户端连接时,这个函数便会被调用。我们在这个函数中接收客户端发送的数据,并发送一条回应。然后,我们创建了一个TCP服务器对象,指定了要连接的服务器地址和端口,以及我们自定义的处理器类。最后,调用server的serve_forever方法,开始监听客户端的连接。