当前位置:

首页 > 编程开发 > Python Socket网络编程入门教程

Python Socket网络编程入门教程

Python的socket模块是网络编程基础,支持TCP和UDP两种通信模式。TCP提供可靠、有序、有连接的数据传输,适用于HTTP、FTP等对数据完整性要求高的场景;UDP则为无连接、低开销、不可靠传输,适合实时音视频、在线游戏等对实时性要求高但可容忍丢包的应用。服务器端通过创建socket、绑定地址端口、监听、接受连接并收发数据来实现通信。处理并发连接主要有三种方式:多线程(适合I/O密集型、客户端数量适中)、多进程(适合CPU密集型任务)和异步I/O(基于asyncio,高并发、高性能,适合大规模连

Python的socket模块是网络编程基础,支持TCP和UDP两种通信模式。TCP提供可靠、有序、有连接的数据传输,适用于HTTP、FTP等对数据完整性要求高的场景;UDP则为无连接、低开销、不可靠传输,适合实时音视频、在线游戏等对实时性要求高但可容忍丢包的应用。服务器端通过创建socket、绑定地址端口、监听、接受连接并收发数据来实现通信。处理并发连接主要有三种方式:多线程(适合I/O密集型、客户端数量适中)、多进程(适合CPU密集型任务)和异步I/O(基于asyncio,高并发、高性能,适合大规模连接)。编程中需重视错误处理,如捕获socket异常、设置超时、优雅关闭连接,并防范半开连接问题。安全性方面应进行输入验证、限制数据大小、使用TLS/SSL加密、实施身份验证与授权、遵循最小权限原则,避免硬编码敏感信息,同时进行资源限制和日志记录,确保应用健壮与安全。

如何使用Python进行网络编程(Socket)?

Python的socket模块是进行网络编程的核心工具,它允许我们创建客户端和服务器应用程序,通过网络交换数据。简单来说,它就是网络通信的“插座”,是我们构建任何基于网络通信应用的基础,无论是简单的聊天工具还是复杂的分布式系统,都离不开它。掌握它,你就打开了网络世界的一扇大门。

解决方案

使用Python进行Socket编程,通常围绕着TCP(传输控制协议)和UDP(用户数据报协议)两种模式展开。这里我们主要聚焦于更常用、也更可靠的TCP模式,因为它在数据传输的完整性和顺序性上提供了保障。

服务器端(Server)

创建一个TCP服务器,大致需要以下几个步骤:

  1. 创建Socket对象: 使用socket.socket()函数,指定地址族(通常是socket.AF_INET,表示IPv4)和Socket类型(socket.SOCK_STREAM表示TCP)。
  2. 绑定地址和端口: 服务器需要在一个特定的IP地址和端口上监听传入的连接请求。socket.bind((host, port))就是做这个的。host可以是'0.0.0.0'表示监听所有可用的网络接口。
  3. 开始监听: socket.listen(backlog)服务器准备好接受连接。backlog参数指定了在拒绝新连接之前,系统可以排队的未处理连接请求的最大数量。
  4. 接受连接: socket.accept()是一个阻塞调用,它会等待客户端连接。一旦有客户端连接,它会返回一个新的Socket对象(用于与该客户端通信)和客户端的地址。
  5. 数据收发: 使用新返回的客户端Socket对象进行数据的接收(client_socket.recv(buffer_size))和发送(client_socket.sendall(data))。
  6. 关闭连接: 通信结束后,务必关闭客户端Socket(client_socket.close())和服务器Socket(server_socket.close()),释放资源。

一个简单的TCP服务器示例:

import socket

HOST = '127.0.0.1'  # 或者 '0.0.0.0' 监听所有接口
PORT = 65432        # 监听端口

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    print(f"服务器正在监听 {HOST}:{PORT}")
    conn, addr = s.accept() # 阻塞,等待客户端连接
    with conn:
        print(f"连接来自 {addr}")
        while True:
            data = conn.recv(1024) # 接收数据,缓冲区大小1024字节
            if not data:
                break # 客户端断开连接
            print(f"收到: {data.decode('utf-8')}")
            conn.sendall(b"Hello, client! I received your message.")
print("服务器关闭。")

客户端(Client)

客户端的流程相对简单:

  1. 创建Socket对象:服务器端,指定地址族和Socket类型。
  2. 连接服务器 socket.connect((host, port))尝试与指定的服务器建立连接。
  3. 数据收发: 连接成功后,直接使用该Socket对象进行数据的发送(s.sendall(data))和接收(s.recv(buffer_size))。
  4. 关闭连接: 通信结束后,关闭Socket(s.close())。

一个简单的TCP客户端示例:

import socket

HOST = '127.0.0.1'  # 服务器的IP地址
PORT = 65432        # 服务器的端口

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b"Hello, server! This is client.")
    data = s.recv(1024)
    print(f"收到服务器回复: {data.decode('utf-8')}")
