精华内容
下载资源
问答
  • 多选题】 路由器控制端口的特点包括: A、 使用短的电缆,需要终端接近路由器 B、 路由器发送错误消息到这个端口 C、 需要借助Modem和PSTN进行远程访问 D、 可以在这个端口上执行口令恢复 我的答案:ABD 2 【多选...

    路由器接口管理

    路由器的接口相对于交换机来说最大的特点就是接口类型和配置更为复杂,一般吧路由器上的接口分为三大类:
    1、局域网的LAN接口,
    2、用于广域网接入/互联的WAN接口,
    3、应用于LAN组网,或者WAN接入/互联网中的逻辑接口。最为复杂的就是各种WAN接口。

    接口分类

    接口是设备与网络中的其他设备交换数据并相互作用的部件。AR G3系列路由器中,所有接口共分为管理接口、物理接口和逻辑接口三大类。

    1、管理接口
    主要为用户提供配置管理支持,也就是通过此类接口可以登录到设备,并进行配置和管理操作,但管理接口不承担业务传输。

    2、物理接口
    1)LAN接口:路由器可以通过它们与局域网中的网络设备交换数据。
    2)WAN接口:路由器可以通过它们与局域网外的网络设备交换数据。

    1
    【多选题】
    路由器控制端口的特点包括:

    A、
    使用短的电缆,需要终端接近路由器
    B、
    路由器发送错误消息到这个端口
    C、
    需要借助Modem和PSTN进行远程访问
    D、
    可以在这个端口上执行口令恢复
    我的答案:ABD

    2
    【多选题】
    下列接口属于逻辑接口的是:

    A、
    Null接口
    B、
    Console接口
    C、
    VLANIF接口
    D、
    Loopback接口
    我的答案:ACD

    展开全文
  • ,今天学校实习,的是在centos下完成文件的拷贝,和上传下载,打算用apache做个网站,这样实现上传下载。现在刚连上交换机,不知道怎么设置局域网,也不知道怎么给服务器装系统。服务器没有显示屏。不是带屏幕...
  • 7、判断题、单选题、多选题由计算机自动批卷、自动评分。 8、程序提供灵活的人员录入方式,分为2级层次,可以方便地对考生进行管理了;可以自由设定参加考试的人员,可以指定一个年级、一个班级或者一个人,考生...
  • 上期传送门 继续整理~ ...在路由器进行互联的局域网结构中,要求每个局域网() C.物理层、数据链路层、网络层协议可以不同,而网络层以上的高层协议必须相同 下列设备中,能够分隔广播域的是()

    上期传送门
    继续整理~

    网络层——转发和路由选择

    1. 路由器连接的异构网络指的是()
      A.网络的拓扑结构不同
      B.网络中计算机操作系统不同
      C.数据链路层和物理层均不同
      D.数据链路层协议相同,物理层协议不同
      注:网络层让异构网络互联,所谓异构就是指传输介质、数据编码方式、链路控制协议等等可以不同。
      转发和路由选择 通俗说就是选端口、选路由

    2. 在路由器进行互联的多个局域网结构中,要求每个局域网()
      C.物理层、数据链路层、网络层协议可以不同,而网络层以上的高层协议必须相同

    3. 下列设备中,能够分隔广播域的是()
      A. 集线器 B. 交换机 C.路由器 D.中继器
      注:所谓冲突域,就是看是否能够同时处理多个输入信息;广播域就是看遇到广播信号是否会转发(不转发则可分隔
      集线器、中继器是物理层设备,不能分隔冲突域,更不能分隔广播域;
      交换机、网桥是链路层设备,能分隔冲突域,但不能分隔广播域;
      路由器属于网络层设备,既能分隔冲突域,也能分隔广播域;

    4. 在因特网中,一个路由器的路由表通常有()
      A.目的网络和到达目的网络的完整路径
      B.所有目的主机和到达该目的主机的完整路径
      C.目的网络和到达该目的网络路径上的下一个路由器的IP地址
      D.目的网络和到达该目的网络的下一个路由器的MAC地址
      注:路由器通常是根据目的地,确定下一跳转发口(IP地址);若没有找到则一般交给默认路由

    5. 路由器在能够开始向输出链路传输分组的第一位之前,必须先接收到整个分组,这种机制叫(存储转发机制
      在这里插入图片描述

    6. 下列协议属于网络层协议的是()
      A.IP,TCP B.TCP,FTP C.FTP,ICMP D.IP,ICMP
      一些常见协议
      在这里插入图片描述
      POP3 和 IMAP是接收邮件;
      BGP/RIP是路由选择协议(前者基于TCP后者UDP),严格划分在应用层
      OSPF也是路由选择协议,基于IP,划分在网络层
      ARP是将IP地址转化为MAC地址,RARP相反将MAC地址转化为IP地址;
      ICMP是网际控制报文协议,允许路由器报告一些差错异常情况,位于网络层;
      PPP是点对点协议;

    7. 动态路由选择和静态路由选择的主要区别是(动态路由选择可随网络的通信量或拓扑变化而进行自适应的调整,而静态路由选择需要手工去调整相关的路由信息,静态路由实现开销更小)

    8. 考虑如图所示的子网,子网采用距离-向量算法,下面的向量刚刚到达路由器C;来自B的向量为(5,0,8,12,6,2);来自D的向量为(16,12,6,0,9,10);来着E为(7,6,3,9,0,4)。经过测量,C到B、D和E的延迟分别为6,3和5,那么C到达所有结点的最短路径是(11,6,0,3,5,8);
      在这里插入图片描述
      注:
      动态路由选择算法有两种:一种为分散式路由选择算法,例如DV(距离-向量算法);一种为全局式路由选择算法,例如LS(链路状态)算法;
      对于LS算法,其要知道整个网络拓扑图,一般结合最短路径算法(如Dijkstra算法、Prim算法),每个结点通过广播与其他所有其他结点交谈,告诉它们与它自己的链路费用
      对于DV算法,不知整体,只知局部,每个结点仅与它直接相连的邻居交谈,告知自己所知道的所有其他结点的费用估计(好消息传得快,坏消息传得慢)
      对于上题,我们已经C到邻居点的费用为6,3,5
      不妨尝试:
      C到B:(5+6,0+6,8+6,12+6,6+6,2+6);
      C到D:(16+3,12+3,6+3,0+3,9+3,10+3);
      C到E:(7+5,6+5,3+5,9+5,0+5,4+5);
      然后去最小的,结果为(11,6,0,3,5,8)(C到自己为0)

    9. 假设R1,R2,R3采用RIP协议,且均收敛,若R3检测到网络上201.2.0/25不可达,并向R2通告一次新的距离向量,则R2更新后,其到达该网络的距离是(3
      在这里插入图片描述
      因特网中所采用的路由选择协议:
      内部网关协议:RIP(基于DV) 和OSPF(有完整拓扑图)
      外部网关协议:EGP、BGP4
      RIP早期定下一条路径的最大费用为15(网络不可达设为16),在RIP中,路由选择更新信息在邻居之间通过RIP响应报文来交换(大约30s交互一次)
      对应上题,R3更新到201.2.0/25为16并通告R2,则R2更新自己的路由,选择从R1走,因为R1还未更新,所以R1还认为201.2.0/25可达为2,所以R2更新为3;(坏消息传的慢)

    10. 题目见下图
      11.
      注:错误的选B,直接交互要求物理上处于同一IP网段(是否具有相同子网地址),直接交给目的主机,无需涉及路由器;如果两台机器不在同一网段,则需要经过路由器转发到下一跳路由,叫间接交互;

    11. 路由器 R 通过以太网交换机 S1 和 S2 连接两个网络,R 的接口、主机 H1 和 H2 的 IP 地址与 MAC 地址如下图所示。若 H1 向 H2 发送 1 个 IP 分组 P,则 H1 发出的封装 P 的以太网 帧的目的 MAC 地址、H2 收到的封装 P 的以太网帧的源 MAC 地址分别是()
      A.00-a1-b2-c3-d4-62, 00-1a-2b-3c-4d-52
      B.00-a1-b2-c3-d4-62, 00-a1-b2-c3-d4-61
      C.00-1a-2b-3c-4d-51, 00-1a-2b-3c-4d-52
      D.00-1a-2b-3c-4d-51, 00-a1-b2-c3-d4-61在这里插入图片描述
      注:
      以太网帧在传输过程中有关其内部MAC地址和IP地址的变化情况:(不考虑NAT情况)
      源IP地址和目的IP地址不会产生变化;
      源MAC地址和目的MAC地址发生变化。

      若考虑NAT,私有IP地址会根据NAT转化表改变;
      “NAT(网络地址转化——内部网络==》外部网络 将一个公网地址 给 多个内网主机使用 转换时IP和端口号都要对应)”
      上题H1一开始为源00-1a-2b-3c-4d-52,目的00-1a-2b-3c-4d-51
      达到R后改变,源00-a1-b2-c3-d4-61,目的00-a1-b2-c3-d4-62 (源MAC变成R与H1相邻端的地址)

    12. 见下图
      在这里插入图片描述
      在这里插入图片描述
      注:选B,协议字段表示携带的数据使用何种协议;A,IPv4有可选字段,可变;D即为TTL,经过一个路由减一;
      IPv4的首部中有两个长度,一个是首部长度(单位为4个字节,占4bit,最大为15 * 4 = 60byte);
      另一个是数据报总长度(8 bit,单位为1byte,最大为28 - 1 byte);
      还有一个叫片偏移,单位为8 byte;

    13. 当数据报到达目的网络后,要传送到目的主机,需要知道IP地址对应的()
      A.逻辑地址 B.动态地址 C.域名 D.物理地址
      注:在数据链路层MAC地址用来表示主机或路由器,数据报到达具体的目的网络后,需要知道目的主机的MAC地址才能被成功送达(到达路由器后,网络层往下要经过链路层、物理层 到达目的主机的物理层再往上),这个转化由ARP完成。

    14. 在IP首部的字段中,与分片和重组无关的字段是()
      A. 总长度 B. 标识 C.标志 D.片偏移
      注:标志、标识、片偏移都与IP分片有关
      标志位为3bit,DF(don’t) 为不可分(=0可分=1不可分),MF(more =0后续无片,=1后续有片);
      标识字段相同,则表示原先属于同一分组,可以重组;
      重组时则根据片偏移判断谁先谁后;
      重组操作一般在目的主机进行(因为中间路程的MTU可能不一样);分组操作中间路程也可以进行(两端MTU不一致就会进行)

    15. 以下关于IP分组分片基本方法描述的,错误的是()
      A.IP分组长度大于MTU,就必须对其进行分片
      B.DF=1,分组长度又超过MTU时,则丢弃该分组,不需要向源主机报告
      C.分片的MF值为1表示接收到的分片不是最后一个分片
      D.属于同一原始IP分组的分片具有相同的标识
      注: B错在不需要,实际上要用ICMP报文向源主机报错

    16. 路由表R0见下,若进入R0的分组的目的地址为132.19.237.5,该分组该被转发到哪一个下一跳()
      A.R1 B.R2 C.R3 D.R4
      在这里插入图片描述
      注:下一跳选匹配程度最高的(前提一定要匹配)
      132.0.0.0/8 匹配132.19.237.5的前八位,符合
      132.0.0.0/11 匹配 132.19.237.5的前11位,符合
      132.19.232.0/22 不匹配 132.19.237.5的前22位,不符合,综上选R2,若都不匹配都走R4默认路由

    17. IP协议规定每个C类网络最多可以又多少台主机或路由器(254
      注:ABCDE类地址
      在这里插入图片描述
      在这里插入图片描述
      主机号全0/全1不可分配给普通计算机使用(全0保留、全1为本网络广播地址)
      0.0.0.0 —— 本主机在本网络上的源地址 ;255.255.255.255 有限广播地址;127.0.0.1 环路自检地址,其数据报不会出现在网络上
      A类网络地址的最高位必须是“0”,其中:0.X.X.X保留,127.X.X.X是保留地址(回环地址),用于循环测试用的,所以A的网络号为1~126;
      B类固定10开头,128.0.X.X 保留
      C类固定110开头;192.0.X.X 保留
      D类1110开头,为组播地址 (一般224.?.?.?)
      E类11110开头为保留;
      私有网络:
      在这里插入图片描述

    18. 为了提供更多子网,为一个B类地址指定了子网掩码255.255.240.0,则每个子网最多主机数为(4094
      注:B类地址主机号为16bit,但子网掩码固定了,240为11110000 还需占用4位,所以主机号能用的位为16-4=12,所能用为 212 - 2 = 4094(减去全0和全1)

    19. 在子网192.168.4.0/30中,能接收目的地址为192.168.4.3的IP分组最大主机数是()
      A.0 B.1 C.2 D.4
      注:形如192.168.4.0/30 的写法为CIDR "IP::= {a.b.c.d / x} x指示地址的网络前缀部分"
      对于32-x bit用于标识该组织内部设备(主机号),该组织内所有设备具有相同的网络前缀部分。
      看题,可用主机号位数为2 bit 总共可用主机数为 22 = 4,但是需要注意主机号全为0 或 全为1保留,所以可用主机号为 22 - 2 = 2;而192.168.4.3 是该网络主机号全为1的广播地址,能收到该地址的是所有可用主机,即为2;

    20. 把IP网络划分为子网,这样做的好处是()
      A.增加冲突域的大小
      B.增加主机的数量
      C.减少广播域的大小
      D.增加网络的数量
      注:IP网络确定了网络号后,剩下的位数固定,其组合总数也固定 D错误;
      若将剩下的位数 分一部分给子网号,每个子网的主机号需要 - 2(全0/全1),反而浪费了许多可用组合,B错误;
      A.冲突域与子网划分无关,错误;C.子网划分减小了每个网络的规模,广播域也减小

    21. 某网络的IP地址空间为192.168.5.0/24,采用定长子网划分,子网掩码为255.255.255.248,则该网络中的最大子网数,每个子网内最大可分配地址个数分别为()
      A.32,8 B.32,6 C.8,32 D.8,30
      注:192.168.5.0/24 网络号24bit 而子网号 + 主机号 共8bit
      子网掩码为255.255.255.248得到子网号为5bit,最大子网数为25 = 32,每个子网为 23 - 2 = 6;

    22. 一个主机有两个IP地址,一个地址是192.168.11.25,另一个地址可能是()
      A.192.168.11.0 B.192.168.11.26 C.192.168.13.25 D.192.168.11.24
      注:一个主机可以有多个IP地址,但是必须属于多个逻辑地址(多个子网)
      上题只有C跟192.168.11.25最有可能属于不同的子网

    23. 某主机IP地址为180.80.77.55,子网掩码为255.255.252.0。若该主机向所在子网发送广播分组,则目的地址可以是()
      A.180.80.76.0 B.180.80.76.255 C.180.80.77.255 D.180.80.79.255
      注:题目意思求当前子网的广播地址,255.255.252.0写成二进制 子网号22bit ,后面全补1选D

    24. 设有下列路由:172.18.129.0/24,172.18.130.0/24,172.18.132.0/24和172.18.133.0/24,如果进行路由聚合,能覆盖这4条路由的地址是(172.18.128.0/21
      注:
      路由聚合:就是多个路由找其最大子网号(找不同)
      我们把第三个数二进制展开为 1000 0001、1000 0010、1000 0100、1000 0101发现有公共1000 00xxx 6位 + 前两个数字16位 = 21位

    25. 假设H1与H2的默认网关和子网掩码均分别配置为192.168.3.1和255.255.255.128,H3和H4的默认网关和子网掩码均分别配置为192.168.3.254和255.255.255.128,则下列现象中可能发生的是()
      A. H1不能与H2进行正常IP通信
      B.H2与H4均不能访问Internet
      C.H1不能与H3进行正常IP通信
      D.H3不能与H4进行正常IP通信
      在这里插入图片描述
      注:默认网关(第一跳路由器地址)
      对A来说H1和H2属于同一网段,可以直接交互;对D同样;
      对B来说H2的默认网关跟图上的NAT路由器不一致,无法将私有地址转化为全球地址,无法连接互联网,但是H4的默认网关正常,可以访问Internet;
      对C来说H1与H3不属于同一网段,H1必须先将信息发给默认网关,但是图上配置无,不能正常通信;

    26. 假设连接R1、R2和R3之间的点对点链路使用201.1.3.x/30地址,当H3访问Web服务器S时,R2转发出去的封装HTTP请求报文的IP分组的源IP地址和目的IP地址分别是( )(图还是上一题的图)
      A. 192.168.3. 251,130.18.10.1
      B. 192.168.3. 251,201.1. 3.9
      C. 201.1. 3.8,130.18.10.1
      D. 201.1. 3.10,130.18.10.1
      注:目的IP地址肯定是S(130.18.10.1)考虑CD
      R1、R2和R3之间的点对点链路使用201.1.3.x/30 ,主机号为2bit 对于C 201.1. 3.8, 最后两位为00(主机号全0,不使用排除)选D;

    27. 见下图,选C
      在这里插入图片描述在这里插入图片描述

    28. 下一代因特网核心协议IPv6的地址长度是(128 bit,对应16字节)
      在这里插入图片描述
      补充:IPv6能过提供一些安全保障(QoS保障),无校验和字段(加快路由器处理速度),IP报头40Byte固定,在路由传输过程中不可分片(过大则丢弃)

    29. 以下关于IPv6地址1A22:120D:0000:0000:72A2:0000:0000:00C0的表示中,错误的是( )。
      A.1A22:120D::72A2:0000:0000:00C0
      B.1A22:120D::72A2:0:0:C0
      C.1A22::120D::72A2::00C0
      D.1A22:120D:0:0:72A2::C0
      注:IPv6地址表示:每4位用一个16进制数表示,用冒号分隔每16位
      简化:16位中开头有多个0可省略或用一个0表示;有连续的0值域时可缩写为::

    30. OSPF协议使用()分组来保持与其邻居的连接
      A.Hello B.Keep alive C.SPF D.LSU
      在这里插入图片描述

    31. 以太网组播地址224.215.145.230应该映射到组播MAC地址是(01-00-5E-57-91-E6
      注:以太网组播地址MAC范围前3个固定为 01-00-5E,且后面紧跟第一个bit为0
      组播地址IP为D类地址(前四位为1110),对于D类地址其后23位与MAC地址一 一对应。
      我们得到224.215.145.230的后23位为: 1010111.10010001.11100110
      补上MAC的第一个0 + 1010111.10010001.11100110 然后转化为16进制得出结果。

    32. 下列网络设备中,能够抑制广播风暴的是()
      1.中继器 2.集线器 3.网桥 4.路由器
      注:广播风暴指当前广播数据充斥网络占用大量网络带宽,导致正常业务不能运行
      路由器既能隔离冲突域,又能隔离广播域。

    33. 某网络拓扑如下图所示,路由器R1只有到达子网192.168.1.0/24的路由。为使R1可以将IP分组正确地路由到图中所有的子网,则在R1中需要增加的一条路由(目的网络,子网掩码,下一跳)是()。
      在这里插入图片描述
      A.192.168.2.0 255.255.255.128 192.168.1.1
      B.192.168.2.0 255.255.255.0 192.168.1.1
      C.192.168.2.0 255.255.255.128 192.168.1.2
      D.192.168.2.0 255.255.255.0 192.168.1.2
      注:如图有三个子网,要想只加一条路由便使一个子网同时连接另外两个子网,不妨把另外两个子网路由聚合;
      192.168.2.0 /25 === 1100 0000 1010 1000 0000 0010 0…
      192.168.2.128 /25 = 1100 0000 1010 1000 0000 0010 1…
      得到新的子网为 192.168.2.0 / 24 子网掩码 255.255.255.0 下一跳路由即为R2 192.168.1.2

    能力有限如有差错还望指出~

    展开全文
  • 前5是53,后5不作要求使用 C++ (VC6、VS2003、VS2005、GCC4.1.2、GCC3.2.2)或java(JDK1.6.0)两种语言,题目如下:1.编写一个简单的2人点对点聊天工具,一方利用IP地址和端口连接另一方,可以相互发送文本信息...

    前5题是5选3,后5题不作要求
    使用 C++ (VC6、VS2003、VS2005、GCC4.1.2、GCC3.2.2)或java(JDK1.6.0)两种语言,题目如下:
    1.编写一个简单的2人点对点聊天工具,一方利用IP地址和端口连接另一方,可以相互发送文本信息。
    2.编写一个用于局域网(同一子网)的、没有服务器的、可以多人同时聊天的程序,可以给某个人或者全部人发送文本信息。
    3.编写一个可以计算四则运算(包含括号)程序,比如输入字符串" 1 + 2 * 3 / ( 4 - 5)" ,输出的结果为" -5" 。
    4.模拟一个生产者、消费者问题,自己实现一个支持多线程、有上限的队列,附带测试代码。
    5.编写一个GUI程序。在一个一定长、宽的区域内,随机分布有一定数量的矩形(边与区域的边平行,并且一定在区域内),当鼠标在该区域内任意一点按下左键,找到所有矩形中,某个边到该点的距离最近的那个矩形,并相对其他矩形特殊的显示出来。

    对下列问题,如果不感兴趣,可以略过;如果感兴趣,可以选择性的对一个或者多个问题发表一下自己的认识,看法等等,不要说如何求解。
    1.从前有三座塔,分别命名为X、Y、Z。其中在Z这座塔上,有个一定数量个盘子,比如N个,每个盘子的直径都不相同,并且按自下往上、从大到小排列。现在想把Z塔上的盘子都移动到X塔上,并且移动之后,X塔上盘子的顺序和Z原来的顺序是一样的。在移动过程中,每次只能移动一个盘子;Y也可以放盘子,但是盘子无论放在哪座塔上,盘子必须按自下往上、从大到小排列。
    2.在一个4×4的格子中,放入4个棋子,使得每个棋子相同行、相同列和2个45度斜边上,都没有其它棋子。
    3.在一个圆桌上,放了8个盘子,每2个盘子中间放了一根筷子;每个盘子前站一个人,如果每人都先用左手拿起左边的筷子,再去拿右边的筷子,因为他右边的筷子已经被他右边的人用左手拿起了,所以他没有办法凑齐一双筷子。如果希望每个人都能在某个时刻可以凑齐一双筷子,该怎么做。
    4.C++中的const只能在编译的时候限制为常量,如果想在程序运行的时候,做const的限制,有什么方法没?
    5.C++中,限制一个类的对象实例,只能在堆上分配,或者只能在栈上分配,有什么方法没?

     


    转载请注明出自应届生求职招聘论坛 http://bbs.yingjiesheng.com/,本贴地址:http://bbs.yingjiesheng.com/thread-237469-1-1.html

     

     

    转载于:https://www.cnblogs.com/jeekun/archive/2010/11/08/1871476.html

    展开全文
  • 3、载入题库,随机抽取题目支持【单选题,多选题,判断题】 4、自定义题目数量与题目分值,题目都是随机但数量不变总分不变 5、在线实时查看总体得分情况,可导出excel 6、适应场景: 各类考试答题等 7、提示:...

    TopQB答题系统

    2020/01/05
    @pingfan

    功能:
        1、多人同时答题系统
        2、在线查看个人得分与答题情况(解析)
        3、载入题库,随机抽取题目支持【单选题,多选题,判断题】
        4、自定义题目数量与题目分值,题目都是随机但数量不变总分不变
        5、在线实时查看总体得分情况,可导出excel
        6、适应场景: 各类考试答题等
        7、提示: 
            1、不需要外网,任意内网(局域网)机器运行均可,也可单机运行使用
            2、无毒,请添加信任
            3、系统要求: 64位win7、win10(当然linux是最好的)
    使用说明:
        1、题库模板位于【static】->【qb.xlsx】题目索引值不可重复
        2、运行app.exe
        3、查看本机ip地址
        4、访问:
            1、答题地址:
                http://【本机ip】:9999
                如:http://192.168.1.2:9999
            2、设置地址:
                http://【本机ip】:9999/config
            3、得分地址:
                http://【本机ip】:9999/results
            4、管理地址:
                http://【本机ip】:9999/admin
        5、答题前请设置题目数量,题目得分
        6、实时查看总体得分情况刷新成绩页面即可

    ==========================================================================================

    管理页面

    设置页面

    成绩汇总页面

    答题页面

    解析页面

    ==========================================================================================

    小小flask项目,就几个路由系统,没使用蓝图。

    完整目录结构

    不使用数据库,轻应用读取excel中的题目缓存到内存中

    需要一个excel.xlsx(2007以上的题库模板)放置到目录的static文件夹中命名为【qb.xlsx】(读取的是第一个工作表)

    ==========================================================================================

    只依赖flask,提升并发的(协程)gevent库,以及pfExcel(基于openpyxl的封装)用于读取excel中的数据(前面的博客有提到)

    前端没有使用任何框架,js都是原生

    以下是依赖库的安装

    # 安装flask
    pip install flask
    
    # 安装gevent
    pip install gevent
    
    # 安装openpyxl
    pip install openpyxl

    部署就是一个(pyinstaller库编译app.py)exe执行文件

    # 安装pyinstaller
    pip install pyinstaller
    # 编译app.py
    
    pyinstaller -F -i 你的logo文件.ico app.py

    以下是pyExcel.py源码
     

    """
    基于openpyxl的excel读写模块
    提供更简单的读写方式
    """
    from openpyxl import load_workbook, Workbook
    
    
    class ExcelWork:
    
        def __init__(self, filePath):
            """
            初始化, 加载excel,默认选择第一个工作表
            :param filePath: str: 文件地址
            """
            self.filePath = filePath
            try:
                # 加载excel
                self.excel = load_workbook(self.filePath)
            except FileNotFoundError:
                # 创建excel
                self.excel = Workbook(self.filePath)
                # 创建sheet
                self.createSheet('Sheet1')
                # 保存excel
                self.close()
                # 加载excel
                self.excel = load_workbook(self.filePath)
            # sheet设置为第一个工作表
            self.sheet = self.excel.active
    
        def close(self):
            """
            保存并退出
            :return:
            """
            self.excel.save(self.filePath)
    
        def createSheet(self, sheetName):
            """
            创建工作表
            :param sheetName: str: 工作表名
            :return:
            """
            self.excel.create_sheet(sheetName)
    
        def getSheetTitle(self):
            """
            获取当前工作表名称
            :return:  str: 工作表名称
            """
            return self.sheet.title
    
        def getSheetTitles(self):
            """
            获取excel所有工作表的名称
            :return:  list: [工作表名称,]
            """
            return self.excel.sheetnames
    
        def delSheet(self):
            """
            删除当前工作表
            :return:
            """
            self.excel.remove(self.sheet)
    
        def selectSheet(self, sheetName):
            """
            选择工作表, 如果没有将创建
            :param sheetName: str: 工作表名
            :return:
            """
            if sheetName in self.getSheetTitles():
                # 选择工作表
                self.sheet = self.excel[sheetName]
            else:
                # 创建工作表
                self.createSheet(sheetName)
                # 选择工作表
                self.sheet = self.excel[sheetName]
    
        def setCell(self, r, c, var):
            """
            修改指定行, 列的单元格内容
            :param r: int: 行数
            :param c: int: 列数
            :param var: str: 修改内容
            :return:
            """
            self.sheet.cell(row=r, column=c, value=var)
    
        def getCell(self, r, c):
            """
            获取指定行, 列的单元格内容
            :param r: int: 行数
            :param c: int: 列数
            :return: str: 单元格内容
            """
            return self.sheet.cell(row=r, column=c).value
    
        def getRow(self, r):
            """
            获取指定行所有数据
            :param r: int: 行数
            :return: list: [数据,]
            """
            rowList = []
            for cell in self.sheet[r]:
                rowList.append(cell.value)
            return rowList
    
        def getColumn(self, c):
            """
            获取指定列所有数据
            :param c: int: 列数
            :return: list: [数据,]
            """
            columnList = []
            for temp in range(1, self.sheet.max_row + 1):
                columnList.append(self.getCell(temp, c))
            return columnList
    

    以下是qb.py源码

    """
    用于操作题库数据
    """
    import socket
    from random import shuffle
    
    from pfExcel import ExcelWork
    
    # 问题设置
    QUESTION_CONFIG = {
        'radioNum': 1,
        'checkboxNum': 1,
        'trueOrFalseNum': 1,
        'radioResult': 1,
        'checkboxResult': 1,
        'trueOrFalseResult': 1
    }
    
    
    def loadQb(qbPath):
        """
        加载题库数据
        :param qbPath: list: 题库地址
        :return: list: [[单选题,], [多选题,], [判断题,]]
        """
        # 单选题列表
        radioList = []
        # 多选题列表
        checkboxList = []
        # 判断题列表
        trueOrFalseList = []
        # 读取excel
        excel = ExcelWork(qbPath)
        # 获取所有数据
        for index, _ in enumerate(excel.getColumn(1)):
            # 每行数据: ['索引', '题型', '题目', '选项A', '选项B', '选项C', '选项D', '选项E', '选项F', '答案']
            rowList = excel.getRow(index + 1)[0:10]
            # 根据题型划分
            if rowList[1] == '单选题':
                radioList.append(rowList)
            elif rowList[1] == '多选题':
                checkboxList.append(rowList)
            elif rowList[1] == '判断题':
                trueOrFalseList.append(rowList)
        return [radioList, checkboxList, trueOrFalseList]
    
    
    def randomQbData(qbData):
        """
        随机题库数据直接改变原始数据
        :param qbData: list: [[单选题,], [多选题,], [判断题,]]
        :return:
        """
        for tempData in qbData:
            # 打乱列表数据的顺序
            shuffle(tempData)
    
    
    def getUserQbData(qbData):
        """
        获取用户题库数据并保存
        :param qbData: list: [[单选题,], [多选题,], [判断题,]]
        :return: list: [[题],]
        """
        radioList = qbData[0][:int(QUESTION_CONFIG['radioNum'])]
        checkboxList = qbData[1][:int(QUESTION_CONFIG['checkboxNum'])]
        trueOrFalseList = qbData[2][:int(QUESTION_CONFIG['trueOrFalseNum'])]
        return radioList + checkboxList + trueOrFalseList
    
    
    def listToStr(dataList):
        """
        将列表中的值提取出来转为字符串
        :param dataList: list
        :return: str
        """
        tempStr = ''
        for temp in dataList:
            tempStr = tempStr + str(temp)
        return tempStr
    
    
    def checkQbData(userQbData):
        """
        检查答案与用户作答数据进行比对为列表添加结果
        :param userQbData: list: [[索引, 题型, 题目, 选项A, 选项B, 选项C, 选项D, 选项E, 选项F, 答案, 用户作答],]
        :return: list: [[索引, 题型, 题目, 选项A, 选项B, 选项C, 选项D, 选项E, 选项F, 答案, 用户作答, 正确|错误],]
        """
        for qb in userQbData:
            # 比对结果
            if qb[9] == qb[10]:
                qb.append('正确')
            else:
                qb.append('错误')
    
    
    def getUserResult(userQbData):
        """
        获取用户成绩
        :param userQbData: list: [[索引, 题型, 题目, 选项A, 选项B, 选项C, 选项D, 选项E, 选项F, 答案, 用户作答, 正确|错误],]
        :return: float: 用户成绩
        """
        result = 0
        for temp in userQbData:
            if temp[-1] == '正确':
                if temp[1] == '单选题':
                    result = result + float(QUESTION_CONFIG['radioResult'])
                elif temp[1] == '多选题':
                    result = result + float(QUESTION_CONFIG['checkboxResult'])
                elif temp[1] == '判断题':
                    result = result + float(QUESTION_CONFIG['trueOrFalseResult'])
        return result
    
    
    def getIp():
        """
        查询本机ip地址
        :return: str: 本机ip
        """
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))
        ip = s.getsockname()[0]
        s.close()
        return ip
    

    以下是app.py源码

    from gevent import monkey
    
    monkey.patch_all()  # 猴子补丁
    
    from gevent import pywsgi
    from copy import deepcopy
    import webbrowser
    
    from flask import Flask, request, render_template, redirect
    from qb import loadQb, randomQbData, getUserQbData, listToStr, checkQbData, getUserResult, getIp, QUESTION_CONFIG
    
    # app实例
    app = Flask(__name__)
    
    """
    缓存
    QB_DATA缓存excel表格题库数据
    USER_QB_DATA缓存用户随机的题库数据
    """
    # 题库数据缓存[[单选题,], [多选题,], [判断题,]]
    QB_DATA = loadQb('static/qb.xlsx')
    # 用户题库数据缓存 {ip: [单选题, 多选题, 判断题],}
    USER_QB_DATA = {}
    # 成绩缓存[[name, class, result],]
    RESULT_DATA = []
    
    # 打开管理页面
    webbrowser.open('http://127.0.0.1:9999/admin')
    
    
    @app.route('/', methods=['GET', 'POST'])
    def question():
        """
        答题|解析
        :return:
        """
        if request.method == 'GET':
            # 深拷贝数据,保证原始数据不被修改
            data = deepcopy(QB_DATA)
            # 随机题库数据
            randomQbData(data)
            # 获取用户题库数据
            userQbData = getUserQbData(data)
            # 缓存用户题库数据 {ip: [[单选题],[多选题],[判断题],],}
            USER_QB_DATA[request.remote_addr] = userQbData
            # 组合数据
            cont = {
                'data': userQbData
            }
            return render_template('question.html', **cont)
        else:
            # 获取用户
            name = request.form.get('name')
            # 获取班级
            qcls = request.form.get('qcls')
            # 获取用户题库缓存数据
            userQbData = USER_QB_DATA[request.remote_addr]
            # 清除用户缓存
            del USER_QB_DATA[request.remote_addr]
            # 用户题库缓存数据后追加用户答题结果
            for qb in userQbData:
                qb.append(listToStr(request.form.getlist(str(qb[0]))))
            # 检查答题结果
            checkQbData(userQbData)
            # 获取成绩
            result = getUserResult(userQbData)
            # 添加成绩缓存
            RESULT_DATA.append([name, qcls, result])
            # 组合数据
            cont = {
                'data': userQbData,
                'name': name,
                'qcls': qcls,
                'result': result
            }
            return render_template('result.html', **cont)
    
    
    @app.route('/admin')
    def admin():
        cont = {
            'url': f'http://{getIp()}:9999'
        }
        return render_template('admin.html', **cont)
    
    
    @app.route('/results')
    def results():
        """
        成绩
        :return:
        """
        cont = {
            'data': RESULT_DATA
        }
        return render_template('results.html', **cont)
    
    
    @app.route('/config', methods=['GET', 'POST'])
    def config():
        """
        设置
        :return:
        """
        if request.method == 'GET':
            cont = {
                'data': QUESTION_CONFIG
            }
            return render_template('config.html', **cont)
        else:
            data = request.form.to_dict()
            for k, v in data.items():
                QUESTION_CONFIG[k] = v
            return redirect('/config')
    
    
    if __name__ == '__main__':
        print('-----答题系统服务已启动-----\n')
        print('-----后台管理-----\n')
        print('http://127.0.0.1:9999/admin\n')
        print('#' * 30)
        server = pywsgi.WSGIServer(('0.0.0.0', 9999), app)
        server.serve_forever()
    

    ==========================================================================================

    前端页面放置到templates文件夹中

    以下是admin.html页面源码

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>答题系统</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            ul {
                list-style: none;
            }
    
            .main {
                width: 800px;
                margin: 0 auto;
                text-align: center;
                overflow: hidden;
            }
    
            .title {
                margin-top: 30px;
                font-size: 30px;
                font-weight: bold;
            }
    
            .info {
                margin-top: 30px;
            }
    
            .info li {
                margin-top: 10px;
            }
    
            .url{
                font-weight: bold;
                margin-top: 30px;
            }
        </style>
    </head>
    <body>
    <div class="main">
        <div class="title">答题系统</div>
        <div class="url">答题地址:{{ url }}</div>
        <ul class="info">
            <li><a href="/config" target="_blank">设置</a></li>
            <li><a href="/results" target="_blank">成绩</a></li>
        </ul>
    </div>
    </body>
    </html>

    以下是config.html源码

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>答题系统</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            ul {
                list-style: none;
            }
    
            .main {
                width: 800px;
                margin: 0 auto;
                text-align: center;
                overflow: hidden;
            }
    
            .title {
                margin-top: 30px;
                font-size: 30px;
                font-weight: bold;
            }
    
            .info {
                margin-top: 30px;
            }
    
            .info li {
                margin-top: 10px;
            }
    
            .sub {
                margin: 20px;
            }
        </style>
    </head>
    <body>
    <div class="main">
        <div class="title">答题系统</div>
        <form action="/config" method="post">
            <ul class="info">
                <li>
                    <label>单选题数量:<input type="text" name="radioNum" value="{{ data['radioNum'] }}"></label>
                </li>
                <li>
                    <label>多选题数量:<input type="text" name="checkboxNum" value="{{ data['checkboxNum'] }}"></label>
                </li>
                <li>
                    <label>判断题数量:<input type="text" name="trueOrFalseNum" value="{{ data['trueOrFalseNum'] }}"></label>
                </li>
                <li>
                    <label>单选题分值:<input type="text" name="radioResult" value="{{ data['radioResult'] }}"></label>
                </li>
                <li>
                    <label>多选题分值:<input type="text" name="checkboxResult" value="{{ data['checkboxResult'] }}"></label>
                </li>
                <li>
                    <label>判断题分值:<input type="text" name="trueOrFalseResult"
                                        value="{{ data['trueOrFalseResult'] }}"></label>
                </li>
            </ul>
            <div class="sub"><input type="submit" value="设置"></div>
        </form>
    </div>
    </body>
    </html>

    以下是results.html源码

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>答题系统</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            ul {
                list-style: none;
            }
    
            .main {
                width: 800px;
                margin: 0 auto;
                text-align: center;
                overflow: hidden;
            }
    
            .title {
                margin-top: 30px;
                font-size: 30px;
                font-weight: bold;
            }
    
            .get {
                margin-top: 20px;
            }
            .result{
                width: 400px;
                margin: 20px auto;
            }
        </style>
    </head>
    <body>
    <div class="main">
        <div class="title">答题系统</div>
        <div class="get">
            <button onclick="copyTable()">导出</button>
        </div>
        <table class="result">
            <tr>
                <td>姓名</td>
                <td>班级</td>
                <td>成绩</td>
            </tr>
            {% for tempList in data %}
                <tr>
                    {% for temp in tempList %}
                        <td>{{ temp }}</td>
                    {% endfor %}
                </tr>
            {% endfor %}
        </table>
    </div>
    <script>
        //将table中的数据放置粘贴板
        function copyTable() {
            //获取table数据
            let data = '';
            let tb = document.getElementsByTagName("table")[0];
            let rows = tb.rows;
            for (let i = 0; i < rows.length; i++) {
                let cells = rows[i].cells;
                for (let j = 0; j < cells.length; j++) {
                    data = data + cells[j].textContent + '\t';
                }
                data = data.slice(0, -1) + '\n';
            }
            data = data.slice(0, -1);
            //将数据添加至粘贴板
            let textArea = document.createElement("textarea");
            textArea.value = data;
            document.body.appendChild(textArea);
            textArea.select();
            try {
                document.execCommand('copy')
            } catch (err) {
                alert('导出失败')
            }
            document.body.removeChild(textArea);
            alert('数据已导出找个表格粘贴吧~')
        }
    </script>
    </body>
    </html>

    以下是question.html源码

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>答题系统</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            ul {
                list-style: none;
            }
    
            .main {
                width: 800px;
                margin: 0 auto;
                text-align: center;
                overflow: hidden;
            }
    
            .title {
                margin-top: 30px;
                font-size: 30px;
                font-weight: bold;
            }
    
            .info {
                margin-top: 30px;
            }
    
            .info li {
                margin-top: 10px;
            }
    
            .question {
                width: 400px;
                margin: 30px auto;
                text-align: left;
            }
    
            .questionType {
                font-size: 18px;
                font-weight: bold;
            }
    
            .questionTitle {
                margin-top: 10px;
                font-size: 18px;
            }
    
            .option {
                margin-top: 10px;
            }
    
            .sub {
                margin: 20px;
            }
        </style>
    </head>
    <body>
    <div class="main">
        <div class="title">答题系统</div>
        <form action="/" method="post">
            <ul class="info">
                <li>
                    <label>姓名:<input type="text" name="name"></label>
                </li>
                <li>
                    <label>班级:<input type="text" name="qcls"></label>
                </li>
            </ul>
            {% for temp in data %}
                {# 判断题型 #}
                {% if temp[1] != '多选题' %}
                    {# ['索引', '题型', '题目', '选项A', '选项B', '选项C', '选项D', '选项E', '选项F', '答案'] #}
                    <ul class="question">
                        <li class="questionType">{{ temp[1] }}</li>
                        <li class="questionTitle">{{ temp[2] }}</li>
                        {% if temp[3] !=None %}
                            <li class="option">
                                <label><input type="radio" name="{{ temp[0] }}" value="A">{{ temp[3] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[4] !=None %}
                            <li class="option">
                                <label><input type="radio" name="{{ temp[0] }}" value="B">{{ temp[4] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[5] !=None %}
                            <li class="option">
                                <label><input type="radio" name="{{ temp[0] }}" value="C">{{ temp[5] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[6] !=None %}
                            <li class="option">
                                <label><input type="radio" name="{{ temp[0] }}" value="D">{{ temp[6] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[7] !=None %}
                            <li class="option">
                                <label><input type="radio" name="{{ temp[0] }}" value="E">{{ temp[7] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[8] !=None %}
                            <li class="option">
                                <label><input type="radio" name="{{ temp[0] }}" value="F">{{ temp[8] }}</label>
                            </li>
                        {% endif %}
                    </ul>
                {% else %}
                    <ul class="question">
                        <li class="questionType">{{ temp[1] }}</li>
                        <li class="questionTitle">{{ temp[2] }}</li>
                        {% if temp[3] !=None %}
                            <li class="option">
                                <label><input type="checkbox" name="{{ temp[0] }}" value="A">{{ temp[3] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[4] !=None %}
                            <li class="option">
                                <label><input type="checkbox" name="{{ temp[0] }}" value="B">{{ temp[4] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[5] !=None %}
                            <li class="option">
                                <label><input type="checkbox" name="{{ temp[0] }}" value="C">{{ temp[5] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[6] !=None %}
                            <li class="option">
                                <label><input type="checkbox" name="{{ temp[0] }}" value="D">{{ temp[6] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[7] !=None %}
                            <li class="option">
                                <label><input type="checkbox" name="{{ temp[0] }}" value="E">{{ temp[7] }}</label>
                            </li>
                        {% endif %}
                        {% if temp[8] !=None %}
                            <li class="option">
                                <label><input type="checkbox" name="{{ temp[0] }}" value="F">{{ temp[8] }}</label>
                            </li>
                        {% endif %}
                    </ul>
                {% endif %}
            {% endfor %}
            <div class="sub"><input type="submit" value="提交"></div>
        </form>
    </div>
    </body>
    </html>

    以下是result.html源码

    <!DOCTYPE html>
    <html lang="zh">
    <head>
        <meta charset="UTF-8">
        <title>答题系统</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
    
            ul {
                list-style: none;
            }
    
            .main {
                width: 800px;
                margin: 0 auto;
                text-align: center;
                overflow: hidden;
            }
    
            .title {
                margin-top: 30px;
                font-size: 30px;
                font-weight: bold;
            }
    
            .info {
                margin-top: 30px;
            }
    
            .info li {
                margin-top: 10px;
            }
    
            .result {
                font-size: 18px;
                font-weight: bold;
            }
    
            .question {
                width: 400px;
                margin: 30px auto;
                text-align: left;
                padding: 10px;
            }
    
            .questionType {
                font-size: 18px;
                font-weight: bold;
            }
    
            .questionTitle {
                margin-top: 10px;
                font-size: 18px;
            }
    
            .option {
                margin-top: 10px;
            }
        </style>
    </head>
    <body>
    <div class="main">
        <div class="title">答题系统</div>
        <ul class="info">
            <li>
                <label class="result">得分:{{ result }}</label>
            </li>
            <li>
                <label>姓名:{{ name }}</label>
            </li>
            <li>
                <label>班级:{{ qcls }}</label>
            </li>
        </ul>
        {% for temp in data %}
            {# 判断题型 #}
            {# ['索引', '题型', '题目', '选项A', '选项B', '选项C', '选项D', '选项E', '选项F', '答案', '用户作答', '正确|错误'] #}
            <ul class="question">
                <li class="questionType">{{ temp[1] }}</li>
                <li class="questionTitle">{{ temp[2] }}</li>
                {% if temp[3] !=None %}
                    <li class="option">
                        <label>{{ temp[3] }}</label>
                    </li>
                {% endif %}
                {% if temp[4] !=None %}
                    <li class="option">
                        <label>{{ temp[4] }}</label>
                    </li>
                {% endif %}
                {% if temp[5] !=None %}
                    <li class="option">
                        <label>{{ temp[5] }}</label>
                    </li>
                {% endif %}
                {% if temp[6] !=None %}
                    <li class="option">
                        <label>{{ temp[6] }}</label>
                    </li>
                {% endif %}
                {% if temp[7] !=None %}
                    <li class="option">
                        <label>{{ temp[7] }}</label>
                    </li>
                {% endif %}
                {% if temp[8] !=None %}
                    <li class="option">
                        <label>{{ temp[8] }}</label>
                    </li>
                {% endif %}
                <li class="option">
                    <label>答案是:{{ temp[9] }}</label>
                </li>
                <li class="option">
                    <label>您选择的是:{{ temp[10] }}</label>
                </li>
                <li class="option">
                    <label class="color">判定结果:{{ temp[11] }}</label>
                </li>
            </ul>
        {% endfor %}
    </div>
    <script>
        let a = document.getElementsByClassName('color')
        for (let i = 0; i < a.length; i++) {
            //父类
            let p = a[i].parentNode.parentNode
            if (a[i].innerText === '判定结果:错误') {
                p.style.backgroundColor = 'LightCoral'
            } else {
                p.style.backgroundColor = 'SpringGreen'
            }
        }
    </script>
    </body>
    </html>

    将源码按照文件名保存,运行编译都可以(进行过真实环境测试,效果还可以,写的啰嗦求大佬指正,互相学习!

    当然也可以直接拿来用,用的便捷用的完成要求啦,麻烦点个赞哈~~

    以下是pyinstaller编译后的目录 9.9M多一点点,够小了没有通过pyinstaller把静态文件与模板打包到exe中(其实是可以的但不利于直接修改模板题库)

    templates目录

    展开全文
  • 【判断题】静态路由协议有个缺点是配置和维护容易出错【单选题】RC 电路中,充电过程电容电压和放电过程电容电压变化分别为( )【论述题】【判断...【多选题】路由表中必不可少的元素是【多选题】在路由表中的protocol...
  • 多选题】大数据的特征包括( )。【判断题】中断服务过程中如果允许中断嵌套,则优先级高的设备可以中断优先级低的设备的中断服务。【多选题】大数据计算体系包括()。【多选题】HDFS 体系结构主要包括()。【判断题】...
  • 多选题】假设某证券在 20 元处遇到阻力回落,根据黄金分割线的原理,我们可以判断,股价下跌途中可能会在 ( ) 价位获得支撑【多选题】在Excel中可选取().【判断题】设置配送中心的位置,并确定各配送中心的服务市场,...
  • 【单选题】狭义的WLAN,是指采用IEEE( )无线技术进行互连的通信网络 。...【多选题】发酵过程控制因素有哪些?【阅读理解】Read the emails and choose the best answer.【单选题】无线局域网采用Wi-Fi...
  • 【判断题】卤素灯泡是在灯泡内充入氟、氯等卤素气体。【单选题】我国刑法第12条关于溯及力的规定采取的是( )。【填空题】本地局域网 LAN 内, () 和无绳电话速率较低,主流带宽是 100kbps ,...【多选题】关于网络图绘...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

局域网多选题