Python是一门支持网络编程的语言,其中socket和socketserver模块是最常用的两种网络编程模块。在这篇文章中,我们将简单介绍这两种模块的使用方法,并提供一些示例说明。
1. 网络编程概述
网络编程是指利用计算机网络技术进行数据交换的程序设计过程。计算机网络是由若干台计算机及其它设备组成,这些计算机及设备通过通信线路连接在一起,以实现信息交换和资源共享。在网络编程中,我们需要使用一些网络协议,如TCP/IP、HTTP等协议,来进行网络数据传输。
2. socket模块
socket模块是Python中最基本的网络编程模块,它提供了网络通信的底层接口。我们可以使用socket模块实现TCP、UDP等协议下的客户端和服务器端通信。
2.1. socket模块的基本使用
在使用socket模块之前,我们需要先导入socket模块。在创建socket对象时,需要指定socket类型和协议类型。socket类型有SOCK_DGRAM和SOCK_STREAM两种,分别对应UDP和TCP协议。
import socket
# 创建TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
在创建socket对象后,我们可以用socket的connect()函数连接到远程服务器,或者用bind()函数绑定到本地地址。使用send()和recv()函数进行数据传输。
import socket
# 创建TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到远程服务器
server_address = ('127.0.0.1', 8888)
sock.connect(server_address)
# 发送数据
message = 'Hello world!'
sock.sendall(message.encode())
# 接收数据
data = sock.recv(1024)
print(data.decode())
# 关闭连接
sock.close()
2.2. 用socket模块实现简单的服务端
使用Python的socket模块可以简单地实现一个TCP服务器程序。服务器程序需要先创建一个socket对象,然后使用bind()函数将socket与本地地址和端口绑定,最后通过listen()函数开始监听客户端请求,使用accept()函数接受客户端连接,并使用send()和recv()函数进行数据传输。
import socket
# 创建TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定本地地址和端口
server_address = ('127.0.0.1', 8888)
sock.bind(server_address)
# 开始监听
sock.listen(1)
print('Server is running...')
# 处理客户端请求
while True:
# 等待客户端连接
client_sock, client_addr = sock.accept()
print('Client connected:', client_addr)
# 接收数据
data = client_sock.recv(1024)
# 发送数据
message = 'Received data: ' + data.decode()
client_sock.sendall(message.encode())
# 关闭连接
client_sock.close()
在上面的代码中,我们使用了一个while循环来持续监听客户端请求。每当有一个客户端连接到我们的服务器时,我们都会创建一个新的socket对象和地址对象,接着使用recv()函数接收客户端传来的数据,再使用sendall()函数将数据发送给客户端,最后关闭连接。
3. socketserver模块
socketserver模块是Python中高级的网络编程模块,它把socket的底层操作封装起来,使用较为简单。socketserver模块提供了一个基本的多线程TCP服务器和一个基本的多线程UDP服务器,我们可以通过实现多种协议的具体请求处理方式,来创建我们自己的服务器。
3.1. socketserver模块的基本使用
在使用socketserver模块之前,我们同样需要先导入该模块。然后创建一个我们自己实现的服务器类,派生自socketserver模块中的BaseRequestHandler类。在实现自身服务器类时,需要重载父类的handle()函数来处理客户端的请求。最后,我们可以使用socketserver模块中的TCPServer或UDPServer类,来创建我们自己的服务器,运行在本地地址或指定的网络地址和端口。
import socketserver
# 自定义服务器类
class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
# 接收并处理客户端请求
data = self.request.recv(1024)
message = 'Received data: ' + data.decode()
self.request.sendall(message.encode())
# 创建TCP服务器
server_address = ('127.0.0.1', 8888)
my_server = socketserver.ThreadingTCPServer(server_address, MyHandler)
# 运行服务器
print('Server is running...')
my_server.serve_forever()
在上面的代码中,我们首先实现了一个自定义的服务器类MyHandler,该类继承自BaseRequestHandler类,并重载了handle()函数来处理客户端请求。然后我们可以创建一个TCPServer类的实例对象,并将其绑定在本地地址和端口上,使用serve_forever()函数来运行我们的服务器。
3.2. 通过socketserver模块实现简单的Web服务器
我们可以通过实现socketserver模块提供的ThreadingHTTPServer服务器,来实现一个简单的Web服务器。ThreadingHTTPServer服务器是以多线程方式运行的HTTP服务器,它侦听来自客户端的HTTP请求,并返回HTTP响应。在实现我们的Web服务器时,我们同样需要派生自BaseHTTPRequestHandler类,实现自己的请求处理逻辑。
from http.server import ThreadingHTTPServer, BaseHTTPRequestHandler
# 自定义请求处理器
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
# 根据请求路径返回不同的响应内容
if self.path == '/':
message = 'Hello, world!'
elif self.path == '/about':
message = 'This is a simple Web server written by Python.'
else:
message = '404 Not Found.'
# 发送HTTP响应
self.send_response(200)
self.send_header('Content-type', 'text/plain; charset=utf-8')
self.end_headers()
self.wfile.write(message.encode())
# 创建Web服务器
server_address = ('127.0.0.1', 8080)
my_server = ThreadingHTTPServer(server_address, MyHandler)
# 运行服务器
print('Server is running...')
my_server.serve_forever()
在上面的代码中,我们继承了BaseHTTPRequestHandler类,并重载了其do_GET()函数来处理GET请求。我们根据请求的路径返回不同的响应内容,并使用send_response()函数、send_header()函数和end_headers()函数设置HTTP响应头部的状态码和Content-Type信息,最后使用wfile属性返回响应内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python网络编程之socket与socketserver - Python技术站