print("客户端关闭。")

记住,sendall()会尝试发送所有数据,直到成功或发生错误。recv()则会接收最多指定字节数的数据,如果连接关闭或没有数据,它可能返回空字节串。处理这些细节,是编写健壮网络应用的关键。

Python Socket编程中,TCP与UDP的选择与应用场景有何不同?

这事儿说起来,TCP和UDP就像是网络通信里的两种截然不同的性格。我个人觉得,理解它们的本质差异,比死记硬背它们的功能要重要得多,因为这直接决定了你的应用应该走哪条路。

TCP (Transmission Control Protocol),我们通常称之为“传输控制协议”,它的核心特点就是可靠、有序、有连接。你可以把它想象成打电话:你拨号,对方接听,建立连接。然后你们对话,每一句话(数据包)都会被确认收到,而且按顺序传输。如果中间信号不好,听不清了,你会要求对方再说一遍。这就是TCP的哲学。

  • 可靠性: TCP会确保数据完整无误地到达目的地。它有错误校验、重传机制。如果数据包丢失了,它会重新发送,直到对方确认收到。
  • 有序性: 数据包会按照发送的顺序到达接收端。这对于很多应用来说至关重要,比如文件传输、网页浏览,你肯定不希望文件内容乱序或者网页图片加载一半是另一半的内容吧。
  • 有连接: 在数据传输之前,TCP需要经过“三次握手”建立连接,传输结束后还需要“四次挥手”断开连接。这会带来一些开销,但提供了会话管理的能力。
  • 流量控制和拥塞控制: TCP还会根据网络状况调整发送速率,避免因为发送过快导致网络拥堵或接收方处理不过来。

应用场景: 任何需要高可靠性、数据完整性、顺序性的地方。比如:

  • HTTP/HTTPS (网页浏览): 你希望网页内容完整无缺地呈现在你面前。
  • FTP (文件传输): 文件内容不能有任何差错。
  • SMTP (邮件发送): 邮件内容丢了一段可就麻烦了。
  • SSH (远程登录): 命令和输出必须准确无误。

UDP (User Datagram Protocol),即“用户数据报协议”,则完全是另一种风格,我称之为“尽力而为、无连接”。它更像寄明信片:你写好就寄出去,至于对方有没有收到,什么时候收到,顺序对不对,它一概不管。它只负责把数据包扔到网络上,至于后续就看运气了。

  • 不可靠性: UDP不保证数据包一定能到达,也不保证顺序。数据包可能会丢失、重复或乱序。
  • 无连接: UDP在发送数据前不需要建立连接,发送完也不需要断开连接。这省去了握手和挥手的开销,所以速度通常更快。
  • 开销小: UDP头部比TCP小得多,这意味着每个数据包携带的有效载荷更多,传输效率更高。

应用场景: 对实时性要求高,但可以容忍少量数据丢失,或者应用层自己可以处理可靠性的场景。比如:

  • 实时音视频传输 (流媒体): 偶尔卡顿、丢帧可以接受,但延迟太高就没法看了。
  • 在线游戏: 玩家操作指令需要快速响应,偶尔丢几个数据包,游戏逻辑可以自己补偿。
  • DNS (域名解析): 快速查询,如果一个DNS服务器没响应,可以很快切换到另一个。
  • NTP (网络时间协议): 时间同步,对精度要求高,但少量误差可接受。

在我看来,选择TCP还是UDP,本质上是你在可靠性实时性/效率之间做权衡。如果你需要“绝对不能出错”的数据传输,选TCP;如果你需要“越快越好,稍微错一点没关系”的数据传输,UDP更合适。有时候,为了兼顾两边,你甚至可以在UDP之上自己实现一套可靠传输机制,这在一些高性能网络应用中并不少见。

如何在Python Socket服务器中处理并发连接?

