实战Python Socket编程:开发多用户聊天应用

实战Python Socket编程:开发多用户聊天应用

    • Python Socket 编程概述
      • 什么是Socket编程?
      • Socket编程的应用场景
      • Socket编程的重要性
      • 基本概念
    • 环境准备
      • Python版本
      • 必要的库
      • 开发环境配置
      • 调试工具
    • 基本Socket编程
      • 创建Socket
      • 绑定Socket到端口
      • 监听连接
      • 接受连接
      • 发送和接收数据
      • 代码示例:创建一个基本的Echo服务器
    • 进阶Socket编程
      • 处理多个连接
      • 使用select模块进行I/O多路复用
      • 非阻塞Sockets
      • 代码示例:构建一个多客户端处理服务器
    • Socket编程的安全性
      • 常见的安全问题及其解决方案
      • 使用SSL/TLS加密Socket连接
        • 创建加密的服务器
        • 创建加密的客户端
    • 实战案例:开发一个简单的聊天应用
      • 设计聊天应用的基本架构
      • 实现服务器端
      • 实现客户端
    • 总结
      • Socket编程在现代网络应用中的重要性
      • 总结学到的技能
      • 未来学习方向

在这里插入图片描述

Python Socket 编程概述

在现代网络编程中,Socket编程技术占据了核心地位,它是实现跨网络通信的基础。Python作为一门强大的编程语言,提供了丰富的库来支持Socket编程,使得开发者能够轻松实现客户端和服务器之间的数据交换。

什么是Socket编程?

Socket编程,简单来说,就是两个程序在网络中互相发送和接收数据的过程。一个程序充当客户端,发起请求;另一个程序充当服务器,监听来自客户端的请求。Socket是这两个程序通信的端点,你可以把它想象成是电话通信中的电话插座,数据通过它在网络中流动。

Socket编程的应用场景

Socket编程的应用非常广泛,包括但不限于:

  • Web 应用通信:浏览器与服务器之间的数据交换,例如HTTP/HTTPS请求。
  • 即时通信软件:如QQ、微信等,它们使用Socket来实现实时消息传递。
  • 网络游戏:多人在线游戏中,玩家之间的动作同步也是通过Socket来实现的。
  • 物联网(IoT)设备通信:不同物联网设备之间的数据传输,如智能家居控制系统。

Socket编程的重要性

理解和掌握Socket编程对于每一个网络开发者来说都是非常重要的。它不仅仅是实现网络通信的基础,更是理解网络协议(如TCP/IP协议)工作原理的关键。通过Socket编程,开发者可以更加深入地理解网络的本质,提高问题诊断和解决的能力。

基本概念

在深入Socket编程之前,我们需要了解一些基本概念:

  • IP地址:网络中每个设备的唯一标识符。
  • 端口号:一个网络服务的具体接口,用于区分同一设备上的不同服务。
  • TCP和UDP:两种主要的传输协议,TCP(传输控制协议)提供可靠的、面向连接的通信流,而UDP(用户数据报协议)则提供简单的、无连接的数据传输服务。

在接下来的章节中,我们将进一步深入讨论如何在Python中具体实现Socket编程,包括创建Socket、绑定、监听、接受连接以及数据的发送和接收。我们还将通过实例代码,演示如何构建一个基本的服务器和客户端,以及如何处理多个连接。

环境准备

在深入Python的Socket编程之前,合适的开发环境是必不可少的。这包括确保Python版本的兼容性,安装必要的库,以及配置一个高效的开发和调试环境。

Python版本

Socket编程在Python中得到了良好的支持,几乎所有的Python版本都内置了Socket编程相关的库。但为了利用最新的功能和安全性改进,推荐使用Python 3.6及以上版本。可以通过运行python --versionpython3 --version在命令行中检查已安装的Python版本。

必要的库

Python的标准库中已经包含了socket模块,这意味着你不需要安装任何外部库就可以进行基本的Socket编程。此模块提供了丰富的方法和属性,用于创建Socket、数据传输等。

