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日

相关文章

  • 全网最新用python实现各种文件类型转换的方法

    全网最新用Python实现各种文件类型转换的方法 在Python中,我们可以使用各种库来实现文件类型转换,例如Pillow库、ffmpeg库、pywin32库等等。下面我们来分别介绍一下这些库,并且给出两条示例说明。 Pillow库 Pillow是Python Imaging Library(PIL)的替代品,是一个强大的图像处理库。我们可以使用Pillow…

    python 2023年6月2日
    00
  • 详解查看Python解释器路径的两种方式

    查看Python解释器路径通常有两种方式: 1.使用sys模块查看Python解释器路径 sys模块是Python标准库中的一个核心库,提供了与Python解释器信息相关的变量和函数。使用sys模块中的path变量可以方便地查看Python解释器路径。 示例1:查看当前Python解释器路径 import sys print(sys.path) 返回值为一个…

    python 2023年6月3日
    00
  • python学习-List移除某个值remove和统计值次数count

    以下是“Python学习-List移除某个值remove和统计值次数count”的完整攻略。 1. List移除某个值remove 在Python中,List是一种常用的数据类型,用于存储组有序的元素。List中的元素可以是任何类型的数据,包括数字、字符串列表等。有时候,我们需要从List中移除某个特定的值,可以使用remove()方法来实现。remove(…

    python 2023年5月13日
    00
  • 详解如何利用tushare、pycharm和excel三者结合进行股票分析

    下面是详解如何利用tushare、pycharm和excel三者结合进行股票分析的完整实例教程。 一、前期准备 安装和配置 安装pycharm和tushare: 首先要安装好pycharm和tushare两个软件。pycharm是一款Python集成开发环境,tushare是一款用于获取股票行情数据的Python库。安装方法可以到官网上下载后按照默认设置进行…

    python 2023年5月14日
    00
  • Python实现自定义Jupyter魔法命令

    下面我用标准的markdown格式文本,为大家详细讲解“Python实现自定义Jupyter魔法命令”的完整攻略。 什么是Jupyter魔法命令 Jupyter Notebook是一个非常强大的交互式计算工具,而Jupyter魔法命令可以让我们在Jupyter Notebook中更快速、方便地编写代码,包括在代码中添加文件、包、环境变量等。Jupyter魔法…

    python 2023年5月19日
    00
  • Python使用sorted对字典的key或value排序

    Python中使用sorted函数可以对字典的key或value进行排序。下面就来详细讲解一下如何使用sorted函数对字典进行排序。 字典排序方法 按key排序 字典的sorted排序方法默认按照字典的key进行排序,用法如下: dict = {‘a’: 2, ‘d’: 1, ‘c’: 3} print(sorted(dict.items())) 结果为:…

    python 2023年5月13日
    00
  • 在vscode中配置python环境过程解析

    下面是详细的“在vscode中配置python环境过程解析”的攻略: 1. 安装Python和VS Code 首先需要安装Python和VS Code。Python安装可以到官网下载对应版本的Python,安装即可。VS Code则可以到官网下载对应版本,安装也非常简单。 2. 安装Python插件 在VS Code中,我们需要安装Python插件,这个插件…

    python 2023年6月3日
    00
  • 浅谈python中的正则表达式(re模块)

    浅谈Python中的正则表达式(re模块) 正则表达式是一种强大的文本处理工具,它可以用来匹配、查找、替换文本中的特定模式。在Python中,我们可以使用re模块来实现正则表达式的相关操作。本文将为您详细讲解Python中的正则表达式,包括正则表达的基本语法、re模块的常用函数、以及两个示例说明。 正则表达式的基本语法 正则表式是由一些特殊字符和普通字符组成…

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