python--DenyHttp项目(2)--ACM监考客户端测试版(1阶段完成总结)

  客户端:

‘‘‘
DenyManager.py
调用客户端与客户端界面
‘‘‘
from DenyClient import *
from DenyGui import *

if __name__ == ‘__main__‘:
    clientConncet = DenyHttpClient()
    clientGui = DenyHttpGui()     
#coding=utf-8
‘‘‘
DenyGui.py
客户端的界面
1.倒计时lable
2.签到Button(未实现)
3.开始比赛Button
‘‘‘
import tkinter as tk
import random
import time
import datetime
import sys
import os
‘‘‘ 用messagebox没有下面这句,报错‘‘‘
from tkinter import messagebox#专门加上
from DenyClient import *
from CountTime import *
from tkinter.constants import *
import threading

class DenyHttpGui(object):

    def __init__(self):
        ‘‘‘创建一个实例对象,进行倒计时‘‘‘
        self.changetime = ChangeTime()
        ‘‘‘定义窗口‘‘‘
        self.root = tk.Tk()
        ‘‘‘标题‘‘‘
        self.root.title(‘404监考系统‘)
        ‘‘‘大小‘‘‘
        self.curWidth = 300
        self.curHeight = 100
        ‘‘‘位置‘‘‘
        scnWidth,scnHeight = self.root.maxsize()
        tmpcnf = ‘%dx%d+%d+%d‘%(self.curWidth,self.curHeight,
                                (scnWidth-self.curWidth)/2,(scnHeight-self.curHeight)/2)
        self.root.geometry(tmpcnf)
        self.root.resizable(False, False)
        ‘‘‘倒计时Frame‘‘‘
        self.frameTop = tk.Frame(self.root,height=45,width=300)
        ‘‘‘Button Frame‘‘‘
        self.frameBottom = tk.Frame(self.root,height=55,width=300)
        ‘‘‘把Button顶上去‘‘‘
        self.frameDemo = tk.Frame(self.root,height=10)

        self.frameTop.pack(side=tk.TOP)
        self.frameBottom.pack(side=tk.TOP)
        self.frameDemo.pack(side=tk.TOP)
        ‘‘‘定义倒计时属性‘‘‘
        self.decTimeLable = tk.Label(self.frameTop,text=‘正在连接服务器...‘,font=("Arial",20))
        self.decTimeLable.pack(side=tk.TOP)
        ‘‘‘定义签到Button‘‘‘
        tk.Button(self.frameBottom,
               text=‘签到‘,
               height=1,width=8,padx=8,pady=8,
               font=("Arial",14),
               command=self.check).pack(side=tk.LEFT)
        ‘‘‘定义比赛Button‘‘‘
        self.BEGIN = tk.Button(self.frameBottom,
                           text=‘比赛开始‘,
                           height=1,width=8,padx=8,pady=8,
                           font=("Arial",14),
                           command=self.startButton)
        self.BEGIN.pack(side=tk.RIGHT)
        self.decTimeLable.pack()
        self.root.mainloop()
    ‘‘‘开始比赛,启动客户端服务‘‘‘
    def startButton(self):
        self.BEGIN.config(state=‘disable‘)
        denyhttpclinet = DenyHttpClient()
        threadQueryTime = threading.Thread(target=denyhttpclinet.queryTime)
        threadQueryTime.start()
        ‘‘‘下面这句,为了刷新Button状态为不可点击状态‘‘‘
        tk.messagebox.showwarning(‘警告‘, ‘正在连接服务器...‘)
        threadQueryTime.join()
        ‘‘‘进行版本更新‘‘‘
        ‘‘‘线程之间用returnval传递值‘‘‘
        if denyhttpclinet.returnval == 1:
            self.decTimeLable.configure(text=‘正在检查版本信息...‘)
            threadCheckTime = threading.Thread(target=denyhttpclinet.checkVersion)
            threadCheckTime.start()
            threadCheckTime.join()

            print(denyhttpclinet.versionRight)
            if denyhttpclinet.versionRight == 1:
                self.decTimeLable.configure(text=‘00:00:00‘)
                tk.messagebox.showwarning(‘警告‘, ‘当前为最新版本!‘)
            else:
                tk.messagebox.showwarning(‘警告‘, ‘版本更新!\n请联系管理员‘)
                sys.exit()
            threadContest = threading.Thread(target=denyhttpclinet.startContest)
            threadContest.start()
        elif denyhttpclinet.returnval == 0:
            self.decTimeLable.configure(text=‘比赛尚未开始!‘)
        elif denyhttpclinet.returnval == -2:
            self.decTimeLable.configure(text=‘比赛已经开始!‘)
        else:
            self.decTimeLable.configure(text=‘比赛已结束!‘)
        if denyhttpclinet.endTime !=‘‘ and denyhttpclinet.now != ‘‘:
            self.totaltime = (denyhttpclinet.endTime - datetime.datetime.strptime(denyhttpclinet.now, "%Y-%m-%d %H:%M:%S")).seconds
            self.changetime = ChangeTime(self.totaltime)
            threadDecTime = threading.Thread(target=self.textadd())
            threadDecTime.start()
    ‘‘‘改变Button状态‘‘‘
    def buttonNormal(self,sleepTime):
        while self.mark:
            if self.mark :
                self.BEGIN.config(state=‘normal‘)
            time.sleep(1)
    def check(self):
        tk.messagebox.showwarning(‘警告‘, ‘待更新‘)
    ‘‘‘刷新倒计时‘‘‘
    def textadd(self):
        t = self.changetime.subTime()
        if t == ‘00:00:00‘:
            self.BEGIN.config(state=‘normal‘)
            self.decTimeLable.configure(text=‘比赛结束!‘)#这个修改lable值
            return
        self.decTimeLable.configure(text=‘距比赛结束: ‘+t)
        self.decTimeLable.after(1000, self.textadd)