对于更复杂的网络编程需求,如SSL加密通信,可以使用ssl模块,该模块同样包含在Python的标准库中。

开发环境配置

虽然可以使用任何文本编辑器来编写Python代码,但选择一个功能强大的集成开发环境(IDE)可以大大提高开发效率。以下是一些流行的Python IDE:

  • PyCharm:JetBrains出品,功能强大,提供了代码自动完成、调试支持、项目管理等功能。
  • Visual Studio Code (VS Code):轻量级但功能强大,通过安装Python插件可以获得良好的Python开发支持。
  • Jupyter Notebook:适合做数据分析和学习,可以实时运行代码并查看结果,但对于复杂的应用开发可能不够便捷。

调试工具

在开发Socket应用时,调试是不可避免的。以下工具可以帮助你更有效地调试网络应用:

  • Wireshark:一款网络协议分析工具,可以捕获和浏览网络上的数据包。
  • Postman:虽然主要用于API开发和测试,但对于HTTP协议的Socket开发也很有帮助。
  • tcpdump:命令行下的网络抓包工具,功能强大但学习曲线较陡峭。

在配置好开发环境后,你就已经准备好开始Python的Socket编程之旅了。在下一节,我们将深入讨论如何使用Python创建Socket,以及如何进行基本的网络通信。

基本Socket编程

Socket编程的核心在于建立通信连接的两个端点:客户端和服务器。本节将通过创建一个简单的Echo服务器和客户端示例,演示如何使用Python的socket模块进行基本的Socket编程。

创建Socket

首先,我们需要导入Python的socket模块,并创建一个Socket对象。Socket对象支持上下文管理协议,因此可以使用with语句确保Socket正确关闭。

import socket

# 创建一个socket对象
# AF_INET指定使用IPv4地址,SOCK_STREAM指定使用TCP协议
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    pass  # 这里将添加更多代码

绑定Socket到端口

创建Socket后,需要将其绑定到服务器上的一个端口,以便监听来自客户端的连接请求。

host = '127.0.0.1'  # 本地主机
port = 65432        # 非保留端口号

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)
        if not data:
            break
        conn.sendall(data)

发送和接收数据

在这个Echo服务器的示例中,服务器接收到来自客户端的数据后,将相同的数据发送回客户端。recv方法用于接收数据,sendall方法用于发送数据。

代码示例:创建一个基本的Echo服务器

将上述代码片段整合在一起,我们就得到了一个基本的Echo服务器。

import socket

host = '127.0.0.1'
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)
            if not data:
                break
            conn.sendall(data)

这个服务器会一直运行,接收客户端的连接并回显任何接收到的数据,直到客户端断开连接。

在下一节,我们将探讨如何处理多个连接,以及如何在服务器端同时服务于多个客户端。

进阶Socket编程

在基本的Socket编程中,我们了解了如何创建一个简单的Echo服务器。然而,这样的服务器一次只能处理一个客户端。在实际应用中,服务器需要能够同时处理多个客户端的连接请求。这就引出了进阶Socket编程的需要。

处理多个连接

为了同时服务多个客户端,服务器需要能够并行处理多个连接。这通常通过以下两种方法实现:

  • 多线程或多进程:为每个新接受的连接创建一个新线程(或进程),让每个客户端都在自己的线程(或进程)中运行。
  • 非阻塞Sockets和I/O多路复用:使用非阻塞Sockets配合selectpoll,使单个线程能够监视多个连接。

使用select模块进行I/O多路复用

select模块允许程序同时监控多个Sockets的状态变化,从而在单个线程内处理多个连接。当任何一个Socket准备好读取或写入时,select函数将返回,使程序能够相应地处理。

以下是使用select模块实现的多客户端Echo服务器的简化示例:

import socket
import select