处理并发连接是构建任何实用网络服务器的核心挑战。毕竟,你不可能指望服务器一次只服务一个客户端吧?这会严重限制其可用性。在Python中,处理并发主要有几种策略,各有优劣,选择哪种取决于你的具体需求和对复杂度的接受程度。

  1. 多线程 (Threading) 这是最直观也最容易上手的方法。每当服务器接受到一个新的客户端连接时,就为这个连接创建一个新的线程来处理它的通信。

    • 工作原理: 主线程负责监听和接受新连接,一旦accept()返回,就启动一个新线程,将客户端Socket传递给它,让新线程去处理数据的收发。
    • 优点: 编程模型相对简单,每个客户端的逻辑可以独立在一个函数或方法中实现。对于I/O密集型任务(比如等待网络数据),线程在等待时可以释放CPU,让其他线程运行。
    • 缺点: Python的全局解释器锁(GIL)意味着在任何给定时刻,只有一个线程能执行Python字节码。这限制了CPU密集型任务的并行性。此外,线程的创建和销毁也有一定的开销,大量线程会消耗较多内存。线程之间共享数据需要小心加锁,避免竞态条件。
    • 适用场景: 客户端数量不多(几十到几百),I/O操作较多的应用,对响应时间要求不是极致苛刻。
    import socket
    import threading
    
    HOST = '127.0.0.1'
    PORT = 65432
    
    def handle_client(conn, addr):
        print(f"连接来自 {addr}")
        try:
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                print(f"[{addr}] 收到: {data.decode('utf-8')}")
                conn.sendall(f"Hello from server, received: {data.decode('utf-8')}".encode('utf-8'))
        except Exception as e:
            print(f"客户端 {addr} 发生错误: {e}")
        finally:
            print(f"客户端 {addr} 断开连接。")
            conn.close()
    
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))
        s.listen()
        print(f"服务器正在监听 {HOST}:{PORT}")
        while True:
            conn, addr = s.accept()
            # 为每个新连接创建一个新线程
            client_thread = threading.Thread(target=handle_client, args=(conn, addr))
            client_thread.start()
  2. 多进程 (Multiprocessing) 如果你的应用是CPU密集型的,或者你需要真正的并行处理,多进程是一个更好的选择。

    • 工作原理: 类似于多线程,但为每个客户端连接创建一个独立的进程。进程之间不共享内存空间,因此不受GIL的限制,可以利用多核CPU。
    • 优点: 真正的并行处理,可以充分利用多核CPU。进程间内存隔离,避免了线程间复杂的同步问题(但进程间通信IPC仍需考虑)。
    • 缺点: 进程的创建和销毁开销比线程大得多,消耗更多系统资源。进程间通信(IPC)比线程间通信复杂。
    • 适用场景: CPU密集型任务,需要处理大量计算,或者需要更高隔离度的场景。
  3. 异步I/O (Asynchronous I/O) 这是现代高性能网络服务的主流方案,Python的asyncio库提供了强大的支持。它通过事件循环(event loop)和协程(coroutines)实现单线程并发。

    • 工作原理: 服务器只有一个线程,但它不会阻塞在任何一个I/O操作上。当一个I/O操作(如recv())需要等待时,它会将控制权交还给事件循环,让事件循环去处理其他已就绪的I/O操作。当之前的I/O操作完成时,事件循环会重新调度对应的协程继续执行。
    • 优点: 极高的并发能力和扩展性,单个线程就能处理成千上万的连接,资源消耗低。避免了线程/进程切换的开销和同步问题。
    • 缺点: 编程模型相对复杂,需要理解协程、async/await语法。所有I/O操作都必须是异步的,如果混入阻塞的同步操作,会卡住整个事件循环。
    • 适用场景: 大规模并发连接,I/O密集型任务(如Web服务器、API网关),对性能和扩展性有极高要求的场景。
    import asyncio
    
    HOST = '127.0.0.1'
    PORT = 65432
    
    async def handle_echo(reader, writer):
        addr = writer.get_extra_info('peername')
        print(f"连接来自 {addr}")
        try:
            while True:
                data = await reader.read(1024) # 异步读取
                if not data:
                    break
                message = data.decode('utf-8')
                print(f"[{addr}] 收到: {message}")
                writer.write(f"Hello from async server, received: {message}".encode('utf-8'))
                await writer.drain() # 异步发送,确保数据已写入底层socket
        except Exception as e:
            print(f"客户端 {addr} 发生错误: {e}")
        finally:
            print(f"客户端 {addr} 断开连接。")
            writer.close()
            await writer.wait_closed() # 等待writer关闭
    
    async def main():
        server = await asyncio.start_server(handle_echo, HOST, PORT)
        addrs = ', '.join(str(sock.getsockname()) for sock in server.sockets)
        print(f"服务器正在监听 {addrs}")
    
        async with server:
            await server.serve_forever()
    
    if __name__ == '__main__':
        asyncio.run(main())