if __name__==‘__main__‘:
    Demo = DenyHttpGui()
    Demo.startGui()
#coding:gbk
‘‘‘
DenyClient.py
客户端与服务器端的操作
1.连接服务器
2.监听端口
3.查询比赛时间
4.监听本地网络连接状态
5.违规报警
‘‘‘
from socket import *
import time
import datetime
from ClientOperate import *
import threading
import subprocess
import multiprocessing

class DenyHttpClient():
    def __init__(self):
        ‘‘‘服务器套接字‘‘‘
        self.HOST = ‘10.251.234.141‘
        self.PORT = 1122
        self.ADDR = (self.HOST, self.PORT)
        ‘‘‘数据包大小‘‘‘
        self.BUFSIZE = 1024
        self.now = ‘‘
        ‘‘‘比赛结束时间‘‘‘
        self.endTime = ‘‘
        ‘‘‘线程之间传值‘‘‘
        self.returnval = 0
        ‘‘‘版本号‘‘‘
        self.versionRight = 0
    ‘‘‘检查版本‘‘‘
    def checkVersion(self):
        msg = ‘V:0‘
        self.listener(msg)
        if self.getdata == ‘1‘:
            self.versionRight =  1
        elif self.getdata == ‘-1‘:
            self.versionRight =  -1

    ‘‘‘查询比赛时间,确认连接‘‘‘
    def queryTime(self):
        if os.system(‘ping ‘ + self.HOST):
            print(‘无法连接到目标主机!‘)
            return
        self.now = datetime.datetime.strftime(datetime.datetime.now(), "%Y-%m-%d %H:%M:%S")
        msg = ‘B:‘ + str(self.now)
        try:
            if self.listener(msg):
                msg = ‘IP:‘ + gethostbyname(gethostname())
                self.listener(msg)
                self.returnval = 1
                return 1
            elif self.getdata == ‘-1‘:
                print(‘比赛已结束‘)
                self.returnval = -1
                return -1
            elif self.getdata == ‘-2‘:
                self.returnval = -2
                print(‘比赛已经开始‘)
                return -2
            else:
                self.returnval = 0
                return 0
        except ConnectionRefusedError:
            self.returnval = 0
            return 0
        except TimeoutError:
            self.returnval = 0
            return 0
    ‘‘‘开始检测与本地监听‘‘‘
    def startContest(self):
        self.t1 = threading.Thread(target=self.contestBegin)#参数是函数对象
        self.t2 = threading.Thread(target=self.contestEnd)
        self.t1.setDaemon(True)
        self.t2.setDaemon(True)
        self.t1.start()
        self.t2.start()
        self.t1.join()
        self.t2.join()
        return 0
    ‘‘‘监听端口信息‘‘‘
    def listener(self,data):
        self.client = socket(AF_INET,SOCK_STREAM)
        self.client.connect(self.ADDR)

        self.client.send(data.encode(‘utf-8‘))
        print(‘发送消息给%s: %s‘ % (self.HOST, data))
        self.getdata = self.client.recv(self.BUFSIZE)
        self.getdata = self.getdata.decode(‘utf-8‘)
        print(‘接受的消息  %s‘ % (self.getdata))
        if self.getdata == ‘0‘ or self.getdata == ‘-1‘:
            return False
        elif len(self.getdata) > 2:
            self.endTime = datetime.datetime.strptime(self.getdata, "%Y-%m-%d %H:%M:%S")
            return True

    ‘‘‘
    在比赛过程中
    1.执行拒绝HTTP操作
    2.不断检测网络是否联通
    ‘‘‘
    def contestBegin(self):
        Denyfile()
        if not detectnet():
            print(‘success deny http!‘)
        else:
            print(‘failed deny http!‘)
            return
        self.begin = 1
        while self.begin:
            if detectnet():
                print(‘somebody cheating!‘)
                self.listener(‘Error: ‘ + gethostbyname(gethostname()))
            time.sleep(5)

    ‘‘‘检查是否到比赛时间,每隔 剩余时间二分之一检查一次,比赛结束后,恢复网络‘‘‘
    def contestEnd(self):
        print(‘检测比赛结束.......‘)
        while True:
            if self.endTime > datetime.datetime.now():
                sleepTime  = (self.endTime - datetime.datetime.now()).seconds // 2
                if not sleepTime > 5:
                    sleepTime = 2
                time.sleep(sleepTime)
                print(‘contestEnd: 比赛进行中...‘)
            else:
                break
        self.begin = 0
        print(‘contest end!‘)
        Recoverfile()
        if os.system(‘ping www.baidu.com‘) == 1:
            print(‘contest end but recover failed!!!‘)
        else:
            print(‘比赛完美举办!‘)