host = '127.0.0.1'
port = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((host, port))
    s.listen()
    s.setblocking(False)  # 设置socket为非阻塞模式
    sockets_list = [s]

    print(f"服务器启动成功,监听于{host}:{port}")

    while True:
        # 使用select监视sockets
        read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)

        for notified_socket in read_sockets:
            if notified_socket == s:
                client_socket, client_address = s.accept()
                print(f"新连接来自 {client_address}")
                sockets_list.append(client_socket)
            else:
                data = notified_socket.recv(1024)
                if data:
                    notified_socket.sendall(data)
                else:
                    sockets_list.remove(notified_socket)

        for notified_socket in exception_sockets:
            sockets_list.remove(notified_socket)
            notified_socket.close()

非阻塞Sockets

在使用select模块时,通常将Sockets设置为非阻塞模式。这意味着当调用recvsend方法时,如果没有数据可读或不能立即发送数据,这些方法会立即返回,而不是挂起等待。

代码示例:构建一个多客户端处理服务器

上述代码展示了如何使用select模块和非阻塞Sockets来构建一个可以同时处理多个客户端的服务器。这种方法相比多线程或多进程,更加高效,特别是在需要处理大量连接时。

在下一节中,我们将讨论Socket编程的安全性,探讨常见的安全问题及其解决方案,并学习如何使用SSL/TLS加密Socket连接。

Socket编程的安全性

在网络编程中,确保数据传输的安全是极其重要的。不幸的是,未加密的Socket连接容易受到多种攻击,如中间人攻击(MITM)、数据泄露、以及各种形式的数据篡改。

常见的安全问题及其解决方案

  • 数据泄露:未加密的数据在网络中传输,容易被截获。解决方案是使用加密连接,如通过SSL/TLS加密数据。
  • 中间人攻击:攻击者拦截客户端和服务器之间的通信。通过使用SSL/TLS可以有效防止此类攻击,因为它不仅加密数据,还可以验证服务器和客户端的身份。
  • 数据篡改:在数据传输过程中被第三方修改。SSL/TLS提供的加密也能有效避免这种问题。

使用SSL/TLS加密Socket连接

SSL(安全套接字层)和TLS(传输层安全)协议可以为Socket连接提供加密,保护数据传输过程中的隐私和完整性。Python的ssl模块提供了对SSL/TLS加密的支持,使得在Socket编程中实现加密变得简单。

创建加密的服务器

要创建一个使用SSL/TLS加密的Socket服务器,首先需要生成SSL证书和私钥。这里假设我们已经有了certificate.pemkey.pem文件。

接下来,我们可以使用ssl模块来包装普通的Socket,从而创建一个加密的Socket。

import socket
import ssl

host = 'localhost'
port = 65432
context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(certfile="path/to/certificate.pem", keyfile="path/to/key.pem")

with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:
    sock.bind((host, port))
    sock.listen(5)
    with context.wrap_socket(sock, server_side=True) as ssock:
        conn, addr = ssock.accept()
        print(f"加密连接来自 {addr}")
创建加密的客户端

客户端同样需要使用ssl模块来创建加密的Socket连接。

import socket
import ssl

host = 'localhost'
port = 65432
context = ssl.create_default_context()

with socket.create_connection((host, port)) as sock:
    with context.wrap_socket(sock, server_hostname=host) as ssock:
        print(f"连接到 {host} 成功")

通过上述方法,我们可以在客户端和服务器之间建立加密的连接,大大增强数据传输的安全性。

在下一节中,我们将通过一个实战案例——开发一个简单的聊天应用,来综合运用我们学到的Socket编程知识。

实战案例:开发一个简单的聊天应用

这个聊天应用的目标是允许多个用户连接到服务器,并能在一个共享的聊天室中互相发送消息。我们将从设计聊天应用的基本架构开始,然后分别实现服务器端和客户端。

设计聊天应用的基本架构

聊天应用的基本架构包括以下几个部分:

  • 服务器端:负责监听和接受新的客户端连接,维护当前在线的客户端列表,转发消息给所有连接的客户端。
  • 客户端:连接到服务器,发送用户的消息,并接收来自其他用户的消息。

