Python网络编程之socket与socketserver

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技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • pip报错“UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte” 错误。这个错误通常是由于文件编码不兼容或文件格式不正确导致的。以下是详细讲解 pip 报错 “UnicodeDecode…

    python 2023年5月4日
    00
  • python 获取毫秒数,计算调用时长的方法

    获取当前时间毫秒数可以使用 datetime 库中的 datetime.now() 方法,其返回值是一个 datetime 对象,可以通过对象属性获取到秒数和毫秒数,并将其转化为毫秒数。 例如: import datetime start_time = datetime.datetime.now() # 执行代码 end_time = datetime.da…

    python 2023年6月2日
    00
  • 浅析Python函数式编程

    浅析Python函数式编程 Python是一门功能强大的编程语言,它支持多种编程范式。其中,函数式编程是一种广泛使用的编程范式,Python也提供了相关的函数支持。本文将深入探讨Python函数式编程的相关知识。 Python函数式编程的特点 函数式编程是一种基于数学函数的编程范式,它的主要特点是: 数据不可变性:函数式编程中,数据是不可变的。每个函数都是一…

    python 2023年6月5日
    00
  • python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)

    在Python中,可以使用json模块进行JSON数据格式的转换。json模块提供了dumps()和loads()方法,用于将Python对象转换为JSON字符串和将JSON字符串转换为Python对象。此外,还可以使用dicttostr()和strtodict()方法,用于将字典转换为JSON字符串和将JSON字符串转换为字典。以下是详细的攻略,介绍Pyt…

    python 2023年5月14日
    00
  • python字典中items()函数用法实例

    Python中字典(dict)是一种用于存储键值对的数据类型,其中每个键对应一个值,且键不允许重复。字典中items()方法是Python中用于获取字典的键值对列表的方法之一。本篇攻略将详细讲解字典中items()函数的用法,而且讲解过程中还会提供两个示例供大家参考。 一、items()函数用法及其作用 Python中字典(dict)是一种用于存储键值对的数…

    python 2023年5月14日
    00
  • Python程序运行原理图文解析

    下面是关于“Python程序运行原理图文解析”的详细攻略。 Python程序运行原理图文解析 程序的编译和解释 在讲解Python程序运行原理之前,我们需要先了解一下计算机语言的解释和编译两种机制。 编译: 在程序运行之前,编译器将源代码编译成本地处理器能够理解的机器码,然后再运行机器码。优点是运行速度快,缺点是需要在不同的平台上重新编译。 解释: 解释器将…

    python 2023年5月13日
    00
  • python中celery的基本使用详情

    Python 中的 Celery 是一个用于处理异步任务的开源框架。使用 Celery,可以轻松地将任务提交到后台进行处理,从而降低了服务器负载,提高了代码的可维护性。以下是 Python 中 Celery 的基本使用详情攻略。 安装 Celery 在使用 Celery 之前,需要先安装它。可以通过以下命令来安装: pip install celery 创建…

    python 2023年6月2日
    00
  • Python实现byte转integer

    使用struct库实现byte转integer 使用Python内置的struct库可以实现将byte数据转换为其他类型的原生Python数据类型。 在这个库中,使用unpack()函数能够解析二进制数据为指定的类型,其中“<”表示小字节序,i表示类型为整型。 以下是一个使用struct库进行byte转integer的示例代码: import stru…

    python 2023年6月5日
    00
合作推广
合作推广
分享本页
返回顶部