if __name__ == ‘__main__‘:
    c = DenyHttpClient()
    c.checkVersion()
#     c.startContest()
‘‘‘
ClientOperate.py
对文件的复制,恢复,修改处理
‘‘‘
#coding:gbk
import os
import sys
from subprocess import *

‘‘‘复制Hosts文件,添加禁止访问网址,备份‘‘‘
def Denyfile():

    if not os.path.exists(‘D:\DenyHttp‘):
        os.mkdir(‘D:\DenyHttp‘)
        os.mkdir(r‘D:\DenyHttp\restore‘)    

    hostsName = ‘C:\Windows\System32\drivers\etc\hosts‘
    filename = r‘D:\DenyHttp\hosts‘
    if os.path.exists(r‘D:\DenyHttp\hosts‘) and os.path.exists(r‘D:\DenyHttp\restore\hosts‘):
        print(filename + ‘已存在!‘)
    else:
        print(‘文件不存在,准备复制:‘)
        if not os.system(r‘copy ‘+ hostsName +‘ D:\DenyHttp‘):
            print(‘file remove from ‘ + hostsName + ‘ to ‘ + filename)
        if not os.system(r‘copy ‘+ hostsName + r‘ D:\DenyHttp\restore‘):
            print(‘file remove from ‘ + hostsName + ‘ to D:\DenyHttp\restore‘)

        L = []
        denyNetAddress = getHTTPList(L)
        ‘‘‘添加htttp到文件‘‘‘
        for s in denyNetAddress:
            os.system(‘echo ‘ + s +‘>>‘ + filename)

    ‘‘‘修改hosts文件‘‘‘
    if not os.system(r‘copy D:\DenyHttp\hosts C:\Windows\System32\drivers\etc‘):
        print(‘file hosts has been already discovered!‘)