实现服务器端

服务器端需要能够处理多个客户端的连接,并转发消息。为此,我们将使用之前讨论的select模块来同时监控多个连接。

服务器端的基本逻辑如下:

  1. 监听并接受新的客户端连接。
  2. 接收来自客户端的消息,并将其转发给所有其他已连接的客户端。
  3. 处理客户端断开连接的情况。

以下是服务器端代码的简化版本:

import socket
import select

HOST = '127.0.0.1'
PORT = 65432

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT))
server_socket.listen()

sockets_list = [server_socket]
clients = {}

def receive_message(client_socket):
    try:
        message = client_socket.recv(1024).decode('utf-8')
        return message
    except:
        return False

while True:
    read_sockets, _, exception_sockets = select.select(sockets_list, [], sockets_list)
    for notified_socket in read_sockets:
        if notified_socket == server_socket:
            client_socket, client_address = server_socket.accept()
            user = receive_message(client_socket)
            if user is False:
                continue
            sockets_list.append(client_socket)
            clients[client_socket] = user
            print(f"Accepted new connection from {client_address[0]}:{client_address[1]} username:{user}")
        else:
            message = receive_message(notified_socket)
            if message is False:
                print(f"Closed connection from {clients[notified_socket]}")
                sockets_list.remove(notified_socket)
                del clients[notified_socket]
                continue
            user = clients[notified_socket]
            print(f"Received message from {user}: {message}")
            for client_socket in clients:
                if client_socket != notified_socket:
                    client_socket.send(f"{user}: {message}".encode('utf-8'))
    for notified_socket in exception_sockets:
        sockets_list.remove(notified_socket)
        del clients[notified_socket]

实现客户端

客户端的基本功能包括连接到服务器、发送消息、以及接收并显示来自其他用户的消息。

客户端代码的简化版本如下:

import socket
import select
import sys

HOST = '127.0.0.1'
PORT = 65432

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((HOST, PORT))
client_socket.setblocking(False)

while True:
    sockets_list = [sys.stdin, client_socket]
    read_sockets, _, _ = select.select(sockets_list, [], [])
    
    for notified_socket in read_sockets:
        if notified_socket == client_socket:
            message = notified_socket.recv(1024).decode('utf-8')
            print(message)
        else:
            message = sys.stdin.readline()
            client_socket.send(message.encode('utf-8'))

这个简单的聊天应用展示了如何使用Python的Socket编程来实现多用户的实时通信。尽管这里的示例很基础,但它为构建更复杂的网络应用提供了一个良好的起点。

在本文的最后,我们总结了Socket编程在现代网络应用中的重要性,并回顾了通过这个实战案例学到的技能。希望这能为你在网络编程的旅途上提供一些帮助。

总结

通过本文的学习,我们已经了解了如何在Python中使用Socket进行网络编程,包括创建基本的服务器和客户端、处理多个连接、保证通信的安全性,以及构建一个简单的聊天应用。这些知识点为深入探索网络编程和开发复杂网络应用奠定了基础。

Socket编程在现代网络应用中的重要性

Socket编程是网络应用开发的基石,它允许不同设备之间进行数据交换,是实现即时通讯、网络服务、远程控制等功能的关键技术。随着物联网(IoT)和分布式系统的快速发展,掌握Socket编程变得越来越重要。

总结学到的技能

  • 基础Socket编程:包括创建Socket,绑定、监听端口,接受连接,以及数据的发送和接收。
  • 进阶技巧:处理多个连接、I/O多路复用、非阻塞Sockets。
  • 安全性考虑:使用SSL/TLS加密保护数据传输的安全。
  • 实战应用:开发一个支持多用户在线的简单聊天应用。

