python--DenyHttp项目(2)--ACM监考服务器端
服务器端:

#coding:utf-8
'''
ServerGui.py
设置比赛开始时间
设置比赛结束时间
若时间无误启动监听服务
'''
import time
import re
import tkinter as tk
from tkinter import simpledialog
from DenyServer import *
import threading
class ServerGui():
def __init__(self):
'''开始时间,结束时间'''
self.getEndTime = ''
self.getStartTime = ''
'''定义窗口布局'''
self.root = tk.Tk()
self.serverMark = 1
self.root.title('404监考服务器')
self.curWidth = 450
self.curHeight = 85
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)
'''比赛开始时间Button'''
self.setStartTimeButton = tk.Button(self.root,
text='设置比赛开始时间:',
height=1,width=15,padx=8,pady=1,
font=("Arial",14),
command=self.setStartTime)
self.startTimeLable = tk.Label(self.root,text='00:00:00',font=("Arial",20))
self.setStartTimeButton.grid(row=0,column=0,stick=tk.E)
self.startTimeLable.grid(row=0,column=1,stick=tk.W)
'''比赛结束时间Button'''
self.setTimeButton = tk.Button(self.root,
text='设置比赛结束时间:',
height=1,width=15,padx=8,pady=1,
font=("Arial",14),
command=self.setEndTime)
self.timeLable = tk.Label(self.root,text='00:00:00',font=("Arial",20))
self.setTimeButton.grid(row=1,column=0,stick=tk.E)
self.timeLable.grid(row=1,column=1,stick=tk.W)
'''启动服务器'''
if self.serverMark:
self.threadStartServerServices = threading.Thread(target=self.checkTimeAndLocaltion)
self.threadStartServerServices.start()
self.root.mainloop()
'''检查时间是否设置'''
def checkTimeAndLocaltion(self):
while True:
if self.getEndTime != '' and self.getStartTime != '':
self.serverStart()
break
time.sleep(1)
'''设置比赛开始时间'''
def setStartTime(self):
ch = simpledialog.askstring("比赛开始时间:", "时间格式例如:2017-07-12 00:00:15")
pattern=re.compile(r'(\d{4}-\d{2}-\d{2})((\s\d{2}:\d{2}:\d{2}|))')
try:
s = pattern.search(ch).group()
self.getStartTime = s
self.startTimeLable.configure(text=s)
except AttributeError:
tk.messagebox.showerror('警告', "格式错误")
self.setStartTime()
except TypeError:
pass
'''设置比赛结束时间'''
def setEndTime(self):
ch = simpledialog.askstring("比赛结束时间:", "时间格式例如:2017-07-12 00:00:15")
pattern=re.compile(r'(\d{4}-\d{2}-\d{2})((\s\d{2}:\d{2}:\d{2}|))')
try:
s = pattern.search(ch).group()
self.getEndTime = s
self.timeLable.configure(text=s)
except AttributeError:
tk.messagebox.showerror('警告', "格式错误")
self.setEndTime()
except TypeError:
pass
'''启动服务器端'''
def serverStart(self):
self.serverMark = 0
'''模块接口'''
server = ThreadTCPServer(initServerIp(), TCPHandler)
TCPHandler.startTime = datetime.datetime.strptime(self.getStartTime, "%Y-%m-%d %H:%M:%S")
TCPHandler.endTime = datetime.datetime.strptime(self.getEndTime, "%Y-%m-%d %H:%M:%S")
server_thread = threading.Thread(target=server.serve_forever())
server_thread.daemon = True
server_thread.start()
server_thread.join()
server.shutdown()
if __name__ == '__main__':
servergui = ServerGui()
#coding:utf-8
'''
DenyServer.py
使用socketserver创建一个服务器端(用前辈的模块,不如自己写的灵活,导致很多功能在接口处卡死)
'''
from socket import *
import threading
import socketserver
import datetime
import logging
from DenyItem.ServerGui import *
class TCPHandler(socketserver.BaseRequestHandler):
'''处理request请求'''
def handle(self):
self.BUFSIZE = 1024
self.version = '
self.clientIP = []
'''获取request数据并删除头尾空格'''
self.data = self.request.recv(self.BUFSIZE).strip().decode('utf-8')
self.senddata = ''
'''配置日志格式'''
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s :%(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename='Serverlog.log',
filemode='a')
'''记录日志'''
logging.info("{} send:" .format(self.client_address[0]) + str(self.data))
'''响应客户端请求'''
if self.data[0] == 'B':
self.beginTime = self.data[2:]
self.beginTime = datetime.datetime.strptime(self.beginTime,'%Y-%m-%d %H:%M:%S')
if self.endTime == '' :
self.senddata = '
elif self.startTime <= self.beginTime:
self.senddata = '-2'
elif self.beginTime >= self.endTime:
self.senddata = '-1'
else:
self.senddata = self.endTime
elif self.data[0] == 'E':
'''报警模块'''
'''BUG,获取IP'''
if self.data[-3] == '.':
self.id = int(self.data[-2:])
logging.error('502 IP:' + str(self.id) + '号,正在作弊!!!')
else:
self.id = int(self.data[-3:]) - 110
logging.error('404:' + str(self.id) + '号,正在作弊!!!')
elif self.data[0] == 'V':
if self.data[-1:] == self.version:
self.senddata = '
else:
self.senddata = '-1'
elif self.data[:2] == 'IP':
'''更新上线列表'''
if self.data[-3] == '.':
'''502IP未定'''
'''502IP未定'''
'''502IP未定'''
logging.info('502 上线:' + self.data[-2:])
else:
logging.info('404 上线:' + str(int(self.data[-3:])-110))
self.request.sendall(str(self.senddata).encode('utf-8'))
class ThreadTCPServer(socketserver.ThreadingMixIn,socketserver.TCPServer):
pass
def initServerIp():
ADDR = HOST, PORT = gethostbyname(gethostname()), 1122
return ADDR
if __name__=='__main__':
server = ThreadTCPServer(initServerIp(), TCPHandler)
TCPHandler.endTime = datetime.datetime.strptime('2017-7-27 20:00:00', "%Y-%m-%d %H:%M:%S")
server_thread = threading.Thread(target=server.serve_forever())
server_thread.daemon = True
server_thread.start()
server_thread.join()
server.shutdown()
python--DenyHttp项目(2)--ACM监考服务器端的更多相关文章
- 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实战项目列表,不但有用还有趣,最主要的是咱们实验楼不但有详细的开发教程,更有在线开发环 ...
- 使用Nginx+Uwsgi部署Python Flask项目
第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...
- 机器学习 Top 20 Python 开源项目
转自:http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=2652565022&idx=1&sn=9aa035097120 ...
- python实战===2017年30个惊艳的Python开源项目 (转)
本文转自:http://www.sohu.com/a/216723120_115128 摘要:本文来自Mybridge,介绍了过去一年里30个惊艳的Python开源项目.点击每一个都可以在GitHub ...
- 10大Python开源项目推荐(Github平均star2135)
翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望 ...
随机推荐
- Example002定时打开窗口
<!--实例002定时打开窗口--> <script> // 3秒后弹出窗口: function time() { window.open("index.html&q ...
- php下redis的安装教程
1.得有php的环境,推荐使用appserv,下载链接 链接: http://pan.baidu.com/s/1cHqSOY 密码: b8w2 2.安装redis 下载链接 链接: http://pa ...
- 4.Smarty模板之间调用
{include file="header.tpl" name="cai"}
- Linux进程/内核模型
内核必须实现一组服务和相应的接口,应用程序则可以使用这些接口,而不是直接与硬件打交道. Linux内核主要由以下5个子系统组成:进程调度.内存管理.虚拟文件系统.进程间通信以及设备驱动. 在这个组成中 ...
- maven仓库--搭建局域网私服(windows版)
使用nexus搭建局域网私服 一. 认识maven仓库 1.1 maven仓库的作用 回想之前不用maven的时候,我们用eclipse原始的项目骨架构建项目时,在工程目录下往往有一个lib文件夹 ...
- VB6之HTTP服务器的实现(二)
接上篇,这次做了小小的改动和提升.增加了对POST的支持和对其他方法(GET和POST之外的)选择405回复.另外,增加了对CGI的支持,目前可以使用C语言来写(是不是好蠢的赶脚).相对于上篇,整体做 ...
- VB6之多维数组中元素在内存中的排列情况
Private Declare Sub RtlMoveMemory Lib "kernel32" (Destination As Any, Source As Any, ByVal ...
- log 的 debug()、 error()、 info()方法的区别
软件中总免不了要使用诸如 Log4net, Log4j, Tracer 等东东来写日志,不管用什么,这些东东大多是大同小异的,一般都提供了这样5个日志级别: × Debug × Info ...
- JAVA金额按比例分摊,零头处理
金额精确计算,必须使用BigDecimal; 平均分摊,分摊的零头,一般都是由数据"精度"和分摊系数决定的: 主要是如何对零头进行处理,保证尽可能的平均分配. 1.按户均摊 /** ...
- Java版 QQ空间自动登录无需拷贝cookie一天抓取30WQQ说说数据&流程分析
QQ空间说说抓取难度比较大,花了一个星期才研究清楚! 代码请移步到GitHub GitHub地址:https://github.com/20100507/Qzone [没有加入多线程,希望你可以参与进 ...