‘‘‘恢复Hosts文件‘‘‘
def Recoverfile():
    if not os.system(r‘copy D:\DenyHttp\restore\hosts C:\Windows\System32\drivers\etc‘):
        print(‘file hosts has been already recovered!‘)
‘‘‘覆盖Hosts文件后,检查是否成功覆盖,成功后将不能访问特定网址‘‘‘
def detectnet():
    L = []
    denyNetAddress = getNetList(L)
    mark = 1
    for s in denyNetAddress:
        p = Popen(["ping.exe" , s],
                  stdin=PIPE,stdout=PIPE,stderr=PIPE,
                  shell=True)
        out = p.stdout.read()
        if ‘127.0.0.1‘ in str(out):
            mark = 0
    ‘‘‘mark为假不能访问‘‘‘
    if not mark:
        print(‘can\‘t request http‘)
    else:
        print(‘can request http‘)
    return mark
‘‘‘初始化目标网址列表‘‘‘
def getHTTPList(denyNetAddress = []):
    denyNetAddress.append(‘127.0.0.1 www.baidu.com‘)
    denyNetAddress.append(‘127.0.0.1 www.sogou.com‘)
    denyNetAddress.append(‘127.0.0.1 sg.search.yahoo.com‘)
    denyNetAddress.append(‘127.0.0.1 cn.bing.com‘)
    denyNetAddress.append(‘127.0.0.1 www.soso.com‘)
    denyNetAddress.append(‘127.0.0.1 www.cnblogs.com‘)
    denyNetAddress.append(‘127.0.0.1 blog.csdn.net‘)

    return denyNetAddress
def getNetList(denyNetAddress = []):
    denyNetAddress.append(‘www.baidu.com‘)
    denyNetAddress.append(‘www.sogou.com‘)
    denyNetAddress.append(‘sg.search.yahoo.com‘)
    denyNetAddress.append(‘cn.bing.com‘)
    denyNetAddress.append(‘www.soso.com‘)
    denyNetAddress.append(‘www.cnblogs.com‘)
    denyNetAddress.append(‘blog.csdn.net‘)

    return denyNetAddress
if __name__ == ‘__main__‘:
#     Denyfile()
    Recoverfile()
#     print(detectnet())
    

 

#coding:utf-8
‘‘‘
CountTime.py
将秒转化为时间格式进行倒计时
‘‘‘
class ChangeTime():

    def __init__(self,totaltime=0):
        self.sec = totaltime
        self.hour = int(self.sec / 3600)
        self.sec = self.sec % 3600
        self.minute = int(self.sec / 60)
        self.sec = int(self.sec % 60)
    def subTime(self):
        if self.sec > 0:
            self.sec -=  1
        else:
            if self.minute > 0:
                self.minute -= 1
                self.sec = 59
            else:
                if self.hour > 0:
                    self.hour -= 1
                    self.minute = 59
                    self.sec = 59
                else:
                    return ‘0‘
        return str(‘%02d‘ % self.hour) + ‘:‘ + str(‘%02d‘ % self.minute) + ‘:‘ + str(‘%02d‘ % self.sec)
        

 

时间: 2024-10-10 13:25:40

python--DenyHttp项目(2)--ACM监考客户端测试版(1阶段完成总结)的相关文章

python--DenyHttp项目(2)--ACM监考客户端测试版?需求分析