未来学习方向

  • 深入理解网络协议:如TCP/IP、HTTP/HTTPS等,了解它们的工作原理和实现细节。
  • 异步编程:探索Python的asyncio库,了解如何使用异步I/O提高应用性能。
  • 框架和库:学习如Flask-SocketIO这样的框架和库,它们简化了Socket编程,特别是在Web应用中。
  • 网络安全:深入研究网络安全,学习如何保护应用不受DDoS攻击、SQL注入等网络攻击的威胁。

通过不断学习和实践,你将能够开发出更加复杂和强大的网络应用,满足日益增长的网络通信需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/461597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于C++的反射功能

需求&#xff1a; 利用C的发射机制&#xff0c;实现根据字符串创建实例对象。 代码&#xff1a; #ifndef OBJECT_H #define OBJECT_H#include <string> #include <map>typedef void* (*Constructor)();class CObjectFactory { public:static void registerClass…

Spring Boot轻松整合Minio实现文件上传下载功能【建议收藏】

一、Linux 安装Minio 安装 在/root/xxkfz/soft目录下面创建文件minio文件夹&#xff0c;进入minio文件夹&#xff0c;并创建data目录&#xff1b; [rootxxkfz soft]# mkdir minio [rootxxkfz soft]# cd minio [rootxxkfz minio]# mkdir data执行如下命令进行下载 [rootxxkf…

python基础——字符串的常见操作方法【下标索引,index,count,len,replace,split,strip】

&#x1f4dd;前言&#xff1a; 字符串是一种有序的&#xff0c;允许重复字符串存在的&#xff0c;不可修改的序列 这篇文章主要总结一下python中有关字符串的部分相关知识&#xff0c;以及字符串的常见操作方法&#xff1a; 1&#xff0c;和其他序列极其类似的操作方法 2&…

Three 材质纹理 (总结三)

THREE.MeshLambertMaterial&#xff08;网格 Lambert 材质&#xff09; 该材质使用基于非物理的Lambertian模型来计算反射率。可以用来创建暗淡的并不光亮的表面&#xff0c;该材质非常易用&#xff0c;而且会与场景中的光源产生反应。 MeshLambertMaterial属性 # .color : …

mysql中用逗号隔开的某字段,如何判断其他表的字段值是否在这个字段中

因为要增加需求&#xff0c;需要将线上表中老数据&#xff0c;修改为新数据的规则。 线上两张表&#xff0c;sequence_number中is_use有3作废、2到期状态&#xff0c;需要根据这个状态和school_ai_authorization中的is_deleted修改新增的state字段。 sequence_number表结构&…

数据分析实战-Python实现博客评论数据的情感分析

数据分析实战-Python实现博客评论数据的情感分析 学习建议SnowNLP基础什么是SnowNLP&#xff1f;SnowNLP情感分析 SnowNLP使用SnowNLP安装情感分析中文分词关键词提取拼音、词性标准 SnowNLP实战-博客评论数据的情感分析数据准备数据获取数据分析 总结 学习建议 现在很多网站、…

关于振弦采集仪的应用编写

instruction&#xff1a; 1、本应用基于深圳市安传物联科技有限公司所生产的八通道振弦变送器产品。该产品为MAX485 信号的变送设备&#xff0c; 并以Modbus协议输出。 2、本应用采用python语言编写。 功能实现&#xff1a; 1、发送&#xff1a; 01 03 10 00 00 02 C0 CB并…

JVM之调优(一)

背景&#xff1a;生产环境由于堆内存较大&#xff0c;fullgc 垃圾回收导致程序卡顿问题&#xff08;假死&#xff09; 目录 一、程序卡顿导致的影响 前端页面空白后端数据重复 二、解决方法 降低堆内存大小使用合适的垃圾回收器&#xff08;可以尝试&#xff0c;还未进行测试…

【python】爬取杭州市二手房销售数据做数据分析【附源码】

一、背景 在数据分析和市场调研中&#xff0c;获取房地产数据是至关重要的一环。本文介绍了如何利用 Python 中的 requests、lxml 库以及 pandas 库&#xff0c;结合 XPath 解析网页信息&#xff0c;实现对链家网二手房销售数据的爬取&#xff0c;并将数据导出为 Excel 文件的过…