在我看来,如果你只是想快速搞定一个简单的服务,多线程是很好的起点。但如果你的应用需要处理大量并发,或者未来有扩展需求,那么学习和使用asyncio绝对是值得投资的。它虽然初期上手有点门槛,但一旦掌握,会让你构建的网络应用在性能和资源利用率上达到新的高度。

Python Socket编程中常见的错误处理与安全性考量有哪些?

在实际的Python Socket编程中,仅仅能收发数据是远远不够的。你还需要考虑如何优雅地处理各种异常情况,以及如何保护你的应用程序不受恶意攻击。这就像你盖房子,不能只搭个框架就完事,还得把门窗装好,把防盗措施做好。

错误处理 (Error Handling)

网络通信是个复杂的过程,各种不可预测的因素都可能导致错误:网络中断、服务器宕机、客户端突然关闭、端口被占用等等。

  1. 使用try...except捕获socket.error 这是最基本的错误处理方式。socket模块的许多操作都可能抛出socket.error(在Python 3.3+中,它通常是OSError的子类)。你应该根据不同的错误码(errno)来区分处理。例如,ConnectionRefusedError(客户端连接被拒绝),ConnectionResetError(连接被对端重置)。

    import socket
    
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect(('nonexistent.host', 80)) # 尝试连接一个不存在的地址
    except socket.gaierror as e:
        print(f"地址解析错误: {e}")
    except ConnectionRefusedError:
        print("连接被拒绝,可能是服务器未启动或端口错误。")
    except socket.timeout:
        print("连接超时。")
    except Exception as e:
        print(f"发生未知错误: {e}")
    finally:
        if 's' in locals() and s: # 确保s存在且未被关闭
            s.close()
  2. 设置超时: socket.settimeout(seconds)非常重要。默认情况下,许多Socket操作(如connect(), recv(), accept())是阻塞的,如果没有数据或连接,程序会一直等待。设置超时可以防止程序无限期地挂起,提高程序的健壮性。超时会引发socket.timeout异常。

  3. 优雅地关闭连接: 使用try...finally块来确保无论发生什么,Socket都能被关闭。with语句是更好的选择,它能自动管理资源的打开和关闭。服务器端在处理客户端连接时,如果客户端断开,recv()会返回一个空字节串,这时就应该关闭客户端Socket。

  4. 处理半开连接: 有时,一方关闭了写通道,但仍然可以读取数据。socket.shutdown(how)可以控制关闭读或写通道。how可以是socket.SHUT_RD(关闭读),socket.SHUT_WR(关闭写),或socket.SHUT_RDWR(关闭读写)。

安全性考量 (Security Considerations)

网络应用暴露在公网,安全性是绝对不能忽视的。

  1. 输入验证与净化: 任何从网络接收到的数据都应该被视为不可信的。

    • 防止注入攻击: 如果你的服务器会根据客户端输入执行系统命令或数据库查询,务必对输入进行严格的验证和净化,防止命令注入或SQL注入。
    • 限制数据大小: 限制客户端可以发送的数据包大小,防止缓冲区溢出或拒绝服务攻击(DoS)。
  2. 数据加密 (TLS/SSL): 如果你传输的数据是敏感的(如密码、个人信息),那么明文传输是极其危险的。使用TLS/SSL(传输层安全协议)对数据进行加密是必须的。Python的ssl模块可以很容易地将一个普通的Socket包装成一个安全的SSL Socket。

    import socket, ssl
    
    # 客户端示例 (假设服务器已配置SSL)
    context = ssl.create_default_context()
    with socket.create_connection(('localhost', 65432)) as sock:
        with context.wrap_socket(sock, server_hostname='localhost') as ssock:
            ssock.sendall(b"Hello securely!")
            data = ssock.recv(1024)
            print(f"收到加密回复: {data.decode('utf-8')}")

    服务器端也需要类似配置,加载证书和私钥。

  3. 身份验证和授权: 如果你的服务需要区分用户,那么你需要实现身份验证(Authentication,验证用户是谁)和授权(Authorization,验证用户能做什么)。这通常涉及用户名/密码、API密钥、OAuth等机制,而不是Socket层面的直接功能。

  4. 最小权限原则: 运行你的服务器进程时,使用具有最低必要权限的用户账户。如果服务器被攻破,攻击者也只能获得有限的权限,从而减少损害。

  5. 资源限制:

    • 连接数限制: 限制单个IP地址的连接数,防止简单的DoS攻击。
    • 请求频率限制: 限制客户端发送请求的频率,防止滥用。
    • 内存和CPU使用限制: 确保服务器不会因为某个恶意请求而耗尽系统资源。
  6. 日志记录: 记录重要的事件,如连接建立/断开、错误、异常、潜在的安全事件等。详细的日志对于调试、审计和安全事件响应至关重要。

  7. 避免硬编码敏感信息: 不要将密码、API密钥等敏感信息直接硬编码在代码中。使用环境变量、配置文件或秘密管理服务来存储和加载它们。