写脚本之前,先写个需求分析 以后会多写一些脚本,会注意这方面的 禁止HTTP请求?需求分析 核心功能: 通过修改Hosts文件,禁止用户访问百度等搜索引擎 实现方法: 通过CMD控制台命令COPY覆盖Hosts文件需求: Server与Client 过程检测与提醒 GUI 倒计时 版本更新 (一) Server与Client 通过调用python中socketServer模块,快捷实现服务器端功能,比赛时间外,访问服务器,提示不在比赛时间.比赛过程中禁止访问服务器. (二) 过程检测与提醒 客户

这4个Python实战项目,让你瞬间读懂Python!

前言 Python 是一种极具可读性和通用性的编程语言.Python 这个名字的灵感来自于英国喜剧团体 Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python 易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择. Python 是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的.随着越来越多地在工业中,被诸如联合太空联盟(NASA 的主要飞机支持承包商)和工业光魔(VFX 和

32个Python爬虫项目让你一次吃到撑

整理了32个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- 微信公众号爬虫.基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典. DouBanSpider [2]- 豆瓣读书爬虫.可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到Excel中,可方便大家筛选搜罗,比如筛选评价人数>1000的高分

4个Python经典项目实战,练手必备哦!

Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择. Python是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的.随着越来越多地在工业中,被诸如联合太空联盟(NASA的主要飞机支持承包商)和工业光魔(VFX 和卢卡斯影业的动画工

干货 | 这4个Python实战项目,让你瞬间读懂Python!

Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置,并且是用相对直接的风格来编写,对错误会提供即时反馈,对初学者而言是个很好的选择. Python是一种多范式语言,也就是说,它支持多种编程风格,包括脚本和面向对象,这使得它适用于通用目的.随着越来越多地在工业中,被诸如联合太空联盟(NASA的主要飞机支持承包商)和工业光魔(VFX 和卢卡斯影业的动画工

超实用python小项目--基于python的手机通讯录二维码生成网站--1、项目介绍和开发环境

这个项目是我做完整的第一个python web项目,对于新手来说,这个项目绝对是一个特别好的练手项目. 起名还是困难,但是自己确实比较烦输入这么长的名字(手机通讯录二维码生成网站)去定义这个网站,所以还是给这个项目起个名字吧,叫什么呢?就叫 "鹅日通讯录"吧(Earth address list). --------------------------------------------------------------------------------------------我是

项目分享九:客户端的异常处理

一.异常的处理 异常处理,是所有程序都应该有的功能,尤其是网络异常,在 APP 更是常见.我们来看看ChiTu Store 是如何处理异常.异常主要分两种情况: 1.服务端引发的异常,也就是服务端返回来的错误信息,当服务端异常后,返回的错误JSON信息为: { Type: 'ErrorObject', Code:'xxxx' } 2.客户端出现的异常,客户端出现的异常,绝大数为网络异常,ChiTu Store 主要处理这类的异常. 我们现在要看一下 ChiTu Store 是如何处理的. 二.重

Android 开源项目 eoe 社区 Android 客户端(转)

本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,采用侧边菜单栏.可以学习一下.点击此处查看 GitHub 上的项目. 今天调试几个开源的 Andriod 项目,像什么 oschina,apolloMod 等等,都跑不起来,nnd 郁闷了,不是这有问题,就是那有问题.尤其是 apolloMod,用了很多三方库,完全跑不起来嘛,最无奈的是 oschina,必须将 API 降到 15,也就是 Android

Android 开源项目 eoe 社区 Android 客户端

本文内容 环境 开源项目 eoe 社区 Android 客户端 本文介绍 eoe 社区 Android 客户端.它是一个开源项目,功能相对简单,菜单采用侧边栏方式.可以学习一下.点击此处查看 GitHub 上的项目. GitHub下载 本地下载 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Android OS 2.2.2 开源项目 eoe 社区 Android 客户端 启动过程,Andro