捋顺【反函数求导】

设 d y d x f ( x ) 则 d x d y 1 f ( x ) 以 y t a n x 为 例 &#xff0c; d y / d x s e c 2 x , d x / d y 1 s e c 2 x c o s 2 x 到 此 为 止 &#xff0c; 似 乎 难 以 推 导 &#xff0c; 但 是 假 如 用 t a n x ( 也 就 是 y ) 将 c o s 2 x 表 示 出 来 &…

jenkins容器中安装python遇到问题

在Jenkins容器中安装配置Python时遇到问题 执行./configure --prefix/opt/python3/时遇到configure: error: no acceptable C compiler found in $PATH 这个问题就是缺少gcc编译环境。将gcc安装上即可&#xff1a; yum install -y gcc##前提是容器里的系统是cenos才可以&#…

实在智能Agent——RPA终极进化方向

RPA技术备受瞩目&#xff0c;它通过“机器人”自动化了人力执行的重复性、低复杂度任务&#xff0c;解放了员工并降低了企业成本。RPA机器人全天候运行&#xff0c;避免人为错误&#xff0c;高效处理任务&#xff0c;成为处理事务、操作数据、回应查询的理想选择。在管理后台&a…

易方达产品亏损仍存,“老鼠仓”阴影犹在,如何突出重围?

近日&#xff0c;易方达基金宣布易方达沪深300 ETF跻身“千亿规模ETF”行列&#xff0c;成为国内“ETF千亿俱乐部”的第三位成员。截至3月8日&#xff0c;该基金的规模增长112.21亿元&#xff0c;涨幅9.45%&#xff0c;规模增量在10亿以上的股票型ETF产品中排名第一。 回望202…

(网络安全)一款强大的逆向分析工具,开源!

工具介绍 Ghidra 是由美国国家安全局&#xff08;NSA&#xff09;研究部门开发的软件逆向工程&#xff08;SRE&#xff09;套件&#xff0c;用于支持网络安全任务。包括一套功能齐全的高端软件分析工具&#xff0c;使用户能够在各种平台(Windows、Mac OS和Linux)分析编译后的代…

TCP相关特性

协议段格式 • 源/⽬的端⼝号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认号:后⾯详细讲; • 4位TCP报头⻓度:表⽰该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最⼤⻓度是15*460 • 6位标志位: ◦ URG:紧急指针是否有效 ◦ ACK:确认号是否有效…

排序(10)——非比较排序计数排序

目录 思想 局限性 基本思路 代码实现 特性总结 思想 思想&#xff1a;计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff1a; 统计相同元素出现次数根据统计的结果将序列回收到原来的序列中 首先有一个a数组&#xff0c;里面都有元素&a…

部署prometheus+Grafana可视化仪表盘监控服务

一、部署prometheus及监控仪表盘 简介 Prometheus是开源监控报警系统和时序列数据库(TSDB)。 Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控&#xff0c;输出被监控组件信息的HTTP接口被叫做expo…

C 练习实例77-指向指针的指针-二维数组

关于数组的一些操作 #include<stdio.h> #include<stdio.h> void fun(int b[],int length) {for(int i0;i<length;i){printf("%d ",b[i]);}printf("\n");for(int i0;i<length;i){ //数组作为形参传递&#xff0c;传递的是指针&#xff0…

生成单一c段或者连续c段范围内的所有ip地址+生成范围内C段脚本

1. 背景 马上有电子政务外网攻防演练要处理ip 2. 脚本1 生成c段和连续c段所有ip地址.py 用处&#xff1a;生成单一c段或者连续c段范围内的所有ip地址。 用法&#xff1a;ipc.txt 放入 ip段或者两个ip段范围&#xff1a;如&#xff1a; 192.168.3.0/24 172.16.1.0/24-1…