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,希望 ...
随机推荐
- 调用phprpc的时候出现Fatal error: Cannot redeclare gzdecode()
出现这个问题的原因是:php在5.4版本后,已经自包含了gzdecode()函数,开发者自己定义的gzdecode()函数会与其冲突. 在 ....\phpRPC\compat.php文件的第72行( ...
- php隔行换色输出表格
<?php header("Content-type:text/html;charset=utf-8"); $str=''; $str.='<table border= ...
- jquery按钮倒计时
<html> <head> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"> ...
- 去掉CI框架默认url中的index.php
1:.htaccess //放置在根目录下,和入口文件index.php的同级目录<IfModule mod_rewrite.c>RewriteEngine onRewriteCond % ...
- 【Android Developers Training】 26. 在SQL数据库中保存数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 基于邮件系统的远程实时监控系统的实现 Python版
人生苦短,我用Python~ 界内的Python宣传标语,对Python而言,这是种标榜,实际上,Python确实是当下最好用的开发语言之一. 在相继学习了C++/C#/Java之后,接触Python ...
- DOCKER 从入门到放弃(三)
使用docker create [image-name] 创建一个容器 创建一个nginx镜像的容器,由于没有指定各项参数,容器实用默认参数,创建后并不会启动,并将容器的ID输出到终端,如果本地没有镜 ...
- Jenkins的安装配置
Jenkins的安装配置 一.Jenkins简介 Jenkins 是一个可扩展的持续集成引擎.Jenkins可以帮我们将代码进行统一的编译打包.还可以放到tomcat容器中进行发布.简单来说就是我们通 ...
- Java 异常处理笔记
Java程序运行过程中所发生的异常事件可分为两类: §错误(Error):JVM系统内部错误.资源耗尽等严重情况 §违例(Exception): 其它因编程错误或偶然的外在因素导致的一般性问题,例如: ...
- c#编程-线程同步
线程同步 上一篇介绍了如何开启线程,线程间相互传递参数,及线程中本地变量和全局共享变量区别. 本篇主要说明线程同步. 如果有多个线程同时访问共享数据的时候,就必须要用线程同步,防止共享数据被破坏.如果 ...