python--DenyHttp项目(2)--ACM监考客户端测试版(1阶段客户端总结)
客户端:
1.既然脚本是让别人用的,怎么说也得有个界面,(虽然很low)
'''
DenyManager.py
调用客户端与客户端界面
'''
from DenyClient import *
from DenyGui import *
if __name__ == '__main__':
clientConncet = DenyHttpClient()
clientGui = DenyHttpGui()
2.客户端的界面很简单,签到还没写,(构思中...)其实能用的就一个比赛开始的Button

这是后台跑的数据


这个连接服务器的messageBox为了改变比赛开始Button的状态为不可点击

检查版本信息,在确定开始比赛之前检查版本信息,版本不对,更新吧(下个新版的就好了)

之后,开始比赛!

#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)
':
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))
' 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 str('%02d' % self.hour) + ':' + str('%02d' % self.minute) + ':' + str('%02d' % self.sec)
python--DenyHttp项目(2)--ACM监考客户端测试版(1阶段客户端总结)的更多相关文章
- 使用Nginx+Uwsgi部署Python Flask项目
第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...
- 32个Python爬虫项目让你一次吃到撑
整理了32个Python爬虫项目.整理的原因是,爬虫入门简单快速,也非常适合新入门的小伙伴培养信心.所有链接指向GitHub,祝大家玩的愉快~O(∩_∩)O WechatSogou [1]- 微信公众 ...
- Github上的python开源项目
Python开源项目,期待大家和我们一起共同维护 github排名榜单 https://github.com/trending github搜索榜单:https://github.com/search ...
- Pycharm+django新建Python Web项目
这两天初学Python,首先是学习Python语法有PyCharm就可以运行Console程序了,因为是初学所以,尽量写的比较详细,包括参考的资料地址... 1.下载Python,并安装[本文版本 ...
- Python(Django)项目与Apache的管理
(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...
- Python(Django)项目与Apache的管理交互
(开开心心每一天~ ---虫瘾师) Python(Django)项目交给Apache的管理(一) 准备:Django的环境(Python).Apache.Wsgi(必须文件) 首先需要电脑有Pytho ...
- 再一波Python实战项目列表
前言: 近几年Python可谓是大热啊,很多人都纷纷投入Python的学习中,以前我们实验楼总结过多篇Python实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...
- 机器学习 Top 20 Python 开源项目
转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...
- python【项目】:基于socket的FTP服务器
功能要求 1. 用户加密认证 2. 服务端采用 SocketServer实现,支持多客户端连接 3. 每个用户有自己的家目录且只能访问自己的家目录 4. 对用户进行磁盘配额.不同用户配额可不同 5. ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
随机推荐
- Kotlin基本语法和使用
Kotlin 是一个基于 JVM 的新的编程语言,由 JetBrains 开发.与Java相比,Kotlin的语法更简洁.更具表达性,而且提供了更多的特性. Kotlin是使用Java开发者的思维被创 ...
- 解决jenkins下使用HTML Publisher插件后查看html报告显示不正常 以jmeter报告为例
jenkins 配置使用html publisher查看jmeter html报告时,发现显示不全,很多东西显示不了. 项目配置: 查看html报告异常(很多资源无法加载): 控制台查看加 ...
- 利用宏定义实现C++程序在Unix和Win32环境下的通用性
[转] 1.1. 宏定义软件的代码,从跨平台的角度来看,可以分为平台相关的和平台无关的.采用C/C++编写的软件,在进行移植时,平台无关的的代码基本上不需要做大的改动,但平台相关的代码需要做很大的调整 ...
- Chrome控制台使用详解
Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...
- Python3 常用数据类型语法
1.int类型 int类型的数据是没有长度限制的,它的最大长度只与计算机的内存有关. bin(i) 返回二进制表示结果, hex(i) 十六进制, int(i) 整数( ...
- 流行框架angular
---恢复内容开始--- 一.angular是什么 一款非常优秀的前端高级js框架,由谷歌团队负责开发 angular是通过新的属性和表达扩展了html angular可以构建一个单一页面应用程序(s ...
- Makefile学习总结
Makefile用法分析 在linux开发中,应用程序的编译基本都采用GNU的make工具,而make搭配Makefile来实现工程代码的编译,在越是大型复杂的项目中,make的强悍之处越是明 ...
- python编程快速上手之第3章实践项目参考答案
1 #!/usr/bin/env python 2 # coding:utf-8 3 # write by mfyang 4 # collatz.py 5 # 从用户读入一个值,并判断这个值是不是一个 ...
- set-集合功能介绍
叨逼叨:#集合 不可重复的列表 可变类型#1.添加 无则添加有则不操作 不可重复 # se = {'alex','eric','seven'} # se.add('qiqi') # se.add('b ...
- 在Linux上创建Postgresql数据库
由于前一次用默认的配置创建pgsql数据库倒置root的占用率达到97%. 重新创建一次数据库,很多坑又忘了. 创建一个放Data的文件夹,/majestic12/pgsql/data PGDATA ...