在我看来,安全性不是一个可以“事后添加”的功能,它应该从设计之初就融入到你的网络应用中。错误处理则是为了让你的程序更“健壮”,能优雅地从各种问题中恢复,而不是轻易崩溃。这两点,都是构建可靠、实用网络应用不可或缺的基石。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

Python安装后怎么打开:使用IDLE或命令行启动解释器
Python安装后怎么打开:使用IDLE或命令行启动解释器

刚在Windows安装好Python却不知道如何启动?本文详细演示如何通过开始菜单找到并打开IDLE集成开发环境,以及如何在PowerShell或命令提示符中使用python和py命令启动交互式解释器、运行.py脚本文件。包含退出解释器的方法及常见启动问题排查,帮助初学者快速验证安装成功并开始编写代码。

Windows系统Python安装教程:下载、勾选PATH及环境变量配置
Windows系统Python安装教程:下载、勾选PATH及环境变量配置

针对Windows初学者的Python安装实战指南。详细讲解如何从Python官网下载匹配架构的安装包,重点演示安装首屏勾选“Add python.exe to PATH”的关键操作,并提供使用python --version和py命令验证环境变量的具体步骤,帮助新手快速搭建开发环境并排查路径问题。

麒麟OS如何查看Python进程的运行状态
麒麟OS如何查看Python进程的运行状态

要想确认麒麟OS中Python程序的运行状态以及资源占用情况,我们可以这样做:用ps -ef | grep python来筛选进程;通过top命令,按P键排序查看实时负载;使用pgrep -f "script.py"精准获取PID;借助lsof -p PID验证文件打开状态。另外,还可以结合syst

Python在Debian上如何配置SSL证书
Python在Debian上如何配置SSL证书

在Debian系统上配置SSL证书通常涉及以下几个步骤:安装Web服务器:首先,你需要一个Web服务器,比如Apache或Nginx。这里以Apache为例。sudo apt updatesudo apt install apache2获取SSL证书:你可以从Let’s Encrypt免费获取SSL

统信UOS怎么安装Python开发环境
统信UOS怎么安装Python开发环境

要想让Python项目在统信UOS上正常运行,得先安装python3、python3-pip、python3-venv、python3-dev以及build-essential等组件。具体操作就是执行sudo apt install命令来一步到位完成安装,同时别忘了配置清华镜像源来给pip加速哦。在

纯Python方案实现中英文全文搜索
纯Python方案实现中英文全文搜索

在互联网上的各类网站中,无论大小,基本上都会有一个搜索框,用来给用户对内容进行搜索,小到站点搜索,大到搜索引擎搜索。从简单的来说,搜索功能确实很简单,一个简单的select语句就可以实现数据的搜索。而从复杂的来看,无论是搜索的精度还是搜索的效率,都是有很深的研究范围的。对于简单的搜索功能来说,一个s

Mac如何取消通过Python脚本运行的关机程序
Mac如何取消通过Python脚本运行的关机程序

立即在终端输入sudo shutdown -c取消倒计时关机,成功后显示“Shutdown cancelled”;若存在pmset重复任务,需再执行sudo pmset repeat cancel清除。Mac因Python脚本执行了os.system("sudo shutdown -h +10")或

Pythonasyncio异步并发与多固定出口IP调度实战
Pythonasyncio异步并发与多固定出口IP调度实战

之前写过一篇同步场景下用 Python 管理多个固定出口 IP 的实践(ExitPool + requests/httpx),覆盖了健康检查、故障转移和连接池复用。但在实际业务中,越来越多的场景用 asyncio 做高并发采集或批量接口调用——异步事件循环下多出口的管理方式和同步场景完全不同:单线程

Python在静态出口IP产品中的实战:从地址漂移巡检到多IP故障切换
Python在静态出口IP产品中的实战:从地址漂移巡检到多IP故障切换

写在前面:为什么静态出口 IP 不是"买了就行"不少团队在引入静态出口 IP 产品时,第一反应往往是:“地址配上去,这事就算完了。”可真到了真实业务里,静态出口 IP 真正能体现价值的地方,往往不在分配这一步,而在分配之后怎么管:地址有没有漂移,质量是否达标,某一条线路突然不可用时怎么切换,连接层又

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。